Merge "Add "apex_vndk" module type"
This commit is contained in:
116
apex/apex.go
116
apex/apex.go
@@ -21,6 +21,7 @@ import (
|
||||
"runtime"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"android/soong/android"
|
||||
"android/soong/cc"
|
||||
@@ -153,6 +154,7 @@ var (
|
||||
"com.android.media": []string{"libbinder"},
|
||||
"com.android.media.swcodec": []string{"libbinder"},
|
||||
"test_com.android.media.swcodec": []string{"libbinder"},
|
||||
"com.android.vndk": []string{"libbinder"},
|
||||
}
|
||||
)
|
||||
|
||||
@@ -185,9 +187,14 @@ func init() {
|
||||
|
||||
android.RegisterModuleType("apex", apexBundleFactory)
|
||||
android.RegisterModuleType("apex_test", testApexBundleFactory)
|
||||
android.RegisterModuleType("apex_vndk", vndkApexBundleFactory)
|
||||
android.RegisterModuleType("apex_defaults", defaultsFactory)
|
||||
android.RegisterModuleType("prebuilt_apex", PrebuiltFactory)
|
||||
|
||||
android.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
||||
ctx.TopDown("apex_vndk_gather", apexVndkGatherMutator).Parallel()
|
||||
ctx.BottomUp("apex_vndk_add_deps", apexVndkAddDepsMutator).Parallel()
|
||||
})
|
||||
android.PostDepsMutators(func(ctx android.RegisterMutatorsContext) {
|
||||
ctx.TopDown("apex_deps", apexDepsMutator)
|
||||
ctx.BottomUp("apex", apexMutator).Parallel()
|
||||
@@ -196,6 +203,51 @@ func init() {
|
||||
})
|
||||
}
|
||||
|
||||
var (
|
||||
vndkApexListKey = android.NewOnceKey("vndkApexList")
|
||||
vndkApexListMutex sync.Mutex
|
||||
)
|
||||
|
||||
func vndkApexList(config android.Config) map[string]*apexBundle {
|
||||
return config.Once(vndkApexListKey, func() interface{} {
|
||||
return map[string]*apexBundle{}
|
||||
}).(map[string]*apexBundle)
|
||||
}
|
||||
|
||||
// apexVndkGatherMutator gathers "apex_vndk" modules and puts them in a map with vndk_version as a key.
|
||||
func apexVndkGatherMutator(mctx android.TopDownMutatorContext) {
|
||||
if ab, ok := mctx.Module().(*apexBundle); ok && ab.vndkApex {
|
||||
if ab.IsNativeBridgeSupported() {
|
||||
mctx.PropertyErrorf("native_bridge_supported", "%q doesn't support native bridge binary.", mctx.ModuleType())
|
||||
}
|
||||
vndkVersion := proptools.StringDefault(ab.vndkProperties.Vndk_version, mctx.DeviceConfig().PlatformVndkVersion())
|
||||
vndkApexListMutex.Lock()
|
||||
defer vndkApexListMutex.Unlock()
|
||||
vndkApexList := vndkApexList(mctx.Config())
|
||||
if other, ok := vndkApexList[vndkVersion]; ok {
|
||||
mctx.PropertyErrorf("vndk_version", "%v is already defined in %q", vndkVersion, other.Name())
|
||||
}
|
||||
vndkApexList[vndkVersion] = ab
|
||||
}
|
||||
}
|
||||
|
||||
// apexVndkAddDepsMutator adds (reverse) dependencies from vndk libs to apex_vndk modules.
|
||||
// It filters only libs with matching targets.
|
||||
func apexVndkAddDepsMutator(mctx android.BottomUpMutatorContext) {
|
||||
if cc, ok := mctx.Module().(*cc.Module); ok && cc.IsVndkOnSystem() {
|
||||
vndkApexList := vndkApexList(mctx.Config())
|
||||
if ab, ok := vndkApexList[cc.VndkVersion()]; ok {
|
||||
targetArch := cc.Target().String()
|
||||
for _, target := range ab.MultiTargets() {
|
||||
if target.String() == targetArch {
|
||||
mctx.AddReverseDependency(mctx.Module(), sharedLibTag, ab.Name())
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Mark the direct and transitive dependencies of apex bundles so that they
|
||||
// can be built for the apex bundles.
|
||||
func apexDepsMutator(mctx android.TopDownMutatorContext) {
|
||||
@@ -253,11 +305,14 @@ func apexUsesMutator(mctx android.BottomUpMutatorContext) {
|
||||
type apexNativeDependencies struct {
|
||||
// List of native libraries
|
||||
Native_shared_libs []string
|
||||
|
||||
// List of native executables
|
||||
Binaries []string
|
||||
|
||||
// List of native tests
|
||||
Tests []string
|
||||
}
|
||||
|
||||
type apexMultilibProperties struct {
|
||||
// Native dependencies whose compile_multilib is "first"
|
||||
First apexNativeDependencies
|
||||
@@ -362,14 +417,17 @@ type apexTargetBundleProperties struct {
|
||||
Android struct {
|
||||
Multilib apexMultilibProperties
|
||||
}
|
||||
|
||||
// Multilib properties only for host.
|
||||
Host struct {
|
||||
Multilib apexMultilibProperties
|
||||
}
|
||||
|
||||
// Multilib properties only for host linux_bionic.
|
||||
Linux_bionic struct {
|
||||
Multilib apexMultilibProperties
|
||||
}
|
||||
|
||||
// Multilib properties only for host linux_glibc.
|
||||
Linux_glibc struct {
|
||||
Multilib apexMultilibProperties
|
||||
@@ -377,6 +435,11 @@ type apexTargetBundleProperties struct {
|
||||
}
|
||||
}
|
||||
|
||||
type apexVndkProperties struct {
|
||||
// Indicates VNDK version of which this VNDK APEX bundles VNDK libs. Default is Platform VNDK Version.
|
||||
Vndk_version *string
|
||||
}
|
||||
|
||||
type apexFileClass int
|
||||
|
||||
const (
|
||||
@@ -475,6 +538,7 @@ type apexBundle struct {
|
||||
|
||||
properties apexBundleProperties
|
||||
targetProperties apexTargetBundleProperties
|
||||
vndkProperties apexVndkProperties
|
||||
|
||||
apexTypes apexPackaging
|
||||
|
||||
@@ -498,6 +562,7 @@ type apexBundle struct {
|
||||
externalDeps []string
|
||||
|
||||
testApex bool
|
||||
vndkApex bool
|
||||
|
||||
// intermediate path for apex_manifest.json
|
||||
manifestOut android.WritablePath
|
||||
@@ -1086,11 +1151,12 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
|
||||
// remove duplicates in filesInfo
|
||||
removeDup := func(filesInfo []apexFile) []apexFile {
|
||||
encountered := make(map[android.Path]bool)
|
||||
encountered := make(map[string]bool)
|
||||
result := []apexFile{}
|
||||
for _, f := range filesInfo {
|
||||
if !encountered[f.builtFile] {
|
||||
encountered[f.builtFile] = true
|
||||
dest := filepath.Join(f.installDir, f.builtFile.Base())
|
||||
if !encountered[dest] {
|
||||
encountered[dest] = true
|
||||
result = append(result, f)
|
||||
}
|
||||
}
|
||||
@@ -1629,18 +1695,9 @@ func (a *apexBundle) androidMkForType(apexType apexPackaging) android.AndroidMkD
|
||||
}}
|
||||
}
|
||||
|
||||
func testApexBundleFactory() android.Module {
|
||||
return ApexBundleFactory(true /*testApex*/)
|
||||
}
|
||||
|
||||
func apexBundleFactory() android.Module {
|
||||
return ApexBundleFactory(false /*testApex*/)
|
||||
}
|
||||
|
||||
func ApexBundleFactory(testApex bool) android.Module {
|
||||
func newApexBundle() *apexBundle {
|
||||
module := &apexBundle{
|
||||
outputFiles: map[apexPackaging]android.WritablePath{},
|
||||
testApex: testApex,
|
||||
}
|
||||
module.AddProperties(&module.properties)
|
||||
module.AddProperties(&module.targetProperties)
|
||||
@@ -1652,6 +1709,39 @@ func ApexBundleFactory(testApex bool) android.Module {
|
||||
return module
|
||||
}
|
||||
|
||||
func ApexBundleFactory(testApex bool) android.Module {
|
||||
bundle := newApexBundle()
|
||||
bundle.testApex = testApex
|
||||
return bundle
|
||||
}
|
||||
|
||||
func testApexBundleFactory() android.Module {
|
||||
bundle := newApexBundle()
|
||||
bundle.testApex = true
|
||||
return bundle
|
||||
}
|
||||
|
||||
func apexBundleFactory() android.Module {
|
||||
return newApexBundle()
|
||||
}
|
||||
|
||||
// apex_vndk creates a special variant of apex modules which contains only VNDK libraries.
|
||||
// If `vndk_version` is specified, the VNDK libraries of the specified VNDK version are gathered automatically.
|
||||
// If not specified, then the "current" versions are gathered.
|
||||
func vndkApexBundleFactory() android.Module {
|
||||
bundle := newApexBundle()
|
||||
bundle.vndkApex = true
|
||||
bundle.AddProperties(&bundle.vndkProperties)
|
||||
android.AddLoadHook(bundle, func(ctx android.LoadHookContext) {
|
||||
ctx.AppendProperties(&struct {
|
||||
Compile_multilib *string
|
||||
}{
|
||||
proptools.StringPtr("both"),
|
||||
})
|
||||
})
|
||||
return bundle
|
||||
}
|
||||
|
||||
//
|
||||
// Defaults
|
||||
//
|
||||
|
Reference in New Issue
Block a user