diff --git a/android/androidmk.go b/android/androidmk.go index a7b69f668..aa411d116 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -560,8 +560,6 @@ func (a *AndroidMkEntries) fillInEntries(ctx fillInEntriesContext, mod blueprint a.SetPaths("LOCAL_SOONG_INSTALL_SYMLINKS", base.katiSymlinks.InstallPaths().Paths()) } - a.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", base.commonProperties.SkipInstall) - if am, ok := mod.(ApexModule); ok { a.SetBoolIfTrue("LOCAL_NOT_AVAILABLE_FOR_PLATFORM", am.NotAvailableForPlatform()) } diff --git a/android/apex.go b/android/apex.go index 21ba864d3..91d2c5b65 100644 --- a/android/apex.go +++ b/android/apex.go @@ -605,7 +605,7 @@ func CreateApexVariations(mctx BottomUpMutatorContext, module ApexModule) []Modu // Do not install the module for platform, but still allow it to output // uninstallable AndroidMk entries in certain cases when they have side // effects. TODO(jiyong): move this routine to somewhere else - mod.SkipInstall() + mod.MakeUninstallable() } if !platformVariation { mctx.SetVariationProvider(mod, ApexInfoProvider, apexInfos[i-1]) diff --git a/android/module.go b/android/module.go index b45ed9530..773d77be0 100644 --- a/android/module.go +++ b/android/module.go @@ -505,8 +505,8 @@ type Module interface { PartitionTag(DeviceConfig) string HideFromMake() IsHideFromMake() bool - SkipInstall() IsSkipInstall() bool + MakeUninstallable() ReplacedByPrebuilt() IsReplacedByPrebuilt() bool ExportedToMake() bool @@ -1964,6 +1964,15 @@ func (m *ModuleBase) IsSkipInstall() bool { return m.commonProperties.SkipInstall } +// Similar to HideFromMake, but if the AndroidMk entry would set +// LOCAL_UNINSTALLABLE_MODULE then this variant may still output that entry +// rather than leaving it out altogether. That happens in cases where it would +// have other side effects, in particular when it adds a NOTICE file target, +// which other install targets might depend on. +func (m *ModuleBase) MakeUninstallable() { + m.HideFromMake() +} + func (m *ModuleBase) ReplacedByPrebuilt() { m.commonProperties.ReplacedByPrebuilt = true m.HideFromMake() diff --git a/android/packaging_test.go b/android/packaging_test.go index f32d1c396..91ac1f386 100644 --- a/android/packaging_test.go +++ b/android/packaging_test.go @@ -15,7 +15,6 @@ package android import ( - "strings" "testing" "github.com/google/blueprint" @@ -29,8 +28,6 @@ type componentTestModule struct { Deps []string Skip_install *bool } - - builtFile Path } // dep tag used in this test. All dependencies are considered as installable. @@ -51,21 +48,13 @@ func (m *componentTestModule) DepsMutator(ctx BottomUpMutatorContext) { } func (m *componentTestModule) GenerateAndroidBuildActions(ctx ModuleContext) { - m.builtFile = PathForModuleOut(ctx, m.Name()) + builtFile := PathForModuleOut(ctx, m.Name()) dir := ctx.Target().Arch.ArchType.Multilib installDir := PathForModuleInstall(ctx, dir) if proptools.Bool(m.props.Skip_install) { m.SkipInstall() } - ctx.InstallFile(installDir, m.Name(), m.builtFile) -} - -func (m *componentTestModule) AndroidMkEntries() []AndroidMkEntries { - return []AndroidMkEntries{ - { - OutputFile: OptionalPathForPath(m.builtFile), - }, - } + ctx.InstallFile(installDir, m.Name(), builtFile) } // Module that itself is a package @@ -262,35 +251,6 @@ func TestPackagingBaseMultiTarget(t *testing.T) { `, []string{"lib32/foo", "lib64/foo", "lib64/bar"}) } -func TestSkipInstallProducesLocalUninstallableModule(t *testing.T) { - result := GroupFixturePreparers( - PrepareForTestWithArchMutator, - FixtureRegisterWithContext(func(ctx RegistrationContext) { - ctx.RegisterModuleType("component", componentTestModuleFactory) - ctx.RegisterModuleType("package_module", packageTestModuleFactory) - }), - FixtureWithRootAndroidBp(` -component { - name: "foo", - skip_install: true, -} - -package_module { - name: "package", - deps: ["foo"], -} -`), - ).RunTest(t) - module := result.ModuleForTests("foo", "android_arm64_armv8-a").Module().(*componentTestModule) - entries := AndroidMkEntriesForTest(t, result.TestContext, module) - builder := &strings.Builder{} - entries[0].write(builder) - androidMkString := builder.String() - if !strings.Contains(androidMkString, "LOCAL_UNINSTALLABLE_MODULE := true") { - t.Errorf("Expected android mk entries to contain \"LOCAL_UNINSTALLABLE_MODULE := true\", got: \n%s", androidMkString) - } -} - func TestPackagingBaseSingleTarget(t *testing.T) { multiTarget := false runPackagingTest(t, multiTarget, diff --git a/cc/cc.go b/cc/cc.go index 6e2a3dd51..400814d00 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -609,6 +609,7 @@ type installer interface { inSanitizerDir() bool hostToolPath() android.OptionalPath relativeInstallPath() string + makeUninstallable(mod *Module) installInRoot() bool } @@ -3524,6 +3525,14 @@ func (c *Module) InstallInRecovery() bool { return c.InRecovery() } +func (c *Module) MakeUninstallable() { + if c.installer == nil { + c.ModuleBase.MakeUninstallable() + return + } + c.installer.makeUninstallable(c) +} + func (c *Module) HostToolPath() android.OptionalPath { if c.installer == nil { return android.OptionalPath{} diff --git a/cc/installer.go b/cc/installer.go index c3618b7c1..e2c0e7b8d 100644 --- a/cc/installer.go +++ b/cc/installer.go @@ -121,6 +121,10 @@ func (installer *baseInstaller) relativeInstallPath() string { return String(installer.Properties.Relative_install_path) } +func (installer *baseInstaller) makeUninstallable(mod *Module) { + mod.ModuleBase.MakeUninstallable() +} + func (installer *baseInstaller) installInRoot() bool { return Bool(installer.Properties.Install_in_root) } diff --git a/cc/library.go b/cc/library.go index 842a05fcd..68de233b4 100644 --- a/cc/library.go +++ b/cc/library.go @@ -2439,6 +2439,17 @@ func (library *libraryDecorator) installable() *bool { return nil } +func (library *libraryDecorator) makeUninstallable(mod *Module) { + if library.static() && library.buildStatic() && !library.buildStubs() { + // If we're asked to make a static library uninstallable we don't do + // anything since AndroidMkEntries always sets LOCAL_UNINSTALLABLE_MODULE + // for these entries. This is done to still get the make targets for NOTICE + // files from notice_files.mk, which other libraries might depend on. + return + } + mod.ModuleBase.MakeUninstallable() +} + func (library *libraryDecorator) getPartition() string { return library.path.Partition() } diff --git a/cc/prebuilt.go b/cc/prebuilt.go index c237d751f..5b7ba4346 100644 --- a/cc/prebuilt.go +++ b/cc/prebuilt.go @@ -214,7 +214,7 @@ func (p *prebuiltLibraryLinker) link(ctx ModuleContext, // without the prefix hack below. if p.hasStubsVariants() && !p.buildStubs() && !ctx.Host() && !strings.HasPrefix(ctx.baseModuleName(), "libclang_rt.") { - ctx.Module().SkipInstall() + ctx.Module().MakeUninstallable() } return outputFile diff --git a/java/androidmk.go b/java/androidmk.go index 23005a838..d90e6df6b 100644 --- a/java/androidmk.go +++ b/java/androidmk.go @@ -76,6 +76,9 @@ func (library *Library) AndroidMkEntries() []android.AndroidMkEntries { entriesList = append(entriesList, dexpreoptEntries...) } entriesList = append(entriesList, android.AndroidMkEntries{Disabled: true}) + } else if !library.ApexModuleBase.AvailableFor(android.AvailableToPlatform) { + // Platform variant. If not available for the platform, we don't need Make module. + entriesList = append(entriesList, android.AndroidMkEntries{Disabled: true}) } else { entriesList = append(entriesList, android.AndroidMkEntries{ Class: "JAVA_LIBRARIES", @@ -91,8 +94,7 @@ func (library *Library) AndroidMkEntries() []android.AndroidMkEntries { entries.AddStrings("LOCAL_LOGTAGS_FILES", logtags...) } - if library.installFile == nil || !library.ApexModuleBase.AvailableFor(android.AvailableToPlatform) { - // If the ApexModule is not available for the platform, it shouldn't be installed. + if library.installFile == nil { entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", true) } if library.dexJarFile.IsSet() {