Merge "mixed builds: add cc_test bazel handler, and add adbd_test to staging allowlist."
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go
index 0b609f1..5218a58 100644
--- a/android/allowlists/allowlists.go
+++ b/android/allowlists/allowlists.go
@@ -1373,5 +1373,6 @@
// also be built - do not add them to this list.
StagingMixedBuildsEnabledList = []string{
"com.android.adbd",
+ "adbd_test",
}
)
diff --git a/android/bazel_handler.go b/android/bazel_handler.go
index 0b768a7..d132d43 100644
--- a/android/bazel_handler.go
+++ b/android/bazel_handler.go
@@ -667,10 +667,12 @@
mixed_build_root(name = "buildroot",
deps = [%s],
+ testonly = True, # Unblocks testonly deps.
)
phony_root(name = "phonyroot",
deps = [":buildroot"],
+ testonly = True, # Unblocks testonly deps.
)
`
configNodeFormatString := `
@@ -678,6 +680,7 @@
arch = "%s",
os = "%s",
deps = [%s],
+ testonly = True, # Unblocks testonly deps.
)
`
diff --git a/bazel/cquery/request_type.go b/bazel/cquery/request_type.go
index 9feb82b..7c9ae3b 100644
--- a/bazel/cquery/request_type.go
+++ b/bazel/cquery/request_type.go
@@ -11,7 +11,7 @@
GetPythonBinary = &getPythonBinaryRequestType{}
GetCcInfo = &getCcInfoType{}
GetApexInfo = &getApexInfoType{}
- GetCcUnstrippedInfo = &getCcUnstippedInfoType{}
+ GetCcUnstrippedInfo = &getCcUnstrippedInfoType{}
)
type CcInfo struct {
@@ -275,13 +275,13 @@
// getCcUnstrippedInfoType implements cqueryRequest interface. It handles the
// interaction with `bazel cquery` to retrieve CcUnstrippedInfo provided
// by the` cc_binary` and `cc_shared_library` rules.
-type getCcUnstippedInfoType struct{}
+type getCcUnstrippedInfoType struct{}
-func (g getCcUnstippedInfoType) Name() string {
+func (g getCcUnstrippedInfoType) Name() string {
return "getCcUnstrippedInfo"
}
-func (g getCcUnstippedInfoType) StarlarkFunctionBody() string {
+func (g getCcUnstrippedInfoType) StarlarkFunctionBody() string {
return `unstripped_tag = "//build/bazel/rules/cc:stripped_cc_common.bzl%CcUnstrippedInfo"
p = providers(target)
output_path = target.files.to_list()[0].path
@@ -298,7 +298,7 @@
// ParseResult returns a value obtained by parsing the result of the request's Starlark function.
// The given rawString must correspond to the string output which was created by evaluating the
// Starlark given in StarlarkFunctionBody.
-func (g getCcUnstippedInfoType) ParseResult(rawString string) (CcUnstrippedInfo, error) {
+func (g getCcUnstrippedInfoType) ParseResult(rawString string) (CcUnstrippedInfo, error) {
var info CcUnstrippedInfo
err := parseJson(rawString, &info)
return info, err
diff --git a/cc/cc.go b/cc/cc.go
index 632bdca..6ca2575 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -1858,7 +1858,22 @@
c.bazelHandler.QueueBazelCall(ctx, c.getBazelModuleLabel(ctx))
}
+var (
+ mixedBuildSupportedCcTest = []string{
+ "adbd_test",
+ }
+)
+
+// IsMixedBuildSupported returns true if the module should be analyzed by Bazel
+// in any of the --bazel-mode(s). This filters at the module level and takes
+// precedence over the allowlists in allowlists/allowlists.go.
func (c *Module) IsMixedBuildSupported(ctx android.BaseModuleContext) bool {
+ if c.testBinary() && !android.InList(c.Name(), mixedBuildSupportedCcTest) {
+ // Per-module rollout of mixed-builds for cc_test modules.
+ return false
+ }
+
+ // Enable mixed builds as long as the cc_* module type has a bazel handler.
return c.bazelHandler != nil
}
@@ -1888,6 +1903,8 @@
}
mctx.ctx = mctx
+ // TODO(b/244432500): Get the tradefed config from the bazel target instead
+ // of generating it with Soong.
c.maybeInstall(mctx, apexInfo)
}
@@ -2038,6 +2055,9 @@
}
}
+// maybeInstall is called at the end of both GenerateAndroidBuildActions and
+// ProcessBazelQueryResponse to run the install hooks for installable modules,
+// like binaries and tests.
func (c *Module) maybeInstall(ctx ModuleContext, apexInfo android.ApexInfo) {
if !proptools.BoolDefault(c.Installable(), true) {
// If the module has been specifically configure to not be installed then
diff --git a/cc/test.go b/cc/test.go
index dee6ed6..34c1364 100644
--- a/cc/test.go
+++ b/cc/test.go
@@ -23,6 +23,7 @@
"android/soong/android"
"android/soong/bazel"
+ "android/soong/bazel/cquery"
"android/soong/tradefed"
)
@@ -135,6 +136,7 @@
// static_libs dependency on libgtests unless the gtest flag is set to false.
func TestFactory() android.Module {
module := NewTest(android.HostAndDeviceSupported, true)
+ module.bazelHandler = &ccTestBazelHandler{module: module}
return module.Init()
}
@@ -500,6 +502,7 @@
func NewTest(hod android.HostOrDeviceSupported, bazelable bool) *Module {
module, binary := newBinary(hod, bazelable)
+ module.bazelable = bazelable
module.multilib = android.MultilibBoth
binary.baseInstaller = NewTestInstaller()
@@ -663,6 +666,30 @@
return module
}
+type ccTestBazelHandler struct {
+ module *Module
+}
+
+var _ BazelHandler = (*ccTestBazelHandler)(nil)
+
+func (handler *ccTestBazelHandler) QueueBazelCall(ctx android.BaseModuleContext, label string) {
+ bazelCtx := ctx.Config().BazelContext
+ bazelCtx.QueueBazelRequest(label, cquery.GetCcUnstrippedInfo, android.GetConfigKey(ctx))
+}
+
+func (handler *ccTestBazelHandler) ProcessBazelQueryResponse(ctx android.ModuleContext, label string) {
+ bazelCtx := ctx.Config().BazelContext
+ info, err := bazelCtx.GetCcUnstrippedInfo(label, android.GetConfigKey(ctx))
+ if err != nil {
+ ctx.ModuleErrorf(err.Error())
+ return
+ }
+
+ outputFilePath := android.PathForBazelOut(ctx, info.OutputFile)
+ handler.module.outputFile = android.OptionalPathForPath(outputFilePath)
+ handler.module.linker.(*testBinary).unstrippedOutputFile = android.PathForBazelOut(ctx, info.UnstrippedOutput)
+}
+
// binaryAttributes contains Bazel attributes corresponding to a cc test
type testBinaryAttributes struct {
binaryAttributes