Install VNDK snapshot libraries for system build
When BOARD_VNDK_VERSION := <VNDK version>, or PRODUCT_EXTRA_VNDK_VERSIONS includes the needed <VNDK version> list, the prebuilt VNDK libs in prebuilts/vndk/ directory will be installed. Each prebuilt VNDK module uses "vndk_prebuilt_shared" for shared VNDK/VNDK-SP libs. Following is the sample configuration of a vndk snapshot module: vndk_prebuilt_shared { name: "libfoo", version: "27", vendor_available: true, vndk: { enabled: true, }, arch: { arm64: { srcs: ["arm/lib64/libfoo.so"], }, arm: { srcs: ["arm/lib/libfoo.so"], }, }, } The Android.bp for the snapshot modules will be auto-generated by a script. Bug: 38304393 Bug: 65377115 Bug: 68123344 Test: set BOARD_VNDK_VERSION := 27 copy a snapshot for v27 build with make command Change-Id: Ib93107530dbabb4a24583f4d6e4f0c513c9adfec
This commit is contained in:
parent
5760c9a12c
commit
7154928c93
7 changed files with 178 additions and 8 deletions
|
@ -135,6 +135,7 @@ bootstrap_go_package {
|
||||||
"cc/tidy.go",
|
"cc/tidy.go",
|
||||||
"cc/util.go",
|
"cc/util.go",
|
||||||
"cc/vndk.go",
|
"cc/vndk.go",
|
||||||
|
"cc/vndk_prebuilt.go",
|
||||||
|
|
||||||
"cc/cmakelists.go",
|
"cc/cmakelists.go",
|
||||||
"cc/compiler.go",
|
"cc/compiler.go",
|
||||||
|
|
|
@ -632,11 +632,12 @@ func (c *deviceConfig) VendorPath() string {
|
||||||
return "vendor"
|
return "vendor"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *deviceConfig) CompileVndk() bool {
|
func (c *deviceConfig) VndkVersion() string {
|
||||||
if c.config.ProductVariables.DeviceVndkVersion == nil {
|
return String(c.config.ProductVariables.DeviceVndkVersion)
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
return *c.config.ProductVariables.DeviceVndkVersion == "current"
|
|
||||||
|
func (c *deviceConfig) ExtraVndkVersions() []string {
|
||||||
|
return c.config.ProductVariables.ExtraVndkVersions
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *deviceConfig) BtConfigIncludeDir() string {
|
func (c *deviceConfig) BtConfigIncludeDir() string {
|
||||||
|
|
|
@ -192,6 +192,8 @@ type productVariables struct {
|
||||||
|
|
||||||
DeviceKernelHeaders []string `json:",omitempty"`
|
DeviceKernelHeaders []string `json:",omitempty"`
|
||||||
DistDir *string `json:",omitempty"`
|
DistDir *string `json:",omitempty"`
|
||||||
|
|
||||||
|
ExtraVndkVersions []string `json:",omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func boolPtr(v bool) *bool {
|
func boolPtr(v bool) *bool {
|
||||||
|
|
|
@ -348,3 +348,24 @@ func (c *llndkStubDecorator) AndroidMk(ctx AndroidMkContext, ret *android.Androi
|
||||||
fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
|
fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *vndkPrebuiltLibraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
|
||||||
|
ret.Class = "SHARED_LIBRARIES"
|
||||||
|
|
||||||
|
ret.SubName = vndkSuffix + c.version()
|
||||||
|
|
||||||
|
ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
|
||||||
|
c.libraryDecorator.androidMkWriteExportedFlags(w)
|
||||||
|
|
||||||
|
path := c.path.RelPathString()
|
||||||
|
dir, file := filepath.Split(path)
|
||||||
|
stem := strings.TrimSuffix(file, filepath.Ext(file))
|
||||||
|
fmt.Fprintln(w, "LOCAL_STRIP_MODULE := false")
|
||||||
|
fmt.Fprintln(w, "LOCAL_SYSTEM_SHARED_LIBRARIES :=")
|
||||||
|
fmt.Fprintln(w, "LOCAL_USE_VNDK := true")
|
||||||
|
fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+outputFile.Ext())
|
||||||
|
fmt.Fprintln(w, "LOCAL_MODULE_SUFFIX := "+filepath.Ext(file))
|
||||||
|
fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(OUT_DIR)/"+filepath.Clean(dir))
|
||||||
|
fmt.Fprintln(w, "LOCAL_MODULE_STEM := "+stem)
|
||||||
|
})
|
||||||
|
}
|
10
cc/cc.go
10
cc/cc.go
|
@ -1372,7 +1372,7 @@ func vendorMutator(mctx android.BottomUpMutatorContext) {
|
||||||
|
|
||||||
if genrule, ok := mctx.Module().(*genrule.Module); ok {
|
if genrule, ok := mctx.Module().(*genrule.Module); ok {
|
||||||
if props, ok := genrule.Extra.(*VendorProperties); ok {
|
if props, ok := genrule.Extra.(*VendorProperties); ok {
|
||||||
if !mctx.DeviceConfig().CompileVndk() {
|
if mctx.DeviceConfig().VndkVersion() == "" {
|
||||||
mctx.CreateVariations(coreMode)
|
mctx.CreateVariations(coreMode)
|
||||||
} else if Bool(props.Vendor_available) {
|
} else if Bool(props.Vendor_available) {
|
||||||
mctx.CreateVariations(coreMode, vendorMode)
|
mctx.CreateVariations(coreMode, vendorMode)
|
||||||
|
@ -1408,7 +1408,7 @@ func vendorMutator(mctx android.BottomUpMutatorContext) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !mctx.DeviceConfig().CompileVndk() {
|
if mctx.DeviceConfig().VndkVersion() == "" {
|
||||||
// If the device isn't compiling against the VNDK, we always
|
// If the device isn't compiling against the VNDK, we always
|
||||||
// use the core mode.
|
// use the core mode.
|
||||||
mctx.CreateVariations(coreMode)
|
mctx.CreateVariations(coreMode)
|
||||||
|
@ -1419,6 +1419,12 @@ func vendorMutator(mctx android.BottomUpMutatorContext) {
|
||||||
} else if _, ok := m.linker.(*llndkHeadersDecorator); ok {
|
} else if _, ok := m.linker.(*llndkHeadersDecorator); ok {
|
||||||
// ... and LL-NDK headers as well
|
// ... and LL-NDK headers as well
|
||||||
mctx.CreateVariations(vendorMode)
|
mctx.CreateVariations(vendorMode)
|
||||||
|
} else if _, ok := m.linker.(*vndkPrebuiltLibraryDecorator); ok {
|
||||||
|
// Make vendor variants only for the versions in BOARD_VNDK_VERSION and
|
||||||
|
// PRODUCT_EXTRA_VNDK_VERSIONS.
|
||||||
|
mod := mctx.CreateVariations(vendorMode)
|
||||||
|
vendor := mod[0].(*Module)
|
||||||
|
vendor.Properties.UseVndk = true
|
||||||
} else if m.hasVendorVariant() {
|
} else if m.hasVendorVariant() {
|
||||||
// This will be available in both /system and /vendor
|
// This will be available in both /system and /vendor
|
||||||
// or a /system directory that is available to vendor.
|
// or a /system directory that is available to vendor.
|
||||||
|
|
|
@ -172,6 +172,5 @@ func vndkMutator(mctx android.BottomUpMutatorContext) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
140
cc/vndk_prebuilt.go
Normal file
140
cc/vndk_prebuilt.go
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
// Copyright 2017 Google Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package cc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"android/soong/android"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
vndkSuffix = ".vndk."
|
||||||
|
)
|
||||||
|
|
||||||
|
// Creates vndk prebuilts that include the VNDK version.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// vndk_prebuilt_shared {
|
||||||
|
// name: "libfoo",
|
||||||
|
// version: "27.1.0",
|
||||||
|
// vendor_available: true,
|
||||||
|
// vndk: {
|
||||||
|
// enabled: true,
|
||||||
|
// },
|
||||||
|
// export_include_dirs: ["include/external/libfoo/vndk_include"],
|
||||||
|
// arch: {
|
||||||
|
// arm64: {
|
||||||
|
// srcs: ["arm/lib64/libfoo.so"],
|
||||||
|
// },
|
||||||
|
// arm: {
|
||||||
|
// srcs: ["arm/lib/libfoo.so"],
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
type vndkPrebuiltProperties struct {
|
||||||
|
// VNDK snapshot version that is formated as {SDK_ver}.{Major}.{Minor}.
|
||||||
|
Version string
|
||||||
|
|
||||||
|
// Prebuilt files for each arch.
|
||||||
|
Srcs []string `android:"arch_variant"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type vndkPrebuiltLibraryDecorator struct {
|
||||||
|
*libraryDecorator
|
||||||
|
properties vndkPrebuiltProperties
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *vndkPrebuiltLibraryDecorator) Name(name string) string {
|
||||||
|
return name + vndkSuffix + p.version()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *vndkPrebuiltLibraryDecorator) version() string {
|
||||||
|
return p.properties.Version
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *vndkPrebuiltLibraryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
|
||||||
|
p.libraryDecorator.libName = strings.TrimSuffix(ctx.ModuleName(), vndkSuffix+p.version())
|
||||||
|
return p.libraryDecorator.linkerFlags(ctx, flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *vndkPrebuiltLibraryDecorator) singleSourcePath(ctx ModuleContext) android.Path {
|
||||||
|
if len(p.properties.Srcs) == 0 {
|
||||||
|
ctx.PropertyErrorf("srcs", "missing prebuilt source file")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(p.properties.Srcs) > 1 {
|
||||||
|
ctx.PropertyErrorf("srcs", "multiple prebuilt source files")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return android.PathForModuleSrc(ctx, p.properties.Srcs[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *vndkPrebuiltLibraryDecorator) link(ctx ModuleContext,
|
||||||
|
flags Flags, deps PathDeps, objs Objects) android.Path {
|
||||||
|
if len(p.properties.Srcs) > 0 && p.shared() {
|
||||||
|
// current VNDK prebuilts are only shared libs.
|
||||||
|
return p.singleSourcePath(ctx)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *vndkPrebuiltLibraryDecorator) install(ctx ModuleContext, file android.Path) {
|
||||||
|
if p.shared() {
|
||||||
|
if ctx.Device() && ctx.useVndk() {
|
||||||
|
if ctx.isVndkSp() {
|
||||||
|
p.baseInstaller.subDir = "vndk-sp-" + p.version()
|
||||||
|
} else if ctx.isVndk() {
|
||||||
|
p.baseInstaller.subDir = "vndk-" + p.version()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p.baseInstaller.install(ctx, file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func vndkPrebuiltSharedLibrary() *Module {
|
||||||
|
module, library := NewLibrary(android.DeviceSupported)
|
||||||
|
library.BuildOnlyShared()
|
||||||
|
module.stl = nil
|
||||||
|
module.sanitize = nil
|
||||||
|
library.StripProperties.Strip.None = BoolPtr(true)
|
||||||
|
|
||||||
|
prebuilt := &vndkPrebuiltLibraryDecorator{
|
||||||
|
libraryDecorator: library,
|
||||||
|
}
|
||||||
|
|
||||||
|
module.compiler = nil
|
||||||
|
module.linker = prebuilt
|
||||||
|
module.installer = prebuilt
|
||||||
|
|
||||||
|
module.AddProperties(
|
||||||
|
&prebuilt.properties,
|
||||||
|
)
|
||||||
|
|
||||||
|
return module
|
||||||
|
}
|
||||||
|
|
||||||
|
func vndkPrebuiltSharedFactory() android.Module {
|
||||||
|
module := vndkPrebuiltSharedLibrary()
|
||||||
|
return module.Init()
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
android.RegisterModuleType("vndk_prebuilt_shared", vndkPrebuiltSharedFactory)
|
||||||
|
}
|
Loading…
Reference in a new issue