Merge "Remove no_apex in favor or apex_available"

This commit is contained in:
Treehugger Robot
2019-10-08 05:33:29 +00:00
committed by Gerrit Code Review
4 changed files with 4 additions and 234 deletions

View File

@@ -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"

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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
} }