Loading apex/apex_test.go +51 −78 Original line number Diff line number Diff line Loading @@ -874,35 +874,13 @@ func TestApexWithRuntimeLibsDependency(t *testing.T) { } func TestApexDependsOnLLNDKTransitively(t *testing.T) { testcases := []struct { name string minSdkVersion string shouldLink string shouldNotLink []string }{ { name: "should link to test latest", minSdkVersion: "current", shouldLink: "30", shouldNotLink: []string{"29"}, }, { name: "should link to llndk#29", minSdkVersion: "29", shouldLink: "29", shouldNotLink: []string{"30"}, }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { func TestApexDependencyToLLNDK(t *testing.T) { ctx, _ := testApex(t, ` apex { name: "myapex", key: "myapex.key", use_vendor: true, native_shared_libs: ["mylib"], min_sdk_version: "`+tc.minSdkVersion+`", } apex_key { Loading @@ -926,7 +904,6 @@ func TestApexDependsOnLLNDKTransitively(t *testing.T) { srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", stubs: { versions: ["29","30"] }, } llndk_library { Loading @@ -935,28 +912,20 @@ func TestApexDependsOnLLNDKTransitively(t *testing.T) { } `, func(fs map[string][]byte, config android.Config) { setUseVendorWhitelistForTest(config, []string{"myapex"}) }, withUnbundledBuild) }) apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that LLNDK dep is not included ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{ "lib64/mylib.so", }) ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so") // Ensure that LLNDK dep is required apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule") ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"])) ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so") mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"] ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so") for _, ver := range tc.shouldNotLink { ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so") } // Ensure that LLNDK dep is required ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so") mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"] ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink) }) } } func TestApexWithSystemLibsStubs(t *testing.T) { Loading Loading @@ -1286,6 +1255,10 @@ func TestQTargetApexUseStaticUnwinder(t *testing.T) { // note that platform variant is not. cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module) ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped") libFlags := ctx.ModuleForTests("libx", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"] ensureContains(t, libFlags, "android_arm64_armv8-a_shared_myapex/libc++.so") ensureContains(t, libFlags, "android_arm64_armv8-a_shared_29/libc.so") // min_sdk_version applied } func TestInvalidMinSdkVersion(t *testing.T) { Loading cc/cc.go +2 −38 Original line number Diff line number Diff line Loading @@ -622,10 +622,6 @@ func (c *Module) SetBuildStubs() { c.Properties.PreventInstall = true return } if _, ok := c.linker.(*llndkStubDecorator); ok { c.Properties.HideFromMake = true return } } panic(fmt.Errorf("SetBuildStubs called on non-library module: %q", c.BaseModuleName())) } Loading @@ -645,10 +641,6 @@ func (c *Module) SetStubsVersions(version string) { library.MutatedProperties.StubsVersion = version return } if llndk, ok := c.linker.(*llndkStubDecorator); ok { llndk.libraryDecorator.MutatedProperties.StubsVersion = version return } } panic(fmt.Errorf("SetStubsVersions called on non-library module: %q", c.BaseModuleName())) } Loading @@ -658,9 +650,6 @@ func (c *Module) StubsVersion() string { if library, ok := c.linker.(*libraryDecorator); ok { return library.MutatedProperties.StubsVersion } if llndk, ok := c.linker.(*llndkStubDecorator); ok { return llndk.libraryDecorator.MutatedProperties.StubsVersion } } panic(fmt.Errorf("StubsVersion called on non-library module: %q", c.BaseModuleName())) } Loading Loading @@ -1862,7 +1851,7 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { addSharedLibDependencies := func(depTag DependencyTag, name string, version string) { var variations []blueprint.Variation variations = append(variations, blueprint.Variation{Mutator: "link", Variation: "shared"}) versionVariantAvail := !c.InRecovery() && !c.InRamdisk() versionVariantAvail := !ctx.useVndk() && !c.InRecovery() && !c.InRamdisk() if version != "" && versionVariantAvail { // Version is explicitly specified. i.e. libFoo#30 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version}) Loading Loading @@ -2197,17 +2186,13 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { if depTag == android.ProtoPluginDepTag { return } if depTag == llndkImplDep { return } if dep.Target().Os != ctx.Os() { ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName) return } if dep.Target().Arch.ArchType != ctx.Arch().ArchType { ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)", ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType) ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), depName) return } Loading Loading @@ -2302,27 +2287,6 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { return // stop processing this dep } } if c.UseVndk() { if m, ok := ccDep.(*Module); ok && m.IsStubs() { // LLNDK // by default, use current version of LLNDK versionToUse := "" versions := stubsVersionsFor(ctx.Config())[depName] if c.ApexName() != "" && len(versions) > 0 { // if this is for use_vendor apex && dep has stubsVersions // apply the same rule of apex sdk enforcement to choose right version var err error useLatest := c.ShouldSupportAndroid10() && !ctx.Config().UnbundledBuild() versionToUse, err = c.ChooseSdkVersion(versions, useLatest) if err != nil { ctx.OtherModuleErrorf(dep, err.Error()) return } } if versionToUse != ccDep.StubsVersion() { return } } } depPaths.IncludeDirs = append(depPaths.IncludeDirs, ccDep.IncludeDirs()...) Loading cc/cc_test.go +0 −28 Original line number Diff line number Diff line Loading @@ -2398,34 +2398,6 @@ func checkEquals(t *testing.T, message string, expected, actual interface{}) { } } func TestLlndkLibrary(t *testing.T) { ctx := testCc(t, ` cc_library { name: "libllndk", stubs: { versions: ["1", "2"] }, } llndk_library { name: "libllndk", } `) actual := ctx.ModuleVariantsForTests("libllndk.llndk") expected := []string{ "android_vendor.VER_arm64_armv8-a_shared", "android_vendor.VER_arm64_armv8-a_shared_1", "android_vendor.VER_arm64_armv8-a_shared_2", "android_vendor.VER_arm_armv7-a-neon_shared", "android_vendor.VER_arm_armv7-a-neon_shared_1", "android_vendor.VER_arm_armv7-a-neon_shared_2", } checkEquals(t, "variants for llndk stubs", expected, actual) params := ctx.ModuleForTests("libllndk.llndk", "android_vendor.VER_arm_armv7-a-neon_shared").Description("generate stub") checkEquals(t, "use VNDK version for default stubs", "current", params.Args["apiLevel"]) params = ctx.ModuleForTests("libllndk.llndk", "android_vendor.VER_arm_armv7-a-neon_shared_1").Description("generate stub") checkEquals(t, "override apiLevel for versioned stubs", "1", params.Args["apiLevel"]) } func TestLlndkHeaders(t *testing.T) { ctx := testCc(t, ` llndk_headers { Loading cc/library.go +12 −31 Original line number Diff line number Diff line Loading @@ -1487,19 +1487,6 @@ func checkVersions(ctx android.BaseModuleContext, versions []string) { } } func createVersionVariations(mctx android.BottomUpMutatorContext, versions []string) { // "" is for the non-stubs variant versions = append([]string{""}, versions...) modules := mctx.CreateVariations(versions...) for i, m := range modules { if versions[i] != "" { m.(LinkableInterface).SetBuildStubs() m.(LinkableInterface).SetStubsVersions(versions[i]) } } } // Version mutator splits a module into the mandatory non-stubs variant // (which is unnamed) and zero or more stubs variants. func VersionMutator(mctx android.BottomUpMutatorContext) { Loading @@ -1511,30 +1498,24 @@ func VersionMutator(mctx android.BottomUpMutatorContext) { return } stubsVersionsLock.Lock() defer stubsVersionsLock.Unlock() // save the list of versions for later use stubsVersionsFor(mctx.Config())[mctx.ModuleName()] = versions createVersionVariations(mctx, versions) return } if c, ok := library.(*Module); ok && c.IsStubs() { stubsVersionsLock.Lock() defer stubsVersionsLock.Unlock() // For LLNDK llndk_library, we borrow vstubs.ersions from its implementation library. // Since llndk_library has dependency to its implementation library, // we can safely access stubsVersionsFor() with its baseModuleName. versions := stubsVersionsFor(mctx.Config())[c.BaseModuleName()] // save the list of versions for later use stubsVersionsFor(mctx.Config())[mctx.ModuleName()] = versions createVersionVariations(mctx, versions) return } // "" is for the non-stubs variant versions = append([]string{""}, versions...) modules := mctx.CreateVariations(versions...) for i, m := range modules { if versions[i] != "" { m.(LinkableInterface).SetBuildStubs() m.(LinkableInterface).SetStubsVersions(versions[i]) } } } else { mctx.CreateVariations("") } return } if genrule, ok := mctx.Module().(*genrule.Module); ok { Loading cc/llndk_library.go +0 −13 Original line number Diff line number Diff line Loading @@ -19,14 +19,8 @@ import ( "strings" "android/soong/android" "github.com/google/blueprint" ) var llndkImplDep = struct { blueprint.DependencyTag }{} var ( llndkLibrarySuffix = ".llndk" llndkHeadersSuffix = ".llndk" Loading Loading @@ -87,9 +81,6 @@ func (stub *llndkStubDecorator) compile(ctx ModuleContext, flags Flags, deps Pat // For non-enforcing devices, vndkVer is empty. Use "current" in that case, too. vndkVer = "current" } if stub.stubsVersion() != "" { vndkVer = stub.stubsVersion() } objs, versionScript := compileStubLibrary(ctx, flags, String(stub.Properties.Symbol_file), vndkVer, "--llndk") stub.versionScriptPath = versionScript return objs Loading Loading @@ -163,10 +154,6 @@ func (stub *llndkStubDecorator) link(ctx ModuleContext, flags Flags, deps PathDe stub.libraryDecorator.flagExporter.Properties.Export_include_dirs = []string{} } if stub.stubsVersion() != "" { stub.reexportFlags("-D" + versioningMacroName(ctx.baseModuleName()) + "=" + stub.stubsVersion()) } return stub.libraryDecorator.link(ctx, flags, deps, objs) } Loading Loading
apex/apex_test.go +51 −78 Original line number Diff line number Diff line Loading @@ -874,35 +874,13 @@ func TestApexWithRuntimeLibsDependency(t *testing.T) { } func TestApexDependsOnLLNDKTransitively(t *testing.T) { testcases := []struct { name string minSdkVersion string shouldLink string shouldNotLink []string }{ { name: "should link to test latest", minSdkVersion: "current", shouldLink: "30", shouldNotLink: []string{"29"}, }, { name: "should link to llndk#29", minSdkVersion: "29", shouldLink: "29", shouldNotLink: []string{"30"}, }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { func TestApexDependencyToLLNDK(t *testing.T) { ctx, _ := testApex(t, ` apex { name: "myapex", key: "myapex.key", use_vendor: true, native_shared_libs: ["mylib"], min_sdk_version: "`+tc.minSdkVersion+`", } apex_key { Loading @@ -926,7 +904,6 @@ func TestApexDependsOnLLNDKTransitively(t *testing.T) { srcs: ["mylib.cpp"], system_shared_libs: [], stl: "none", stubs: { versions: ["29","30"] }, } llndk_library { Loading @@ -935,28 +912,20 @@ func TestApexDependsOnLLNDKTransitively(t *testing.T) { } `, func(fs map[string][]byte, config android.Config) { setUseVendorWhitelistForTest(config, []string{"myapex"}) }, withUnbundledBuild) }) apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule") copyCmds := apexRule.Args["copy_commands"] // Ensure that LLNDK dep is not included ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{ "lib64/mylib.so", }) ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so") // Ensure that LLNDK dep is required apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule") ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"])) ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so") mylibLdFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"] ensureContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so") for _, ver := range tc.shouldNotLink { ensureNotContains(t, mylibLdFlags, "libbar.llndk/android_vendor.VER_arm64_armv8-a_shared_"+ver+"/libbar.so") } // Ensure that LLNDK dep is required ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so") mylibCFlags := ctx.ModuleForTests("mylib", "android_vendor.VER_arm64_armv8-a_static_myapex").Rule("cc").Args["cFlags"] ensureContains(t, mylibCFlags, "__LIBBAR_API__="+tc.shouldLink) }) } } func TestApexWithSystemLibsStubs(t *testing.T) { Loading Loading @@ -1286,6 +1255,10 @@ func TestQTargetApexUseStaticUnwinder(t *testing.T) { // note that platform variant is not. cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module) ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libgcc_stripped") libFlags := ctx.ModuleForTests("libx", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"] ensureContains(t, libFlags, "android_arm64_armv8-a_shared_myapex/libc++.so") ensureContains(t, libFlags, "android_arm64_armv8-a_shared_29/libc.so") // min_sdk_version applied } func TestInvalidMinSdkVersion(t *testing.T) { Loading
cc/cc.go +2 −38 Original line number Diff line number Diff line Loading @@ -622,10 +622,6 @@ func (c *Module) SetBuildStubs() { c.Properties.PreventInstall = true return } if _, ok := c.linker.(*llndkStubDecorator); ok { c.Properties.HideFromMake = true return } } panic(fmt.Errorf("SetBuildStubs called on non-library module: %q", c.BaseModuleName())) } Loading @@ -645,10 +641,6 @@ func (c *Module) SetStubsVersions(version string) { library.MutatedProperties.StubsVersion = version return } if llndk, ok := c.linker.(*llndkStubDecorator); ok { llndk.libraryDecorator.MutatedProperties.StubsVersion = version return } } panic(fmt.Errorf("SetStubsVersions called on non-library module: %q", c.BaseModuleName())) } Loading @@ -658,9 +650,6 @@ func (c *Module) StubsVersion() string { if library, ok := c.linker.(*libraryDecorator); ok { return library.MutatedProperties.StubsVersion } if llndk, ok := c.linker.(*llndkStubDecorator); ok { return llndk.libraryDecorator.MutatedProperties.StubsVersion } } panic(fmt.Errorf("StubsVersion called on non-library module: %q", c.BaseModuleName())) } Loading Loading @@ -1862,7 +1851,7 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { addSharedLibDependencies := func(depTag DependencyTag, name string, version string) { var variations []blueprint.Variation variations = append(variations, blueprint.Variation{Mutator: "link", Variation: "shared"}) versionVariantAvail := !c.InRecovery() && !c.InRamdisk() versionVariantAvail := !ctx.useVndk() && !c.InRecovery() && !c.InRamdisk() if version != "" && versionVariantAvail { // Version is explicitly specified. i.e. libFoo#30 variations = append(variations, blueprint.Variation{Mutator: "version", Variation: version}) Loading Loading @@ -2197,17 +2186,13 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { if depTag == android.ProtoPluginDepTag { return } if depTag == llndkImplDep { return } if dep.Target().Os != ctx.Os() { ctx.ModuleErrorf("OS mismatch between %q and %q", ctx.ModuleName(), depName) return } if dep.Target().Arch.ArchType != ctx.Arch().ArchType { ctx.ModuleErrorf("Arch mismatch between %q(%v) and %q(%v)", ctx.ModuleName(), ctx.Arch().ArchType, depName, dep.Target().Arch.ArchType) ctx.ModuleErrorf("Arch mismatch between %q and %q", ctx.ModuleName(), depName) return } Loading Loading @@ -2302,27 +2287,6 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { return // stop processing this dep } } if c.UseVndk() { if m, ok := ccDep.(*Module); ok && m.IsStubs() { // LLNDK // by default, use current version of LLNDK versionToUse := "" versions := stubsVersionsFor(ctx.Config())[depName] if c.ApexName() != "" && len(versions) > 0 { // if this is for use_vendor apex && dep has stubsVersions // apply the same rule of apex sdk enforcement to choose right version var err error useLatest := c.ShouldSupportAndroid10() && !ctx.Config().UnbundledBuild() versionToUse, err = c.ChooseSdkVersion(versions, useLatest) if err != nil { ctx.OtherModuleErrorf(dep, err.Error()) return } } if versionToUse != ccDep.StubsVersion() { return } } } depPaths.IncludeDirs = append(depPaths.IncludeDirs, ccDep.IncludeDirs()...) Loading
cc/cc_test.go +0 −28 Original line number Diff line number Diff line Loading @@ -2398,34 +2398,6 @@ func checkEquals(t *testing.T, message string, expected, actual interface{}) { } } func TestLlndkLibrary(t *testing.T) { ctx := testCc(t, ` cc_library { name: "libllndk", stubs: { versions: ["1", "2"] }, } llndk_library { name: "libllndk", } `) actual := ctx.ModuleVariantsForTests("libllndk.llndk") expected := []string{ "android_vendor.VER_arm64_armv8-a_shared", "android_vendor.VER_arm64_armv8-a_shared_1", "android_vendor.VER_arm64_armv8-a_shared_2", "android_vendor.VER_arm_armv7-a-neon_shared", "android_vendor.VER_arm_armv7-a-neon_shared_1", "android_vendor.VER_arm_armv7-a-neon_shared_2", } checkEquals(t, "variants for llndk stubs", expected, actual) params := ctx.ModuleForTests("libllndk.llndk", "android_vendor.VER_arm_armv7-a-neon_shared").Description("generate stub") checkEquals(t, "use VNDK version for default stubs", "current", params.Args["apiLevel"]) params = ctx.ModuleForTests("libllndk.llndk", "android_vendor.VER_arm_armv7-a-neon_shared_1").Description("generate stub") checkEquals(t, "override apiLevel for versioned stubs", "1", params.Args["apiLevel"]) } func TestLlndkHeaders(t *testing.T) { ctx := testCc(t, ` llndk_headers { Loading
cc/library.go +12 −31 Original line number Diff line number Diff line Loading @@ -1487,19 +1487,6 @@ func checkVersions(ctx android.BaseModuleContext, versions []string) { } } func createVersionVariations(mctx android.BottomUpMutatorContext, versions []string) { // "" is for the non-stubs variant versions = append([]string{""}, versions...) modules := mctx.CreateVariations(versions...) for i, m := range modules { if versions[i] != "" { m.(LinkableInterface).SetBuildStubs() m.(LinkableInterface).SetStubsVersions(versions[i]) } } } // Version mutator splits a module into the mandatory non-stubs variant // (which is unnamed) and zero or more stubs variants. func VersionMutator(mctx android.BottomUpMutatorContext) { Loading @@ -1511,30 +1498,24 @@ func VersionMutator(mctx android.BottomUpMutatorContext) { return } stubsVersionsLock.Lock() defer stubsVersionsLock.Unlock() // save the list of versions for later use stubsVersionsFor(mctx.Config())[mctx.ModuleName()] = versions createVersionVariations(mctx, versions) return } if c, ok := library.(*Module); ok && c.IsStubs() { stubsVersionsLock.Lock() defer stubsVersionsLock.Unlock() // For LLNDK llndk_library, we borrow vstubs.ersions from its implementation library. // Since llndk_library has dependency to its implementation library, // we can safely access stubsVersionsFor() with its baseModuleName. versions := stubsVersionsFor(mctx.Config())[c.BaseModuleName()] // save the list of versions for later use stubsVersionsFor(mctx.Config())[mctx.ModuleName()] = versions createVersionVariations(mctx, versions) return } // "" is for the non-stubs variant versions = append([]string{""}, versions...) modules := mctx.CreateVariations(versions...) for i, m := range modules { if versions[i] != "" { m.(LinkableInterface).SetBuildStubs() m.(LinkableInterface).SetStubsVersions(versions[i]) } } } else { mctx.CreateVariations("") } return } if genrule, ok := mctx.Module().(*genrule.Module); ok { Loading
cc/llndk_library.go +0 −13 Original line number Diff line number Diff line Loading @@ -19,14 +19,8 @@ import ( "strings" "android/soong/android" "github.com/google/blueprint" ) var llndkImplDep = struct { blueprint.DependencyTag }{} var ( llndkLibrarySuffix = ".llndk" llndkHeadersSuffix = ".llndk" Loading Loading @@ -87,9 +81,6 @@ func (stub *llndkStubDecorator) compile(ctx ModuleContext, flags Flags, deps Pat // For non-enforcing devices, vndkVer is empty. Use "current" in that case, too. vndkVer = "current" } if stub.stubsVersion() != "" { vndkVer = stub.stubsVersion() } objs, versionScript := compileStubLibrary(ctx, flags, String(stub.Properties.Symbol_file), vndkVer, "--llndk") stub.versionScriptPath = versionScript return objs Loading Loading @@ -163,10 +154,6 @@ func (stub *llndkStubDecorator) link(ctx ModuleContext, flags Flags, deps PathDe stub.libraryDecorator.flagExporter.Properties.Export_include_dirs = []string{} } if stub.stubsVersion() != "" { stub.reexportFlags("-D" + versioningMacroName(ctx.baseModuleName()) + "=" + stub.stubsVersion()) } return stub.libraryDecorator.link(ctx, flags, deps, objs) } Loading