Fix missing NOTICE targets for static libs that aren't available to
platform. The NOTICE file generation depends on the NOTICE targets for all static library dependencies. If such a dependency didn't have //apex_available:platform it didn't get any AndroidMk entry and hence no NOTICE target via soong_cc_prebuilt.mk. If it was then depended upon by a binary or library that is accessible to platform, the NOTICE dependency failed. Normally such a dependency is invalid, but there are corner cases where binaries go neither into platform nor any APEX module, and they can legitimately have such dependencies (cf. b/152241137). With this CL requests to skip installation of such a static libraries are ignored so that they get AndroidMk entries, which will always have LOCAL_UNINSTALLABLE_MODULE set. Test: "m simpleperf_ndk" with https://r.android.com/1273016, which removes //apex_available:platform from libs that simpleperf_ndk depends on statically. Bug: 152241137 Bug: 149217815 Change-Id: If36e85dd16ade56d4ec1d6744811df5a15b6242c
This commit is contained in:
@@ -248,6 +248,10 @@ func (library *libraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries
|
|||||||
entries.SubName = "." + library.stubsVersion()
|
entries.SubName = "." + library.stubsVersion()
|
||||||
}
|
}
|
||||||
entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) {
|
entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) {
|
||||||
|
// Note library.skipInstall() has a special case to get here for static
|
||||||
|
// libraries that otherwise would have skipped installation and hence not
|
||||||
|
// have executed AndroidMkEntries at all. The reason is to ensure they get
|
||||||
|
// a NOTICE file make target which other libraries might depend on.
|
||||||
entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
|
entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
|
||||||
if library.buildStubs() {
|
if library.buildStubs() {
|
||||||
entries.SetBool("LOCAL_NO_NOTICE_FILE", true)
|
entries.SetBool("LOCAL_NO_NOTICE_FILE", true)
|
||||||
|
9
cc/cc.go
9
cc/cc.go
@@ -389,6 +389,7 @@ type installer interface {
|
|||||||
inSanitizerDir() bool
|
inSanitizerDir() bool
|
||||||
hostToolPath() android.OptionalPath
|
hostToolPath() android.OptionalPath
|
||||||
relativeInstallPath() string
|
relativeInstallPath() string
|
||||||
|
skipInstall(mod *Module)
|
||||||
}
|
}
|
||||||
|
|
||||||
type xref interface {
|
type xref interface {
|
||||||
@@ -2590,6 +2591,14 @@ func (c *Module) InstallInRecovery() bool {
|
|||||||
return c.InRecovery()
|
return c.InRecovery()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Module) SkipInstall() {
|
||||||
|
if c.installer == nil {
|
||||||
|
c.ModuleBase.SkipInstall()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.installer.skipInstall(c)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Module) HostToolPath() android.OptionalPath {
|
func (c *Module) HostToolPath() android.OptionalPath {
|
||||||
if c.installer == nil {
|
if c.installer == nil {
|
||||||
return android.OptionalPath{}
|
return android.OptionalPath{}
|
||||||
|
@@ -106,3 +106,7 @@ func (installer *baseInstaller) hostToolPath() android.OptionalPath {
|
|||||||
func (installer *baseInstaller) relativeInstallPath() string {
|
func (installer *baseInstaller) relativeInstallPath() string {
|
||||||
return String(installer.Properties.Relative_install_path)
|
return String(installer.Properties.Relative_install_path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (installer *baseInstaller) skipInstall(mod *Module) {
|
||||||
|
mod.ModuleBase.SkipInstall()
|
||||||
|
}
|
||||||
|
@@ -1329,6 +1329,18 @@ func (library *libraryDecorator) availableFor(what string) bool {
|
|||||||
return android.CheckAvailableForApex(what, list)
|
return android.CheckAvailableForApex(what, list)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (library *libraryDecorator) skipInstall(mod *Module) {
|
||||||
|
if library.static() && library.buildStatic() && !library.buildStubs() {
|
||||||
|
// If we're asked to skip installation of a static library (in particular
|
||||||
|
// when it's not //apex_available:platform) we still want an AndroidMk entry
|
||||||
|
// for it to ensure we get the relevant NOTICE file targets (cf.
|
||||||
|
// notice_files.mk) that other libraries might depend on. AndroidMkEntries
|
||||||
|
// always sets LOCAL_UNINSTALLABLE_MODULE for these entries.
|
||||||
|
return
|
||||||
|
}
|
||||||
|
mod.ModuleBase.SkipInstall()
|
||||||
|
}
|
||||||
|
|
||||||
var versioningMacroNamesListKey = android.NewOnceKey("versioningMacroNamesList")
|
var versioningMacroNamesListKey = android.NewOnceKey("versioningMacroNamesList")
|
||||||
|
|
||||||
func versioningMacroNamesList(config android.Config) *map[string]string {
|
func versioningMacroNamesList(config android.Config) *map[string]string {
|
||||||
|
@@ -155,6 +155,10 @@ func (p *prebuiltLibraryLinker) disablePrebuilt() {
|
|||||||
p.properties.Srcs = nil
|
p.properties.Srcs = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *prebuiltLibraryLinker) skipInstall(mod *Module) {
|
||||||
|
mod.ModuleBase.SkipInstall()
|
||||||
|
}
|
||||||
|
|
||||||
func NewPrebuiltLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
|
func NewPrebuiltLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) {
|
||||||
module, library := NewLibrary(hod)
|
module, library := NewLibrary(hod)
|
||||||
module.compiler = nil
|
module.compiler = nil
|
||||||
@@ -163,6 +167,7 @@ func NewPrebuiltLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDec
|
|||||||
libraryDecorator: library,
|
libraryDecorator: library,
|
||||||
}
|
}
|
||||||
module.linker = prebuilt
|
module.linker = prebuilt
|
||||||
|
module.installer = prebuilt
|
||||||
|
|
||||||
module.AddProperties(&prebuilt.properties)
|
module.AddProperties(&prebuilt.properties)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user