Ignore test apexes from bp2build generated tags
The core problem I am trying to solve is making sure that stub libraries in Bazel have a single apex available. In Soong, this will be enforced using some graph walk which is not easy to port to Bazel. However, we might need to revisit this when we build the enforcement mechanism in Bazel. We likely need a `test_for` on the top level apex_test Bazel rule so that the test apex is _allowed_ to link against impl of the library it is trying to test. (This CL retricts this to cc_library, I can expand this to other modules if this is the right approach.) Bug: 277651159 Change-Id: Iaeec22c5626df79a33785c766ed29102b1da403e
This commit is contained in:
@@ -462,6 +462,14 @@ const (
|
|||||||
AvailableToGkiApex = "com.android.gki.*"
|
AvailableToGkiApex = "com.android.gki.*"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
AvailableToRecognziedWildcards = []string{
|
||||||
|
AvailableToPlatform,
|
||||||
|
AvailableToAnyApex,
|
||||||
|
AvailableToGkiApex,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
// CheckAvailableForApex provides the default algorithm for checking the apex availability. When the
|
// CheckAvailableForApex provides the default algorithm for checking the apex availability. When the
|
||||||
// availability is empty, it defaults to ["//apex_available:platform"] which means "available to the
|
// availability is empty, it defaults to ["//apex_available:platform"] which means "available to the
|
||||||
// platform but not available to any APEX". When the list is not empty, `what` is matched against
|
// platform but not available to any APEX". When the list is not empty, `what` is matched against
|
||||||
@@ -926,3 +934,9 @@ func CheckMinSdkVersion(ctx ModuleContext, minSdkVersion ApiLevel, walk WalkPayl
|
|||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Implemented by apexBundle.
|
||||||
|
type ApexTestInterface interface {
|
||||||
|
// Return true if the apex bundle is an apex_test
|
||||||
|
IsTestApex() bool
|
||||||
|
}
|
||||||
|
@@ -758,6 +758,35 @@ func ApexAvailableTags(mod Module) bazel.StringListAttribute {
|
|||||||
return attr
|
return attr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ApexAvailableTagsWithoutTestApexes(ctx BaseModuleContext, mod Module) bazel.StringListAttribute {
|
||||||
|
attr := bazel.StringListAttribute{}
|
||||||
|
if am, ok := mod.(ApexModule); ok {
|
||||||
|
apexAvailableWithoutTestApexes := removeTestApexes(ctx, am.apexModuleBase().ApexAvailable())
|
||||||
|
// If a user does not specify apex_available in Android.bp, then soong provides a default.
|
||||||
|
// To avoid verbosity of BUILD files, remove this default from user-facing BUILD files.
|
||||||
|
if len(am.apexModuleBase().ApexProperties.Apex_available) == 0 {
|
||||||
|
apexAvailableWithoutTestApexes = []string{}
|
||||||
|
}
|
||||||
|
attr.Value = ConvertApexAvailableToTags(apexAvailableWithoutTestApexes)
|
||||||
|
}
|
||||||
|
return attr
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeTestApexes(ctx BaseModuleContext, apex_available []string) []string {
|
||||||
|
testApexes := []string{}
|
||||||
|
for _, aa := range apex_available {
|
||||||
|
// ignore the wildcards
|
||||||
|
if InList(aa, AvailableToRecognziedWildcards) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
mod, _ := ctx.ModuleFromName(aa)
|
||||||
|
if apex, ok := mod.(ApexTestInterface); ok && apex.IsTestApex() {
|
||||||
|
testApexes = append(testApexes, aa)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RemoveListFromList(CopyOf(apex_available), testApexes)
|
||||||
|
}
|
||||||
|
|
||||||
func ConvertApexAvailableToTags(apexAvailable []string) []string {
|
func ConvertApexAvailableToTags(apexAvailable []string) []string {
|
||||||
if len(apexAvailable) == 0 {
|
if len(apexAvailable) == 0 {
|
||||||
// We need nil specifically to make bp2build not add the tags property at all,
|
// We need nil specifically to make bp2build not add the tags property at all,
|
||||||
|
@@ -3811,3 +3811,7 @@ func makeSharedLibsAttributes(config string, libsLabelList bazel.LabelList,
|
|||||||
func invalidCompileMultilib(ctx android.TopDownMutatorContext, value string) {
|
func invalidCompileMultilib(ctx android.TopDownMutatorContext, value string) {
|
||||||
ctx.PropertyErrorf("compile_multilib", "Invalid value: %s", value)
|
ctx.PropertyErrorf("compile_multilib", "Invalid value: %s", value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *apexBundle) IsTestApex() bool {
|
||||||
|
return a.testApex
|
||||||
|
}
|
||||||
|
@@ -433,11 +433,11 @@ func libraryBp2Build(ctx android.TopDownMutatorContext, m *Module) {
|
|||||||
|
|
||||||
var tagsForStaticVariant bazel.StringListAttribute
|
var tagsForStaticVariant bazel.StringListAttribute
|
||||||
if compilerAttrs.stubsSymbolFile == nil && len(compilerAttrs.stubsVersions.Value) == 0 {
|
if compilerAttrs.stubsSymbolFile == nil && len(compilerAttrs.stubsVersions.Value) == 0 {
|
||||||
tagsForStaticVariant = android.ApexAvailableTags(m)
|
tagsForStaticVariant = android.ApexAvailableTagsWithoutTestApexes(ctx, m)
|
||||||
}
|
}
|
||||||
tagsForStaticVariant.Append(bazel.StringListAttribute{Value: staticAttrs.Apex_available})
|
tagsForStaticVariant.Append(bazel.StringListAttribute{Value: staticAttrs.Apex_available})
|
||||||
|
|
||||||
tagsForSharedVariant := android.ApexAvailableTags(m)
|
tagsForSharedVariant := android.ApexAvailableTagsWithoutTestApexes(ctx, m)
|
||||||
tagsForSharedVariant.Append(bazel.StringListAttribute{Value: sharedAttrs.Apex_available})
|
tagsForSharedVariant.Append(bazel.StringListAttribute{Value: sharedAttrs.Apex_available})
|
||||||
|
|
||||||
ctx.CreateBazelTargetModuleWithRestrictions(staticProps,
|
ctx.CreateBazelTargetModuleWithRestrictions(staticProps,
|
||||||
@@ -3002,7 +3002,7 @@ func sharedOrStaticLibraryBp2Build(ctx android.TopDownMutatorContext, module *Mo
|
|||||||
Bzl_load_location: fmt.Sprintf("//build/bazel/rules/cc:%s.bzl", modType),
|
Bzl_load_location: fmt.Sprintf("//build/bazel/rules/cc:%s.bzl", modType),
|
||||||
}
|
}
|
||||||
|
|
||||||
tags := android.ApexAvailableTags(module)
|
tags := android.ApexAvailableTagsWithoutTestApexes(ctx, module)
|
||||||
|
|
||||||
ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: module.Name(), Tags: tags}, attrs)
|
ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: module.Name(), Tags: tags}, attrs)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user