Refactor mixed build allowlist handling
This refactoring prepares for introduction of bazel prod mode, an
alternative mechanism for mixed builds allowlist handling.
* Decide bazel-mode as close to soong_build main as possible
* BazelContext itself decides whether a module is allowlisted
* Separate bp2build and mixed build allowlist
Test: m nothing, manually verified all modules are mixed build disabled
(via metrics)
Test: USE_BAZEL_ANALYSIS=1 m nothing, manually verified that mixed build
disabled/enabled modules are identical before and after change.
Change-Id: I0f55d8b85000cb4a871a099edc6d7d868d7df509
diff --git a/android/bazel_handler.go b/android/bazel_handler.go
index a5fa043..d87f988 100644
--- a/android/bazel_handler.go
+++ b/android/bazel_handler.go
@@ -27,6 +27,7 @@
"strings"
"sync"
+ "android/soong/android/allowlists"
"android/soong/bazel/cquery"
"android/soong/shared"
@@ -142,8 +143,11 @@
// queued in the BazelContext.
InvokeBazel(config Config) error
- // Returns true if bazel is enabled for the given configuration.
- BazelEnabled() bool
+ // Returns true if Bazel handling is enabled for the module with the given name.
+ // Note that this only implies "bazel mixed build" allowlisting. The caller
+ // should independently verify the module is eligible for Bazel handling
+ // (for example, that it is MixedBuildBuildable).
+ BazelAllowlisted(moduleName string) bool
// Returns the bazel output base (the root directory for all bazel intermediate outputs).
OutputBase() string
@@ -183,6 +187,17 @@
// Depsets which should be used for Bazel's build statements.
depsets []bazel.AqueryDepset
+
+ // Per-module allowlist/denylist functionality to control whether analysis of
+ // modules are handled by Bazel. For modules which do not have a Bazel definition
+ // (or do not sufficiently support bazel handling via MixedBuildBuildable),
+ // this allowlist will have no effect, even if the module is explicitly allowlisted here.
+ // Per-module denylist to opt modules out of bazel handling.
+ bazelDisabledModules map[string]bool
+ // Per-module allowlist to opt modules in to bazel handling.
+ bazelEnabledModules map[string]bool
+ // If true, modules are bazel-enabled by default, unless present in bazelDisabledModules.
+ modulesDefaultToBazel bool
}
var _ BazelContext = &bazelContext{}
@@ -229,7 +244,7 @@
panic("unimplemented")
}
-func (m MockBazelContext) BazelEnabled() bool {
+func (m MockBazelContext) BazelAllowlisted(moduleName string) bool {
return true
}
@@ -315,7 +330,7 @@
return ""
}
-func (n noopBazelContext) BazelEnabled() bool {
+func (n noopBazelContext) BazelAllowlisted(moduleName string) bool {
return false
}
@@ -328,9 +343,7 @@
}
func NewBazelContext(c *config) (BazelContext, error) {
- // TODO(cparsons): Assess USE_BAZEL=1 instead once "mixed Soong/Bazel builds"
- // are production ready.
- if !c.IsEnvTrue("USE_BAZEL_ANALYSIS") {
+ if !c.IsMixedBuildsEnabled() {
return noopBazelContext{}, nil
}
@@ -338,10 +351,26 @@
if err != nil {
return nil, err
}
+
+ // TODO(cparsons): Use a different allowlist depending on prod vs. dev
+ // bazel mode.
+ disabledModules := map[string]bool{}
+ // Don't use partially-converted cc_library targets in mixed builds,
+ // since mixed builds would generally rely on both static and shared
+ // variants of a cc_library.
+ for staticOnlyModule, _ := range GetBp2BuildAllowList().ccLibraryStaticOnly {
+ disabledModules[staticOnlyModule] = true
+ }
+ for _, disabledDevModule := range allowlists.MixedBuildsDisabledList {
+ disabledModules[disabledDevModule] = true
+ }
+
return &bazelContext{
- bazelRunner: &builtinBazelRunner{},
- paths: p,
- requests: make(map[cqueryKey]bool),
+ bazelRunner: &builtinBazelRunner{},
+ paths: p,
+ requests: make(map[cqueryKey]bool),
+ modulesDefaultToBazel: true,
+ bazelDisabledModules: disabledModules,
}, nil
}
@@ -386,8 +415,14 @@
return p.metricsDir
}
-func (context *bazelContext) BazelEnabled() bool {
- return true
+func (context *bazelContext) BazelAllowlisted(moduleName string) bool {
+ if context.bazelDisabledModules[moduleName] {
+ return false
+ }
+ if context.bazelEnabledModules[moduleName] {
+ return true
+ }
+ return context.modulesDefaultToBazel
}
func pwdPrefix() string {
@@ -851,7 +886,7 @@
func (c *bazelSingleton) GenerateBuildActions(ctx SingletonContext) {
// bazelSingleton is a no-op if mixed-soong-bazel-builds are disabled.
- if !ctx.Config().BazelContext.BazelEnabled() {
+ if !ctx.Config().IsMixedBuildsEnabled() {
return
}