Merge "Remove no_apex in favor or apex_available"
This commit is contained in:
@@ -19,7 +19,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/google/blueprint"
|
"github.com/google/blueprint"
|
||||||
"github.com/google/blueprint/proptools"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ApexModule is the interface that a module type is expected to implement if
|
// ApexModule is the interface that a module type is expected to implement if
|
||||||
@@ -76,18 +75,11 @@ type ApexModule interface {
|
|||||||
// CreateApexVariations.
|
// CreateApexVariations.
|
||||||
setApexName(apexName string)
|
setApexName(apexName string)
|
||||||
|
|
||||||
// Return the no_apex property
|
|
||||||
NoApex() bool
|
|
||||||
|
|
||||||
// Tests if this module is available for the specified APEX or ":platform"
|
// Tests if this module is available for the specified APEX or ":platform"
|
||||||
AvailableFor(what string) bool
|
AvailableFor(what string) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type ApexProperties struct {
|
type ApexProperties struct {
|
||||||
// Whether this module should not be part of any APEX. Default is false.
|
|
||||||
// TODO(b/128708192): remove this as this is equal to apex_available: [":platform"]
|
|
||||||
No_apex *bool
|
|
||||||
|
|
||||||
// Availability of this module in APEXes. Only the listed APEXes can include this module.
|
// Availability of this module in APEXes. Only the listed APEXes can include this module.
|
||||||
// "//apex_available:anyapex" is a pseudo APEX name that matches to any APEX.
|
// "//apex_available:anyapex" is a pseudo APEX name that matches to any APEX.
|
||||||
// "//apex_available:platform" refers to non-APEX partitions like "system.img".
|
// "//apex_available:platform" refers to non-APEX partitions like "system.img".
|
||||||
@@ -143,10 +135,6 @@ func (m *ApexModuleBase) IsInstallableToApex() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *ApexModuleBase) NoApex() bool {
|
|
||||||
return proptools.Bool(m.ApexProperties.No_apex)
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
availableToPlatform = "//apex_available:platform"
|
availableToPlatform = "//apex_available:platform"
|
||||||
availableToAnyApex = "//apex_available:anyapex"
|
availableToAnyApex = "//apex_available:anyapex"
|
||||||
|
23
apex/apex.go
23
apex/apex.go
@@ -149,15 +149,6 @@ var (
|
|||||||
androidAppTag = dependencyTag{name: "androidApp"}
|
androidAppTag = dependencyTag{name: "androidApp"}
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
whitelistNoApex = map[string][]string{
|
|
||||||
"apex_test_build_features": []string{"libbinder"},
|
|
||||||
"com.android.media.swcodec": []string{"libbinder"},
|
|
||||||
"test_com.android.media.swcodec": []string{"libbinder"},
|
|
||||||
"com.android.vndk": []string{"libbinder"},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
pctx.Import("android/soong/android")
|
pctx.Import("android/soong/android")
|
||||||
pctx.Import("android/soong/java")
|
pctx.Import("android/soong/java")
|
||||||
@@ -1168,10 +1159,6 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
}
|
}
|
||||||
} else if am.CanHaveApexVariants() && am.IsInstallableToApex() {
|
} else if am.CanHaveApexVariants() && am.IsInstallableToApex() {
|
||||||
ctx.ModuleErrorf("unexpected tag %q for indirect dependency %q", depTag, depName)
|
ctx.ModuleErrorf("unexpected tag %q for indirect dependency %q", depTag, depName)
|
||||||
} else if depTag == android.DefaultsDepTag {
|
|
||||||
return false
|
|
||||||
} else if am.NoApex() && !android.InList(depName, whitelistNoApex[ctx.ModuleName()]) {
|
|
||||||
ctx.ModuleErrorf("tries to include no_apex module %s", depName)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1203,16 +1190,6 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
return filesInfo[i].builtFile.String() < filesInfo[j].builtFile.String()
|
return filesInfo[i].builtFile.String() < filesInfo[j].builtFile.String()
|
||||||
})
|
})
|
||||||
|
|
||||||
// check no_apex modules
|
|
||||||
whitelist := whitelistNoApex[ctx.ModuleName()]
|
|
||||||
for i := range filesInfo {
|
|
||||||
if am, ok := filesInfo[i].module.(android.ApexModule); ok {
|
|
||||||
if am.NoApex() && !android.InList(filesInfo[i].moduleName, whitelist) {
|
|
||||||
ctx.ModuleErrorf("tries to include no_apex module %s", filesInfo[i].moduleName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check apex_available requirements
|
// check apex_available requirements
|
||||||
for _, fi := range filesInfo {
|
for _, fi := range filesInfo {
|
||||||
if am, ok := fi.module.(android.ApexModule); ok {
|
if am, ok := fi.module.(android.ApexModule); ok {
|
||||||
|
@@ -102,9 +102,6 @@ func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*andr
|
|||||||
ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory))
|
ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory))
|
||||||
ctx.RegisterModuleType("prebuilt_apex", android.ModuleFactoryAdaptor(PrebuiltFactory))
|
ctx.RegisterModuleType("prebuilt_apex", android.ModuleFactoryAdaptor(PrebuiltFactory))
|
||||||
|
|
||||||
ctx.RegisterModuleType("cc_defaults", android.ModuleFactoryAdaptor(func() android.Module {
|
|
||||||
return cc.DefaultsFactory()
|
|
||||||
}))
|
|
||||||
ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(cc.LibraryFactory))
|
ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(cc.LibraryFactory))
|
||||||
ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(cc.LibrarySharedFactory))
|
ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(cc.LibrarySharedFactory))
|
||||||
ctx.RegisterModuleType("cc_library_headers", android.ModuleFactoryAdaptor(cc.LibraryHeaderFactory))
|
ctx.RegisterModuleType("cc_library_headers", android.ModuleFactoryAdaptor(cc.LibraryHeaderFactory))
|
||||||
@@ -2183,200 +2180,6 @@ func TestApexUsesFailsIfUseVenderMismatch(t *testing.T) {
|
|||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestApexUsesFailsIfUseNoApex(t *testing.T) {
|
|
||||||
// 'no_apex' prevents a module to be included in an apex
|
|
||||||
testApexError(t, `tries to include no_apex module mylib2`, `
|
|
||||||
apex {
|
|
||||||
name: "commonapex",
|
|
||||||
key: "myapex.key",
|
|
||||||
native_shared_libs: ["mylib"],
|
|
||||||
}
|
|
||||||
|
|
||||||
apex_key {
|
|
||||||
name: "myapex.key",
|
|
||||||
public_key: "testkey.avbpubkey",
|
|
||||||
private_key: "testkey.pem",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library {
|
|
||||||
name: "mylib",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
shared_libs: ["mylib2"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library {
|
|
||||||
name: "mylib2",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
no_apex: true,
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
// respect 'no_apex' even with static link
|
|
||||||
testApexError(t, `tries to include no_apex module mylib2`, `
|
|
||||||
apex {
|
|
||||||
name: "commonapex",
|
|
||||||
key: "myapex.key",
|
|
||||||
native_shared_libs: ["mylib"],
|
|
||||||
}
|
|
||||||
|
|
||||||
apex_key {
|
|
||||||
name: "myapex.key",
|
|
||||||
public_key: "testkey.avbpubkey",
|
|
||||||
private_key: "testkey.pem",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library {
|
|
||||||
name: "mylib",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
static_libs: ["mylib2"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library {
|
|
||||||
name: "mylib2",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
no_apex: true,
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
// 'no_apex' can be applied via defaults
|
|
||||||
testApexError(t, `tries to include no_apex module mylib2`, `
|
|
||||||
apex {
|
|
||||||
name: "commonapex",
|
|
||||||
key: "myapex.key",
|
|
||||||
native_shared_libs: ["mylib"],
|
|
||||||
}
|
|
||||||
|
|
||||||
apex_key {
|
|
||||||
name: "myapex.key",
|
|
||||||
public_key: "testkey.avbpubkey",
|
|
||||||
private_key: "testkey.pem",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library {
|
|
||||||
name: "mylib",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
static_libs: ["mylib2"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_defaults {
|
|
||||||
name: "mylib2_defaults",
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
no_apex: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library {
|
|
||||||
name: "mylib2",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
defaults: ["mylib2_defaults"],
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNoApexWorksWithWhitelist(t *testing.T) {
|
|
||||||
|
|
||||||
testApex(t, `
|
|
||||||
apex {
|
|
||||||
name: "myapex",
|
|
||||||
key: "myapex.key",
|
|
||||||
native_shared_libs: ["mylib"],
|
|
||||||
}
|
|
||||||
|
|
||||||
apex_key {
|
|
||||||
name: "myapex.key",
|
|
||||||
public_key: "testkey.avbpubkey",
|
|
||||||
private_key: "testkey.pem",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library {
|
|
||||||
name: "mylib",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
shared_libs: ["mylib2"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_defaults {
|
|
||||||
name: "mylib2_defaults",
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
no_apex: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library {
|
|
||||||
name: "mylib2",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
defaults: ["mylib2_defaults"],
|
|
||||||
}
|
|
||||||
`, func(fs map[string][]byte, config android.Config) {
|
|
||||||
whitelistNoApex = map[string][]string{
|
|
||||||
"myapex": []string{"mylib2"},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNoApexCanBeDependedOnViaStubs(t *testing.T) {
|
|
||||||
ctx, _ := testApex(t, `
|
|
||||||
apex {
|
|
||||||
name: "myapex",
|
|
||||||
key: "myapex.key",
|
|
||||||
native_shared_libs: ["mylib"],
|
|
||||||
}
|
|
||||||
|
|
||||||
apex_key {
|
|
||||||
name: "myapex.key",
|
|
||||||
public_key: "testkey.avbpubkey",
|
|
||||||
private_key: "testkey.pem",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library {
|
|
||||||
name: "mylib",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
shared_libs: ["mylib2"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_library {
|
|
||||||
name: "mylib2",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
shared_libs: ["mylib3"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
stubs: {
|
|
||||||
versions: ["1", "2", "3"],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// this won't be included in "myapex", so 'no_apex' is still valid in this case.
|
|
||||||
cc_library {
|
|
||||||
name: "mylib3",
|
|
||||||
srcs: ["mylib.cpp"],
|
|
||||||
system_shared_libs: [],
|
|
||||||
stl: "none",
|
|
||||||
no_apex: true,
|
|
||||||
}
|
|
||||||
`)
|
|
||||||
|
|
||||||
module := ctx.ModuleForTests("myapex", "android_common_myapex")
|
|
||||||
apexRule := module.Rule("apexRule")
|
|
||||||
copyCmds := apexRule.Args["copy_commands"]
|
|
||||||
|
|
||||||
ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
|
|
||||||
ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
|
|
||||||
ensureNotContains(t, copyCmds, "image.apex/lib64/mylib3.so")
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
|
func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
|
||||||
testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
|
testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
|
||||||
apex {
|
apex {
|
||||||
|
6
cc/cc.go
6
cc/cc.go
@@ -552,8 +552,10 @@ func (c *Module) Init() android.Module {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
android.InitAndroidArchModule(c, c.hod, c.multilib)
|
android.InitAndroidArchModule(c, c.hod, c.multilib)
|
||||||
android.InitApexModule(c)
|
|
||||||
android.InitDefaultableModule(c)
|
android.InitDefaultableModule(c)
|
||||||
|
|
||||||
|
android.InitApexModule(c)
|
||||||
android.InitSdkAwareModule(c)
|
android.InitSdkAwareModule(c)
|
||||||
|
|
||||||
return c
|
return c
|
||||||
@@ -2229,8 +2231,8 @@ func DefaultsFactory(props ...interface{}) android.Module {
|
|||||||
&android.ProtoProperties{},
|
&android.ProtoProperties{},
|
||||||
)
|
)
|
||||||
|
|
||||||
android.InitApexModule(module)
|
|
||||||
android.InitDefaultsModule(module)
|
android.InitDefaultsModule(module)
|
||||||
|
android.InitApexModule(module)
|
||||||
|
|
||||||
return module
|
return module
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user