Do not install prebuilt stubs from module_sdk

This is a rework of commit 5bdf2d589c
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
This commit is contained in:
Jooyung Han 2023-03-23 14:31:19 +09:00
parent 8fdb210be2
commit e5f063e85f
2 changed files with 68 additions and 31 deletions

View file

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

View file

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