From cc372c5b1d998dfa632fdd459730542bd75643d0 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Wed, 25 Sep 2019 15:18:44 +0900 Subject: [PATCH] fix: "no_apex" can be put in defaults Currently, putting no_apex in defaults module doesn't work. To fix this, * 'no_apex' property is added as 'defaultable'. * apex module doesn't follow beyond 'defaults' module. Bug: 141560644 Test: m (soong tests added) Change-Id: I8410785f7f83d843689a33b1241d74086c6a7671 --- apex/apex.go | 2 ++ apex/apex_test.go | 87 ++++++++++++++++++++++++++++++++++++++++++++++- cc/cc.go | 6 ++-- 3 files changed, 90 insertions(+), 5 deletions(-) diff --git a/apex/apex.go b/apex/apex.go index 6024deb97..d0787242b 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1170,6 +1170,8 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { } } else if am.CanHaveApexVariants() && am.IsInstallableToApex() { 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) } diff --git a/apex/apex_test.go b/apex/apex_test.go index 6db610f3c..91c642630 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -102,6 +102,9 @@ func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*andr ctx.RegisterModuleType("apex_defaults", android.ModuleFactoryAdaptor(defaultsFactory)) 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_shared", android.ModuleFactoryAdaptor(cc.LibrarySharedFactory)) ctx.RegisterModuleType("cc_library_headers", android.ModuleFactoryAdaptor(cc.LibraryHeaderFactory)) @@ -2127,6 +2130,7 @@ 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", @@ -2157,6 +2161,7 @@ func TestApexUsesFailsIfUseNoApex(t *testing.T) { } `) + // respect 'no_apex' even with static link testApexError(t, `tries to include no_apex module mylib2`, ` apex { name: "commonapex", @@ -2187,6 +2192,86 @@ func TestApexUsesFailsIfUseNoApex(t *testing.T) { } `) + // '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", @@ -2219,6 +2304,7 @@ func TestApexUsesFailsIfUseNoApex(t *testing.T) { }, } + // this won't be included in "myapex", so 'no_apex' is still valid in this case. cc_library { name: "mylib3", srcs: ["mylib.cpp"], @@ -2235,7 +2321,6 @@ func TestApexUsesFailsIfUseNoApex(t *testing.T) { 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) { diff --git a/cc/cc.go b/cc/cc.go index e1d184a8a..2987369e9 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -544,10 +544,8 @@ func (c *Module) Init() android.Module { } }) android.InitAndroidArchModule(c, c.hod, c.multilib) - - android.InitDefaultableModule(c) - android.InitApexModule(c) + android.InitDefaultableModule(c) android.InitSdkAwareModule(c) return c @@ -2221,8 +2219,8 @@ func DefaultsFactory(props ...interface{}) android.Module { &android.ProtoProperties{}, ) - android.InitDefaultsModule(module) android.InitApexModule(module) + android.InitDefaultsModule(module) return module }