Introduce runtime_libs to cc_binary and cc_library
This commit adds `runtime_libs` to cc_binary and cc_library.
Similar to the `required` property, if a module specifies the
`runtime_libs` properties and it is installed, then the modules
specified in `runtime_libs` will be installed as well.
Differnt from the `required` property, if a module is using VNDK and the
module names specified in `runtime_libs` are resolved to the modules
with both core and vendor variants, then '.vendor' will be appended to
those module names.
For example, if `libb` is vendor_available and `libd` is a vendor lib,
then LOCAL_REQUIRED_MODULES will contain `libb.vendor` (instead of
`libb`).
Bug: 72343507
Test: lunch aosp_arm64_ab-userdebug && make # this runs the unit tests
Test: Create a vendor module with runtime_libs property to a
vendor_available shared library and check the generated Android.mk.
Change-Id: I9e245d80004dab597a5d3db5acd8a09117118db7
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 5824168..cdd4a5a 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -58,6 +58,8 @@
ret := android.AndroidMkData{
OutputFile: c.outputFile,
+ Required: c.Properties.AndroidMkRuntimeLibs,
+
Extra: []android.AndroidMkExtraFunc{
func(w io.Writer, outputFile android.Path) {
if len(c.Properties.Logtags) > 0 {
diff --git a/cc/cc.go b/cc/cc.go
index 9722cf0..76e6645 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -68,6 +68,7 @@
SharedLibs, LateSharedLibs []string
StaticLibs, LateStaticLibs, WholeStaticLibs []string
HeaderLibs []string
+ RuntimeLibs []string
ReexportSharedLibHeaders, ReexportStaticLibHeaders, ReexportHeaderLibHeaders []string
@@ -164,9 +165,10 @@
// Minimum sdk version supported when compiling against the ndk
Sdk_version *string
- AndroidMkSharedLibs []string `blueprint:"mutated"`
- HideFromMake bool `blueprint:"mutated"`
- PreventInstall bool `blueprint:"mutated"`
+ AndroidMkSharedLibs []string `blueprint:"mutated"`
+ AndroidMkRuntimeLibs []string `blueprint:"mutated"`
+ HideFromMake bool `blueprint:"mutated"`
+ PreventInstall bool `blueprint:"mutated"`
UseVndk bool `blueprint:"mutated"`
@@ -306,6 +308,7 @@
ndkStubDepTag = dependencyTag{name: "ndk stub", library: true}
ndkLateStubDepTag = dependencyTag{name: "ndk late stub", library: true}
vndkExtDepTag = dependencyTag{name: "vndk extends", library: true}
+ runtimeDepTag = dependencyTag{name: "runtime lib"}
)
// Module contains the properties and members used by all C/C++ module types, and implements
@@ -667,7 +670,6 @@
}
func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
-
ctx := &moduleContext{
ModuleContext: actx,
moduleContextImpl: moduleContextImpl{
@@ -846,6 +848,7 @@
deps.SharedLibs = android.LastUniqueStrings(deps.SharedLibs)
deps.LateSharedLibs = android.LastUniqueStrings(deps.LateSharedLibs)
deps.HeaderLibs = android.LastUniqueStrings(deps.HeaderLibs)
+ deps.RuntimeLibs = android.LastUniqueStrings(deps.RuntimeLibs)
for _, lib := range deps.ReexportSharedLibHeaders {
if !inList(lib, deps.SharedLibs) {
@@ -987,6 +990,9 @@
actx.AddVariationDependencies([]blueprint.Variation{{"link", "shared"}}, lateSharedDepTag,
deps.LateSharedLibs...)
+ actx.AddVariationDependencies([]blueprint.Variation{{"link", "shared"}}, runtimeDepTag,
+ deps.RuntimeLibs...)
+
actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
for _, gen := range deps.GeneratedHeaders {
@@ -1346,28 +1352,34 @@
*depPtr = append(*depPtr, dep.Path())
}
- // Export the shared libs to Make.
- switch depTag {
- case sharedDepTag, sharedExportDepTag, lateSharedDepTag:
+ makeLibName := func(depName string) string {
libName := strings.TrimSuffix(depName, llndkLibrarySuffix)
libName = strings.TrimSuffix(libName, vendorPublicLibrarySuffix)
libName = strings.TrimPrefix(libName, "prebuilt_")
isLLndk := inList(libName, llndkLibraries)
isVendorPublicLib := inList(libName, vendorPublicLibraries)
- var makeLibName string
bothVendorAndCoreVariantsExist := ccDep.hasVendorVariant() || isLLndk
if c.useVndk() && bothVendorAndCoreVariantsExist {
// The vendor module in Make will have been renamed to not conflict with the core
// module, so update the dependency name here accordingly.
- makeLibName = libName + vendorSuffix
+ return libName + vendorSuffix
} else if (ctx.Platform() || ctx.ProductSpecific()) && isVendorPublicLib {
- makeLibName = libName + vendorPublicLibrarySuffix
+ return libName + vendorPublicLibrarySuffix
} else {
- makeLibName = libName
+ return libName
}
+ }
+
+ // Export the shared libs to Make.
+ switch depTag {
+ case sharedDepTag, sharedExportDepTag, lateSharedDepTag:
// Note: the order of libs in this list is not important because
// they merely serve as Make dependencies and do not affect this lib itself.
- c.Properties.AndroidMkSharedLibs = append(c.Properties.AndroidMkSharedLibs, makeLibName)
+ c.Properties.AndroidMkSharedLibs = append(
+ c.Properties.AndroidMkSharedLibs, makeLibName(depName))
+ case runtimeDepTag:
+ c.Properties.AndroidMkRuntimeLibs = append(
+ c.Properties.AndroidMkRuntimeLibs, makeLibName(depName))
}
})
diff --git a/cc/cc_test.go b/cc/cc_test.go
index 9b4cc0f..4f26827 100644
--- a/cc/cc_test.go
+++ b/cc/cc_test.go
@@ -1388,6 +1388,120 @@
}
}
+func checkRuntimeLibs(t *testing.T, expected []string, module *Module) {
+ actual := module.Properties.AndroidMkRuntimeLibs
+ if !reflect.DeepEqual(actual, expected) {
+ t.Errorf("incorrect runtime_libs for shared libs"+
+ "\nactual: %v"+
+ "\nexpected: %v",
+ actual,
+ expected,
+ )
+ }
+}
+
+const runtimeLibAndroidBp = `
+ cc_library {
+ name: "libvendor_available1",
+ vendor_available: true,
+ no_libgcc : true,
+ nocrt : true,
+ system_shared_libs : [],
+ }
+ cc_library {
+ name: "libvendor_available2",
+ vendor_available: true,
+ runtime_libs: ["libvendor_available1"],
+ no_libgcc : true,
+ nocrt : true,
+ system_shared_libs : [],
+ }
+ cc_library {
+ name: "libvendor_available3",
+ vendor_available: true,
+ runtime_libs: ["libvendor_available1"],
+ target: {
+ vendor: {
+ exclude_runtime_libs: ["libvendor_available1"],
+ }
+ },
+ no_libgcc : true,
+ nocrt : true,
+ system_shared_libs : [],
+ }
+ cc_library {
+ name: "libcore",
+ runtime_libs: ["libvendor_available1"],
+ no_libgcc : true,
+ nocrt : true,
+ system_shared_libs : [],
+ }
+ cc_library {
+ name: "libvendor1",
+ vendor: true,
+ no_libgcc : true,
+ nocrt : true,
+ system_shared_libs : [],
+ }
+ cc_library {
+ name: "libvendor2",
+ vendor: true,
+ runtime_libs: ["libvendor_available1", "libvendor1"],
+ no_libgcc : true,
+ nocrt : true,
+ system_shared_libs : [],
+ }
+`
+
+func TestRuntimeLibs(t *testing.T) {
+ ctx := testCc(t, runtimeLibAndroidBp)
+
+ // runtime_libs for core variants use the module names without suffixes.
+ variant := "android_arm64_armv8-a_core_shared"
+
+ module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
+ checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
+
+ module = ctx.ModuleForTests("libcore", variant).Module().(*Module)
+ checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
+
+ // runtime_libs for vendor variants have '.vendor' suffixes if the modules have both core
+ // and vendor variants.
+ variant = "android_arm64_armv8-a_vendor_shared"
+
+ module = ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
+ checkRuntimeLibs(t, []string{"libvendor_available1.vendor"}, module)
+
+ module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module)
+ checkRuntimeLibs(t, []string{"libvendor_available1.vendor", "libvendor1"}, module)
+}
+
+func TestExcludeRuntimeLibs(t *testing.T) {
+ ctx := testCc(t, runtimeLibAndroidBp)
+
+ variant := "android_arm64_armv8-a_core_shared"
+ module := ctx.ModuleForTests("libvendor_available3", variant).Module().(*Module)
+ checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
+
+ variant = "android_arm64_armv8-a_vendor_shared"
+ module = ctx.ModuleForTests("libvendor_available3", variant).Module().(*Module)
+ checkRuntimeLibs(t, nil, module)
+}
+
+func TestRuntimeLibsNoVndk(t *testing.T) {
+ ctx := testCcNoVndk(t, runtimeLibAndroidBp)
+
+ // If DeviceVndkVersion is not defined, then runtime_libs are copied as-is.
+
+ variant := "android_arm64_armv8-a_core_shared"
+
+ module := ctx.ModuleForTests("libvendor_available2", variant).Module().(*Module)
+ checkRuntimeLibs(t, []string{"libvendor_available1"}, module)
+
+ module = ctx.ModuleForTests("libvendor2", variant).Module().(*Module)
+ checkRuntimeLibs(t, []string{"libvendor_available1", "libvendor1"}, module)
+}
+
var compilerFlagsTestCases = []struct {
in string
out bool
diff --git a/cc/linker.go b/cc/linker.go
index cde7a6d..71da09e 100644
--- a/cc/linker.go
+++ b/cc/linker.go
@@ -88,15 +88,24 @@
// between static libraries, but it is generally better to order them correctly instead.
Group_static_libs *bool `android:"arch_variant"`
+ // list of modules that should be installed with this module. This is similar to 'required'
+ // but '.vendor' suffix will be appended to the module names if the shared libraries have
+ // vendor variants and this module uses VNDK.
+ Runtime_libs []string `android:"arch_variant"`
+
Target struct {
Vendor struct {
- // list of shared libs that should not be used to build
- // the vendor variant of the C/C++ module.
+ // list of shared libs that should not be used to build the vendor variant
+ // of the C/C++ module.
Exclude_shared_libs []string
- // list of static libs that should not be used to build
- // the vendor variant of the C/C++ module.
+ // list of static libs that should not be used to build the vendor variant
+ // of the C/C++ module.
Exclude_static_libs []string
+
+ // list of runtime libs that should not be installed along with the vendor
+ // variant of the C/C++ module.
+ Exclude_runtime_libs []string
}
}
@@ -137,6 +146,7 @@
deps.HeaderLibs = append(deps.HeaderLibs, linker.Properties.Header_libs...)
deps.StaticLibs = append(deps.StaticLibs, linker.Properties.Static_libs...)
deps.SharedLibs = append(deps.SharedLibs, linker.Properties.Shared_libs...)
+ deps.RuntimeLibs = append(deps.RuntimeLibs, linker.Properties.Runtime_libs...)
deps.ReexportHeaderLibHeaders = append(deps.ReexportHeaderLibHeaders, linker.Properties.Export_header_lib_headers...)
deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, linker.Properties.Export_static_lib_headers...)
@@ -153,6 +163,7 @@
deps.StaticLibs = removeListFromList(deps.StaticLibs, linker.Properties.Target.Vendor.Exclude_static_libs)
deps.ReexportStaticLibHeaders = removeListFromList(deps.ReexportStaticLibHeaders, linker.Properties.Target.Vendor.Exclude_static_libs)
deps.WholeStaticLibs = removeListFromList(deps.WholeStaticLibs, linker.Properties.Target.Vendor.Exclude_static_libs)
+ deps.RuntimeLibs = removeListFromList(deps.RuntimeLibs, linker.Properties.Target.Vendor.Exclude_runtime_libs)
}
if ctx.ModuleName() != "libcompiler_rt-extras" {