Loading cc/prebuilt.go +7 −7 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package cc import ( "path/filepath" "strings" "android/soong/android" "android/soong/bazel" Loading Loading @@ -208,12 +207,13 @@ func (p *prebuiltLibraryLinker) link(ctx ModuleContext, }) // TODO(b/220898484): Mainline module sdk prebuilts of stub libraries use a stub // library as their source and must not be installed, but libclang_rt.* libraries // have stubs because they are LLNDK libraries, but use an implementation library // as their source and need to be installed. This discrepancy should be resolved // without the prefix hack below. if p.hasStubsVariants() && !p.buildStubs() && !ctx.Host() && !strings.HasPrefix(ctx.baseModuleName(), "libclang_rt.") { // library as their source and must not be installed, but other prebuilts like // libclang_rt.* libraries set `stubs` property because they are LLNDK libraries, // but use an implementation library as their source and need to be installed. // This discrepancy should be resolved without the prefix hack below. isModuleSdkPrebuilts := android.HasAnyPrefix(ctx.ModuleDir(), []string{ "prebuilts/runtime/mainline/", "prebuilts/module_sdk/"}) if p.hasStubsVariants() && !p.buildStubs() && !ctx.Host() && isModuleSdkPrebuilts { ctx.Module().MakeUninstallable() } Loading cc/prebuilt_test.go +62 −25 Original line number Diff line number Diff line Loading @@ -670,11 +670,15 @@ cc_prebuilt_library_shared { } func TestPrebuiltStubNoinstall(t *testing.T) { testFunc := func(t *testing.T, bp string) { testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) { result := android.GroupFixturePreparers( prepareForPrebuiltTest, android.PrepareForTestWithMakevars, ).RunTestWithBp(t, bp) android.FixtureMergeMockFs(fs), ).RunTest(t) ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld") android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared/libfoo.so") installRules := result.InstallMakeRulesForTesting(t) var installedlibRule *android.InstallMakeRule Loading @@ -691,50 +695,83 @@ func TestPrebuiltStubNoinstall(t *testing.T) { return } if expectLibfooOnSystemLib { android.AssertStringListContains(t, "installedlib doesn't have install dependency on libfoo impl", installedlibRule.OrderOnlyDeps, "out/target/product/test_device/system/lib/libfoo.so") } else { android.AssertStringListDoesNotContain(t, "installedlib has install dependency on stub", "installedlib has install dependency on libfoo stub", installedlibRule.Deps, "out/target/product/test_device/system/lib/stublib.so") "out/target/product/test_device/system/lib/libfoo.so") android.AssertStringListDoesNotContain(t, "installedlib has order-only install dependency on stub", "installedlib has order-only install dependency on libfoo stub", installedlibRule.OrderOnlyDeps, "out/target/product/test_device/system/lib/stublib.so") "out/target/product/test_device/system/lib/libfoo.so") } } const prebuiltStublibBp = ` prebuiltLibfooBp := []byte(` cc_prebuilt_library { name: "stublib", name: "libfoo", prefer: true, srcs: ["foo.so"], srcs: ["libfoo.so"], stubs: { versions: ["1"], }, } ` `) const installedlibBp = ` installedlibBp := []byte(` cc_library { name: "installedlib", shared_libs: ["stublib"], shared_libs: ["libfoo"], } ` `) t.Run("prebuilt without source", func(t *testing.T) { testFunc(t, prebuiltStublibBp+installedlibBp) t.Run("prebuilt stub (without source): no install", func(t *testing.T) { testFunc( t, /*expectLibfooOnSystemLib=*/ false, android.MockFS{ "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp, "Android.bp": installedlibBp, }, ) }) const disabledSourceStublibBp = ` disabledSourceLibfooBp := []byte(` cc_library { name: "stublib", name: "libfoo", enabled: false, stubs: { versions: ["1"], }, } ` `) t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) { testFunc( t, /*expectLibfooOnSystemLib=*/ false, android.MockFS{ "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp, "impl/Android.bp": disabledSourceLibfooBp, "Android.bp": installedlibBp, }, ) }) t.Run("prebuilt with disabled source", func(t *testing.T) { testFunc(t, disabledSourceStublibBp+prebuiltStublibBp+installedlibBp) t.Run("prebuilt impl (with `stubs` property set): install", func(t *testing.T) { testFunc( t, /*expectLibfooOnSystemLib=*/ true, android.MockFS{ "impl/Android.bp": prebuiltLibfooBp, "Android.bp": installedlibBp, }, ) }) } Loading Loading
cc/prebuilt.go +7 −7 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package cc import ( "path/filepath" "strings" "android/soong/android" "android/soong/bazel" Loading Loading @@ -208,12 +207,13 @@ func (p *prebuiltLibraryLinker) link(ctx ModuleContext, }) // TODO(b/220898484): Mainline module sdk prebuilts of stub libraries use a stub // library as their source and must not be installed, but libclang_rt.* libraries // have stubs because they are LLNDK libraries, but use an implementation library // as their source and need to be installed. This discrepancy should be resolved // without the prefix hack below. if p.hasStubsVariants() && !p.buildStubs() && !ctx.Host() && !strings.HasPrefix(ctx.baseModuleName(), "libclang_rt.") { // library as their source and must not be installed, but other prebuilts like // libclang_rt.* libraries set `stubs` property because they are LLNDK libraries, // but use an implementation library as their source and need to be installed. // This discrepancy should be resolved without the prefix hack below. isModuleSdkPrebuilts := android.HasAnyPrefix(ctx.ModuleDir(), []string{ "prebuilts/runtime/mainline/", "prebuilts/module_sdk/"}) if p.hasStubsVariants() && !p.buildStubs() && !ctx.Host() && isModuleSdkPrebuilts { ctx.Module().MakeUninstallable() } Loading
cc/prebuilt_test.go +62 −25 Original line number Diff line number Diff line Loading @@ -670,11 +670,15 @@ cc_prebuilt_library_shared { } func TestPrebuiltStubNoinstall(t *testing.T) { testFunc := func(t *testing.T, bp string) { testFunc := func(t *testing.T, expectLibfooOnSystemLib bool, fs android.MockFS) { result := android.GroupFixturePreparers( prepareForPrebuiltTest, android.PrepareForTestWithMakevars, ).RunTestWithBp(t, bp) android.FixtureMergeMockFs(fs), ).RunTest(t) ldRule := result.ModuleForTests("installedlib", "android_arm64_armv8-a_shared").Rule("ld") android.AssertStringDoesContain(t, "", ldRule.Args["libFlags"], "android_arm64_armv8-a_shared/libfoo.so") installRules := result.InstallMakeRulesForTesting(t) var installedlibRule *android.InstallMakeRule Loading @@ -691,50 +695,83 @@ func TestPrebuiltStubNoinstall(t *testing.T) { return } if expectLibfooOnSystemLib { android.AssertStringListContains(t, "installedlib doesn't have install dependency on libfoo impl", installedlibRule.OrderOnlyDeps, "out/target/product/test_device/system/lib/libfoo.so") } else { android.AssertStringListDoesNotContain(t, "installedlib has install dependency on stub", "installedlib has install dependency on libfoo stub", installedlibRule.Deps, "out/target/product/test_device/system/lib/stublib.so") "out/target/product/test_device/system/lib/libfoo.so") android.AssertStringListDoesNotContain(t, "installedlib has order-only install dependency on stub", "installedlib has order-only install dependency on libfoo stub", installedlibRule.OrderOnlyDeps, "out/target/product/test_device/system/lib/stublib.so") "out/target/product/test_device/system/lib/libfoo.so") } } const prebuiltStublibBp = ` prebuiltLibfooBp := []byte(` cc_prebuilt_library { name: "stublib", name: "libfoo", prefer: true, srcs: ["foo.so"], srcs: ["libfoo.so"], stubs: { versions: ["1"], }, } ` `) const installedlibBp = ` installedlibBp := []byte(` cc_library { name: "installedlib", shared_libs: ["stublib"], shared_libs: ["libfoo"], } ` `) t.Run("prebuilt without source", func(t *testing.T) { testFunc(t, prebuiltStublibBp+installedlibBp) t.Run("prebuilt stub (without source): no install", func(t *testing.T) { testFunc( t, /*expectLibfooOnSystemLib=*/ false, android.MockFS{ "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp, "Android.bp": installedlibBp, }, ) }) const disabledSourceStublibBp = ` disabledSourceLibfooBp := []byte(` cc_library { name: "stublib", name: "libfoo", enabled: false, stubs: { versions: ["1"], }, } ` `) t.Run("prebuilt stub (with disabled source): no install", func(t *testing.T) { testFunc( t, /*expectLibfooOnSystemLib=*/ false, android.MockFS{ "prebuilts/module_sdk/art/current/Android.bp": prebuiltLibfooBp, "impl/Android.bp": disabledSourceLibfooBp, "Android.bp": installedlibBp, }, ) }) t.Run("prebuilt with disabled source", func(t *testing.T) { testFunc(t, disabledSourceStublibBp+prebuiltStublibBp+installedlibBp) t.Run("prebuilt impl (with `stubs` property set): install", func(t *testing.T) { testFunc( t, /*expectLibfooOnSystemLib=*/ true, android.MockFS{ "impl/Android.bp": prebuiltLibfooBp, "Android.bp": installedlibBp, }, ) }) } Loading