Merge "Support target.apex stanza in bp2build"
diff --git a/bazel/configurability.go b/bazel/configurability.go
index 7ff202b..b6bbd67 100644
--- a/bazel/configurability.go
+++ b/bazel/configurability.go
@@ -69,6 +69,9 @@
AndroidAndInApex = "android-in_apex"
AndroidAndNonApex = "android-non_apex"
+
+ InApex = "in_apex"
+ NonApex = "non_apex"
)
func PowerSetWithoutEmptySet[T any](items []T) [][]T {
@@ -198,6 +201,12 @@
AndroidAndNonApex: "//build/bazel/rules/apex:android-non_apex",
ConditionsDefaultConfigKey: ConditionsDefaultSelectKey,
}
+
+ inApexMap = map[string]string{
+ InApex: "//build/bazel/rules/apex:in_apex",
+ NonApex: "//build/bazel/rules/apex:non_apex",
+ ConditionsDefaultConfigKey: ConditionsDefaultSelectKey,
+ }
)
// basic configuration types
@@ -210,6 +219,7 @@
osArch
productVariables
osAndInApex
+ inApex
)
func osArchString(os string, arch string) string {
@@ -224,6 +234,7 @@
osArch: "arch_os",
productVariables: "product_variables",
osAndInApex: "os_in_apex",
+ inApex: "in_apex",
}[ct]
}
@@ -251,6 +262,10 @@
if _, ok := osAndInApexMap[config]; !ok {
panic(fmt.Errorf("Unknown os+in_apex config: %s", config))
}
+ case inApex:
+ if _, ok := inApexMap[config]; !ok {
+ panic(fmt.Errorf("Unknown in_apex config: %s", config))
+ }
default:
panic(fmt.Errorf("Unrecognized ConfigurationType %d", ct))
}
@@ -276,6 +291,8 @@
return fmt.Sprintf("%s:%s", productVariableBazelPackage, config)
case osAndInApex:
return osAndInApexMap[config]
+ case inApex:
+ return inApexMap[config]
default:
panic(fmt.Errorf("Unrecognized ConfigurationType %d", ca.configurationType))
}
@@ -292,6 +309,8 @@
OsArchConfigurationAxis = ConfigurationAxis{configurationType: osArch}
// An axis for os+in_apex-specific configurations
OsAndInApexAxis = ConfigurationAxis{configurationType: osAndInApex}
+ // An axis for in_apex-specific configurations
+ InApexAxis = ConfigurationAxis{configurationType: inApex}
)
// ProductVariableConfigurationAxis returns an axis for the given product variable
diff --git a/bazel/properties.go b/bazel/properties.go
index 11f6247..c329e41 100644
--- a/bazel/properties.go
+++ b/bazel/properties.go
@@ -720,7 +720,7 @@
switch axis.configurationType {
case noConfig:
lla.Value = list
- case arch, os, osArch, productVariables, osAndInApex:
+ case arch, os, osArch, productVariables, osAndInApex, inApex:
if lla.ConfigurableValues == nil {
lla.ConfigurableValues = make(configurableLabelLists)
}
@@ -736,7 +736,7 @@
switch axis.configurationType {
case noConfig:
return lla.Value
- case arch, os, osArch, productVariables, osAndInApex:
+ case arch, os, osArch, productVariables, osAndInApex, inApex:
return lla.ConfigurableValues[axis][config]
default:
panic(fmt.Errorf("Unrecognized ConfigurationAxis %s", axis))
diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go
index 2d4c6da..1949f4d 100644
--- a/bp2build/cc_library_conversion_test.go
+++ b/bp2build/cc_library_conversion_test.go
@@ -3037,3 +3037,86 @@
},
})
}
+
+func TestCcLibraryWithTargetApex(t *testing.T) {
+ runCcLibraryTestCase(t, Bp2buildTestCase{
+ Description: "cc_library with target.apex",
+ ModuleTypeUnderTest: "cc_library",
+ ModuleTypeUnderTestFactory: cc.LibraryFactory,
+ Blueprint: `
+cc_library {
+ name: "foo",
+ shared_libs: ["bar", "baz"],
+ static_libs: ["baz", "buh"],
+ target: {
+ apex: {
+ exclude_shared_libs: ["bar"],
+ exclude_static_libs: ["buh"],
+ }
+ }
+}`,
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+ "implementation_deps": `[":baz__BP2BUILD__MISSING__DEP"] + select({
+ "//build/bazel/rules/apex:non_apex": [":buh__BP2BUILD__MISSING__DEP"],
+ "//conditions:default": [],
+ })`,
+ "implementation_dynamic_deps": `[":baz__BP2BUILD__MISSING__DEP"] + select({
+ "//build/bazel/rules/apex:non_apex": [":bar__BP2BUILD__MISSING__DEP"],
+ "//conditions:default": [],
+ })`,
+ "local_includes": `["."]`,
+ }),
+ MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+ "implementation_deps": `[":baz__BP2BUILD__MISSING__DEP"] + select({
+ "//build/bazel/rules/apex:non_apex": [":buh__BP2BUILD__MISSING__DEP"],
+ "//conditions:default": [],
+ })`,
+ "implementation_dynamic_deps": `[":baz__BP2BUILD__MISSING__DEP"] + select({
+ "//build/bazel/rules/apex:non_apex": [":bar__BP2BUILD__MISSING__DEP"],
+ "//conditions:default": [],
+ })`,
+ "local_includes": `["."]`,
+ }),
+ },
+ })
+}
+
+func TestCcLibraryWithTargetApexAndExportLibHeaders(t *testing.T) {
+ runCcLibraryTestCase(t, Bp2buildTestCase{
+ Description: "cc_library with target.apex and export_shared|static_lib_headers",
+ ModuleTypeUnderTest: "cc_library",
+ ModuleTypeUnderTestFactory: cc.LibraryFactory,
+ Blueprint: `
+cc_library_static {
+ name: "foo",
+ shared_libs: ["bar", "baz"],
+ static_libs: ["abc"],
+ export_shared_lib_headers: ["baz"],
+ export_static_lib_headers: ["abc"],
+ target: {
+ apex: {
+ exclude_shared_libs: ["baz", "bar"],
+ exclude_static_libs: ["abc"],
+ }
+ }
+}`,
+ ExpectedBazelTargets: []string{
+ MakeBazelTarget("cc_library_static", "foo", AttrNameToString{
+ "implementation_dynamic_deps": `select({
+ "//build/bazel/rules/apex:non_apex": [":bar__BP2BUILD__MISSING__DEP"],
+ "//conditions:default": [],
+ })`,
+ "dynamic_deps": `select({
+ "//build/bazel/rules/apex:non_apex": [":baz__BP2BUILD__MISSING__DEP"],
+ "//conditions:default": [],
+ })`,
+ "deps": `select({
+ "//build/bazel/rules/apex:non_apex": [":abc__BP2BUILD__MISSING__DEP"],
+ "//conditions:default": [],
+ })`,
+ "local_includes": `["."]`,
+ }),
+ },
+ })
+}
diff --git a/cc/bp2build.go b/cc/bp2build.go
index 63151ad..7a5657a 100644
--- a/cc/bp2build.go
+++ b/cc/bp2build.go
@@ -840,6 +840,38 @@
soongSystemSharedLibs = []string{"libc", "libm", "libdl"}
)
+// resolveTargetApex re-adds the shared and static libs in target.apex.exclude_shared|static_libs props to non-apex variant
+// since all libs are already excluded by default
+func (la *linkerAttributes) resolveTargetApexProp(ctx android.BazelConversionPathContext, isBinary bool, props *BaseLinkerProperties) {
+ sharedLibsForNonApex := maybePartitionExportedAndImplementationsDeps(
+ ctx,
+ true,
+ props.Target.Apex.Exclude_shared_libs,
+ props.Export_shared_lib_headers,
+ bazelLabelForSharedDeps,
+ )
+ dynamicDeps := la.dynamicDeps.SelectValue(bazel.InApexAxis, bazel.NonApex)
+ implDynamicDeps := la.implementationDynamicDeps.SelectValue(bazel.InApexAxis, bazel.NonApex)
+ (&dynamicDeps).Append(sharedLibsForNonApex.export)
+ (&implDynamicDeps).Append(sharedLibsForNonApex.implementation)
+ la.dynamicDeps.SetSelectValue(bazel.InApexAxis, bazel.NonApex, dynamicDeps)
+ la.implementationDynamicDeps.SetSelectValue(bazel.InApexAxis, bazel.NonApex, implDynamicDeps)
+
+ staticLibsForNonApex := maybePartitionExportedAndImplementationsDeps(
+ ctx,
+ !isBinary,
+ props.Target.Apex.Exclude_static_libs,
+ props.Export_static_lib_headers,
+ bazelLabelForSharedDeps,
+ )
+ deps := la.deps.SelectValue(bazel.InApexAxis, bazel.NonApex)
+ implDeps := la.implementationDeps.SelectValue(bazel.InApexAxis, bazel.NonApex)
+ (&deps).Append(staticLibsForNonApex.export)
+ (&implDeps).Append(staticLibsForNonApex.implementation)
+ la.deps.SetSelectValue(bazel.InApexAxis, bazel.NonApex, deps)
+ la.implementationDeps.SetSelectValue(bazel.InApexAxis, bazel.NonApex, implDeps)
+}
+
func (la *linkerAttributes) bp2buildForAxisAndConfig(ctx android.BazelConversionPathContext, isBinary bool, axis bazel.ConfigurationAxis, config string, props *BaseLinkerProperties) {
// Use a single variable to capture usage of nocrt in arch variants, so there's only 1 error message for this module
var axisFeatures []string
@@ -850,7 +882,15 @@
// https://cs.android.com/android/platform/superproject/+/master:build/soong/cc/linker.go;l=247-249;drc=088b53577dde6e40085ffd737a1ae96ad82fc4b0
staticLibs := android.FirstUniqueStrings(android.RemoveListFromList(props.Static_libs, wholeStaticLibs))
- staticDeps := maybePartitionExportedAndImplementationsDepsExcludes(ctx, !isBinary, staticLibs, props.Exclude_static_libs, props.Export_static_lib_headers, bazelLabelForStaticDepsExcludes)
+ staticDeps := maybePartitionExportedAndImplementationsDepsExcludes(
+ ctx,
+ !isBinary,
+ staticLibs,
+ // Exclude static libs in Exclude_static_libs and Target.Apex.Exclude_static_libs props
+ append(props.Exclude_static_libs, props.Target.Apex.Exclude_static_libs...),
+ props.Export_static_lib_headers,
+ bazelLabelForStaticDepsExcludes,
+ )
headerLibs := android.FirstUniqueStrings(props.Header_libs)
hDeps := maybePartitionExportedAndImplementationsDeps(ctx, !isBinary, headerLibs, props.Export_header_lib_headers, bazelLabelForHeaderDeps)
@@ -882,9 +922,19 @@
la.usedSystemDynamicDepAsDynamicDep[el] = true
}
- sharedDeps := maybePartitionExportedAndImplementationsDepsExcludes(ctx, !isBinary, sharedLibs, props.Exclude_shared_libs, props.Export_shared_lib_headers, bazelLabelForSharedDepsExcludes)
+ sharedDeps := maybePartitionExportedAndImplementationsDepsExcludes(
+ ctx,
+ !isBinary,
+ sharedLibs,
+ // Exclude shared libs in Exclude_shared_libs and Target.Apex.Exclude_shared_libs props
+ append(props.Exclude_shared_libs, props.Target.Apex.Exclude_shared_libs...),
+ props.Export_shared_lib_headers,
+ bazelLabelForSharedDepsExcludes,
+ )
la.dynamicDeps.SetSelectValue(axis, config, sharedDeps.export)
la.implementationDynamicDeps.SetSelectValue(axis, config, sharedDeps.implementation)
+ la.resolveTargetApexProp(ctx, isBinary, props)
+
if axis == bazel.NoConfigAxis || (axis == bazel.OsConfigurationAxis && config == bazel.OsAndroid) {
// If a dependency in la.implementationDynamicDeps has stubs, its stub variant should be
// used when the dependency is linked in a APEX. The dependencies in NoConfigAxis and