From e5f063e85fa127ec95284e56d37287f9ebab2f7c Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Thu, 23 Mar 2023 14:31:19 +0900 Subject: [PATCH] Do not install prebuilt stubs from module_sdk This is a rework of commit 5bdf2d589cce1146d663825c2a3e3d22c3c5476a which made implementation variant of prebuilts with stubs as not installable except libclangrt. This change narrows the affected modules to prebuilts/module_sdk because cc_prebuilt_library_shared with stub implementation is a special case only used there. It's typical for cc_prebuilt_library_shared to have implementation, not stub. Bug: 220898484 Test: ART_MODULE_BUILD_FROM_SOURCE=false m nothing Change-Id: I99e5213da8cc473901e23942b50f06c023d91f60 --- cc/prebuilt.go | 14 ++++---- cc/prebuilt_test.go | 85 ++++++++++++++++++++++++++++++++------------- 2 files changed, 68 insertions(+), 31 deletions(-) diff --git a/cc/prebuilt.go b/cc/prebuilt.go index 5b7ba4346..4470f5496 100644 --- a/cc/prebuilt.go +++ b/cc/prebuilt.go @@ -16,7 +16,6 @@ package cc import ( "path/filepath" - "strings" "android/soong/android" "android/soong/bazel" @@ -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() } diff --git a/cc/prebuilt_test.go b/cc/prebuilt_test.go index e3ec9d5d4..0c79e55d6 100644 --- a/cc/prebuilt_test.go +++ b/cc/prebuilt_test.go @@ -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 @@ -691,50 +695,83 @@ func TestPrebuiltStubNoinstall(t *testing.T) { return } - android.AssertStringListDoesNotContain(t, - "installedlib has install dependency on stub", - installedlibRule.Deps, - "out/target/product/test_device/system/lib/stublib.so") - android.AssertStringListDoesNotContain(t, - "installedlib has order-only install dependency on stub", - installedlibRule.OrderOnlyDeps, - "out/target/product/test_device/system/lib/stublib.so") + 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 libfoo stub", + installedlibRule.Deps, + "out/target/product/test_device/system/lib/libfoo.so") + android.AssertStringListDoesNotContain(t, + "installedlib has order-only install dependency on libfoo stub", + installedlibRule.OrderOnlyDeps, + "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 with disabled source", func(t *testing.T) { - testFunc(t, disabledSourceStublibBp+prebuiltStublibBp+installedlibBp) + 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 impl (with `stubs` property set): install", func(t *testing.T) { + testFunc( + t, + /*expectLibfooOnSystemLib=*/ true, + android.MockFS{ + "impl/Android.bp": prebuiltLibfooBp, + "Android.bp": installedlibBp, + }, + ) }) }