Broaden the granularity of config_setting from apex_name to api_domain
The use case for this is for creating a select statement for stub/impl
selection. Since Bazel propagates apex_name from the top-level apex,
the source apex and test apex builds a specific library in two different
configurations. We need select statements for both these two
configurations, but this metadata might not always exist in Android.bp
since test apexes are not necessary to be listed in Android.bp files.
To overcome this, the select statements will be created per api domain
instead. This CL uses a naming convention to infer the api domain of
apexes.
Test: go test ./bp2build
Change-Id: Iad2b45f736bc98a24d2ce1cf2f69aad67973092d
diff --git a/cc/bp2build.go b/cc/bp2build.go
index 749fce5..6e91bff 100644
--- a/cc/bp2build.go
+++ b/cc/bp2build.go
@@ -1194,16 +1194,30 @@
}
var (
- apexConfigSettingKey = android.NewOnceKey("apexConfigSetting")
- apexConfigSettingLock sync.Mutex
+ apiDomainConfigSettingKey = android.NewOnceKey("apiDomainConfigSettingKey")
+ apiDomainConfigSettingLock sync.Mutex
)
-func getApexConfigSettingMap(config android.Config) *map[string]bool {
- return config.Once(apexConfigSettingKey, func() interface{} {
+func getApiDomainConfigSettingMap(config android.Config) *map[string]bool {
+ return config.Once(apiDomainConfigSettingKey, func() interface{} {
return &map[string]bool{}
}).(*map[string]bool)
}
+var (
+ testApexNameToApiDomain = map[string]string{
+ "test_broken_com.android.art": "com.android.art",
+ }
+)
+
+func getApiDomain(apexName string) string {
+ if apiDomain, exists := testApexNameToApiDomain[apexName]; exists {
+ return apiDomain
+ }
+ // Remove `test_` prefix
+ return strings.TrimPrefix(apexName, "test_")
+}
+
// Create a config setting for this apex in build/bazel/rules/apex
// The use case for this is stub/impl selection in cc libraries
// Long term, these config_setting(s) should be colocated with the respective apex definitions.
@@ -1215,23 +1229,32 @@
// These correspond to android-non_apex and android-in_apex
return
}
- apexConfigSettingLock.Lock()
- defer apexConfigSettingLock.Unlock()
+ apiDomainConfigSettingLock.Lock()
+ defer apiDomainConfigSettingLock.Unlock()
// Return if a config_setting has already been created
- acsm := getApexConfigSettingMap(ctx.Config())
- if _, exists := (*acsm)[apexName]; exists {
+ apiDomain := getApiDomain(apexName)
+ acsm := getApiDomainConfigSettingMap(ctx.Config())
+ if _, exists := (*acsm)[apiDomain]; exists {
return
}
- (*acsm)[apexName] = true
+ (*acsm)[apiDomain] = true
csa := bazel.ConfigSettingAttributes{
Flag_values: bazel.StringMapAttribute{
- "//build/bazel/rules/apex:apex_name": apexName,
+ "//build/bazel/rules/apex:api_domain": apiDomain,
},
+ // Constraint this to android
+ Constraint_values: bazel.MakeLabelListAttribute(
+ bazel.MakeLabelList(
+ []bazel.Label{
+ bazel.Label{Label: "//build/bazel/platforms/os:android"},
+ },
+ ),
+ ),
}
ca := android.CommonAttributes{
- Name: "android-in_" + apexName,
+ Name: apiDomain,
}
ctx.CreateBazelConfigSetting(
csa,
@@ -1247,7 +1270,8 @@
if apexAvailable == android.AvailableToAnyApex {
return bazel.AndroidAndInApex
}
- return "//build/bazel/rules/apex:android-in_" + apexAvailable
+ apiDomain := getApiDomain(apexAvailable)
+ return "//build/bazel/rules/apex:" + apiDomain
}
func setStubsForDynamicDeps(ctx android.BazelConversionPathContext, axis bazel.ConfigurationAxis,