Add default_shared_libs property
Building against a locally-built libc besides bionic requires setting
system_shared_libs to avoid circular dependencies, but modules all
over the tree assume that system_shared_libs only affects modules
building against bionic. Add a new default_shared_libs property
that applies to all modules, which will generally be set in
arch-specific clauses to only affect the desired set of modules.
Bug: 190084016
Test: m checkbuild
Change-Id: Ia2349d84c70e503916f90a5d2702e135248f73df
diff --git a/cc/cc.go b/cc/cc.go
index 0c9f945..d11357f 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -571,7 +571,8 @@
sharedLibs []string
// Note nil and [] are semantically distinct. [] prevents linking against the defaults (usually
// libc, libm, etc.)
- systemSharedLibs []string
+ systemSharedLibs []string
+ defaultSharedLibs []string
}
// installer is the interface for an installer helper object. This helper is responsible for
diff --git a/cc/library.go b/cc/library.go
index 95f9b0a..c0d1345 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -147,11 +147,12 @@
Cflags []string `android:"arch_variant"`
- Enabled *bool `android:"arch_variant"`
- Whole_static_libs []string `android:"arch_variant"`
- Static_libs []string `android:"arch_variant"`
- Shared_libs []string `android:"arch_variant"`
- System_shared_libs []string `android:"arch_variant"`
+ Enabled *bool `android:"arch_variant"`
+ Whole_static_libs []string `android:"arch_variant"`
+ Static_libs []string `android:"arch_variant"`
+ Shared_libs []string `android:"arch_variant"`
+ System_shared_libs []string `android:"arch_variant"`
+ Default_shared_libs []string `android:"arch_variant"`
Export_shared_lib_headers []string `android:"arch_variant"`
Export_static_lib_headers []string `android:"arch_variant"`
@@ -1156,11 +1157,17 @@
if library.StaticProperties.Static.System_shared_libs != nil {
library.baseLinker.Properties.System_shared_libs = library.StaticProperties.Static.System_shared_libs
}
+ if library.StaticProperties.Static.Default_shared_libs != nil {
+ library.baseLinker.Properties.Default_shared_libs = library.StaticProperties.Static.Default_shared_libs
+ }
} else if library.shared() {
// Compare with nil because an empty list needs to be propagated.
if library.SharedProperties.Shared.System_shared_libs != nil {
library.baseLinker.Properties.System_shared_libs = library.SharedProperties.Shared.System_shared_libs
}
+ if library.SharedProperties.Shared.Default_shared_libs != nil {
+ library.baseLinker.Properties.Default_shared_libs = library.SharedProperties.Shared.Default_shared_libs
+ }
}
deps = library.baseLinker.linkerDeps(ctx, deps)
@@ -1242,6 +1249,11 @@
} else {
specifiedDeps.systemSharedLibs = append(specifiedDeps.systemSharedLibs, properties.System_shared_libs...)
}
+ if specifiedDeps.defaultSharedLibs == nil {
+ specifiedDeps.defaultSharedLibs = properties.Default_shared_libs
+ } else {
+ specifiedDeps.defaultSharedLibs = append(specifiedDeps.defaultSharedLibs, properties.Default_shared_libs...)
+ }
specifiedDeps.sharedLibs = android.FirstUniqueStrings(specifiedDeps.sharedLibs)
if len(specifiedDeps.systemSharedLibs) > 0 {
@@ -1249,6 +1261,11 @@
// retained.
specifiedDeps.systemSharedLibs = android.FirstUniqueStrings(specifiedDeps.systemSharedLibs)
}
+ if len(specifiedDeps.defaultSharedLibs) > 0 {
+ // Skip this if defaultSharedLibs is either nil or [], to ensure they are
+ // retained.
+ specifiedDeps.defaultSharedLibs = android.FirstUniqueStrings(specifiedDeps.defaultSharedLibs)
+ }
return specifiedDeps
}
diff --git a/cc/library_sdk_member.go b/cc/library_sdk_member.go
index 9010a1a..9ad2742 100644
--- a/cc/library_sdk_member.go
+++ b/cc/library_sdk_member.go
@@ -258,6 +258,12 @@
outputProperties.AddPropertyWithTag("system_shared_libs", libInfo.SystemSharedLibs, builder.SdkMemberReferencePropertyTag(false))
}
+ // SystemSharedLibs needs to be propagated if it's a list, even if it's empty,
+ // so check for non-nil instead of nonzero length.
+ if libInfo.DefaultSharedLibs != nil {
+ outputProperties.AddPropertyWithTag("default_shared_libs", libInfo.DefaultSharedLibs, builder.SdkMemberReferencePropertyTag(false))
+ }
+
// Map from property name to the include dirs to add to the prebuilt module in the snapshot.
includeDirs := make(map[string][]string)
@@ -387,6 +393,12 @@
// This field is exported as its contents may not be arch specific.
SystemSharedLibs []string `android:"arch_variant"`
+ // The set of default shared libraries. Note nil and [] are semantically
+ // distinct - see BaseLinkerProperties.Default_shared_libs.
+ //
+ // This field is exported as its contents may not be arch specific.
+ DefaultSharedLibs []string `android:"arch_variant"`
+
// The specific stubs version for the lib variant, or empty string if stubs
// are not in use.
//
@@ -462,6 +474,7 @@
}
}
p.SystemSharedLibs = specifiedDeps.systemSharedLibs
+ p.DefaultSharedLibs = specifiedDeps.defaultSharedLibs
}
p.ExportedGeneratedHeaders = exportedInfo.GeneratedHeaders
diff --git a/cc/linker.go b/cc/linker.go
index 7b16b40..13df232 100644
--- a/cc/linker.go
+++ b/cc/linker.go
@@ -45,11 +45,18 @@
// list of module-specific flags that will be used for all link steps
Ldflags []string `android:"arch_variant"`
- // list of system libraries that will be dynamically linked to
- // shared library and executable modules. If unset, generally defaults to libc,
- // libm, and libdl. Set to [] to prevent linking against the defaults.
+ // list of system libraries that will be dynamically linked to shared library and executable
+ // modules that build against bionic (device or Linux bionic modules). If unset, generally
+ // defaults to libc, libm, and libdl. Set to [] to prevent linking against the defaults.
+ // Equivalent to default_shared_libs for modules that build against bionic, and ignored on
+ // modules that do not build against bionic.
System_shared_libs []string `android:"arch_variant"`
+ // list of system libraries that will be dynamically linked to shared library and executable
+ // modules. If unset, generally defaults to libc, libm, and libdl. Set to [] to prevent
+ // linking against the defaults. Equivalent to system_shared_libs, but applies to all modules.
+ Default_shared_libs []string `android:"arch_variant"`
+
// allow the module to contain undefined symbols. By default,
// modules cannot contain undefined symbols that are not satisified by their immediate
// dependencies. Set this flag to true to remove --no-undefined from the linker flags.
@@ -231,6 +238,19 @@
linker.Properties.Ldflags = append(linker.Properties.Ldflags, flags...)
}
+// overrideDefaultSharedLibraries returns the contents of the default_shared_libs or
+// system_shared_libs properties, and records an error if both are set.
+func (linker *baseLinker) overrideDefaultSharedLibraries(ctx BaseModuleContext) []string {
+ if linker.Properties.System_shared_libs != nil && linker.Properties.Default_shared_libs != nil {
+ ctx.PropertyErrorf("system_shared_libs", "cannot be specified if default_shared_libs is also specified")
+ }
+ if ctx.toolchain().Bionic() && linker.Properties.System_shared_libs != nil {
+ // system_shared_libs is only honored when building against bionic.
+ return linker.Properties.System_shared_libs
+ }
+ return linker.Properties.Default_shared_libs
+}
+
// linkerInit initializes dynamic properties of the linker (such as runpath).
func (linker *baseLinker) linkerInit(ctx BaseModuleContext) {
if ctx.toolchain().Is64Bit() {
@@ -331,22 +351,22 @@
deps.SharedLibs = append(deps.SharedLibs, linker.Properties.Target.Platform.Shared_libs...)
}
+ deps.SystemSharedLibs = linker.overrideDefaultSharedLibraries(ctx)
+ // In Bazel conversion mode, variations have not been specified, so SystemSharedLibs may
+ // inaccuarately appear unset, which can cause issues with circular dependencies.
+ if deps.SystemSharedLibs == nil && !ctx.BazelConversionMode() {
+ // Provide a default set of shared libraries if default_shared_libs and system_shared_libs
+ // are unspecified. Note: If an empty list [] is specified, it implies that the module
+ // declines the default shared libraries.
+ deps.SystemSharedLibs = append(deps.SystemSharedLibs, ctx.toolchain().DefaultSharedLibraries()...)
+ }
+
if ctx.toolchain().Bionic() {
// libclang_rt.builtins has to be last on the command line
if !Bool(linker.Properties.No_libcrt) && !ctx.header() {
deps.LateStaticLibs = append(deps.LateStaticLibs, config.BuiltinsRuntimeLibrary(ctx.toolchain()))
}
- deps.SystemSharedLibs = linker.Properties.System_shared_libs
- // In Bazel conversion mode, variations have not been specified, so SystemSharedLibs may
- // inaccuarately appear unset, which can cause issues with circular dependencies.
- if deps.SystemSharedLibs == nil && !ctx.BazelConversionMode() {
- // Provide a default system_shared_libs if it is unspecified. Note: If an
- // empty list [] is specified, it implies that the module declines the
- // default system_shared_libs.
- deps.SystemSharedLibs = append(deps.SystemSharedLibs, ctx.toolchain().DefaultSharedLibraries()...)
- }
-
if inList("libdl", deps.SharedLibs) {
// If system_shared_libs has libc but not libdl, make sure shared_libs does not
// have libdl to avoid loading libdl before libc.
@@ -573,6 +593,11 @@
} else {
specifiedDeps.systemSharedLibs = append(specifiedDeps.systemSharedLibs, linker.Properties.System_shared_libs...)
}
+ if specifiedDeps.defaultSharedLibs == nil {
+ specifiedDeps.defaultSharedLibs = linker.Properties.Default_shared_libs
+ } else {
+ specifiedDeps.defaultSharedLibs = append(specifiedDeps.defaultSharedLibs, linker.Properties.Default_shared_libs...)
+ }
return specifiedDeps
}