Merge "Call rm -rf in mixed build build statement preamble."
diff --git a/android/bazel_handler.go b/android/bazel_handler.go
index d7f55c3..d4af70b 100644
--- a/android/bazel_handler.go
+++ b/android/bazel_handler.go
@@ -250,7 +250,8 @@
}
func (m MockBazelContext) GetApexInfo(label string, _ configKey) (cquery.ApexInfo, error) {
- panic("unimplemented")
+ result, _ := m.LabelToApexInfo[label]
+ return result, nil
}
func (m MockBazelContext) GetCcUnstrippedInfo(label string, _ configKey) (cquery.CcUnstrippedInfo, error) {
diff --git a/android/metrics.go b/android/metrics.go
index ecda026..3d41a1d 100644
--- a/android/metrics.go
+++ b/android/metrics.go
@@ -62,7 +62,7 @@
})
}
-func collectMetrics(config Config, eventHandler metrics.EventHandler) *soong_metrics_proto.SoongBuildMetrics {
+func collectMetrics(config Config, eventHandler *metrics.EventHandler) *soong_metrics_proto.SoongBuildMetrics {
metrics := &soong_metrics_proto.SoongBuildMetrics{}
soongMetrics, ok := readSoongMetrics(config)
@@ -107,7 +107,7 @@
return metrics
}
-func WriteMetrics(config Config, eventHandler metrics.EventHandler, metricsFile string) error {
+func WriteMetrics(config Config, eventHandler *metrics.EventHandler, metricsFile string) error {
metrics := collectMetrics(config, eventHandler)
buf, err := proto.Marshal(metrics)
diff --git a/apex/apex.go b/apex/apex.go
index a3872d3..cb5a5e9 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -1893,10 +1893,13 @@
a.outputFile = a.outputApexFile
a.setCompression(ctx)
+ // TODO(b/257829940): These are used by the apex_keys_text singleton; would probably be a clearer
+ // interface if these were set in a provider rather than the module itself
a.publicKeyFile = android.PathForBazelOut(ctx, outputs.BundleKeyInfo[0])
a.privateKeyFile = android.PathForBazelOut(ctx, outputs.BundleKeyInfo[1])
a.containerCertificateFile = android.PathForBazelOut(ctx, outputs.ContainerKeyInfo[0])
a.containerPrivateKeyFile = android.PathForBazelOut(ctx, outputs.ContainerKeyInfo[1])
+
apexType := a.properties.ApexType
switch apexType {
case imageApex:
diff --git a/apex/apex_test.go b/apex/apex_test.go
index 10adf8d..a02300e 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -29,6 +29,7 @@
"github.com/google/blueprint/proptools"
"android/soong/android"
+ "android/soong/bazel/cquery"
"android/soong/bpf"
"android/soong/cc"
"android/soong/dexpreopt"
@@ -9744,3 +9745,67 @@
libcCoreVariant := result.ModuleForTests("libc.apiimport", "android_arm64_armv8-a_shared").Module()
android.AssertBoolEquals(t, "core variant should link against source libc", true, hasDep(libfooCoreVariant, libcCoreVariant))
}
+
+func TestApexImageInMixedBuilds(t *testing.T) {
+ bp := `
+apex_key{
+ name: "foo_key",
+}
+apex {
+ name: "foo",
+ key: "foo_key",
+ updatable: true,
+ min_sdk_version: "31",
+ file_contexts: ":myapex-file_contexts",
+ bazel_module: { label: "//:foo" },
+}`
+
+ outputBaseDir := "out/bazel"
+ result := android.GroupFixturePreparers(
+ prepareForApexTest,
+ android.FixtureModifyConfig(func(config android.Config) {
+ config.BazelContext = android.MockBazelContext{
+ OutputBaseDir: outputBaseDir,
+ LabelToApexInfo: map[string]cquery.ApexInfo{
+ "//:foo": cquery.ApexInfo{
+ SignedOutput: "signed_out.apex",
+ UnsignedOutput: "unsigned_out.apex",
+ BundleKeyInfo: []string{"public_key", "private_key"},
+ ContainerKeyInfo: []string{"container_cert", "container_private"},
+
+ // unused
+ PackageName: "pkg_name",
+ ProvidesLibs: []string{"a", "b"},
+ RequiresLibs: []string{"c", "d"},
+ },
+ },
+ }
+ }),
+ ).RunTestWithBp(t, bp)
+
+ m := result.ModuleForTests("foo", "android_common_foo_image").Module()
+ ab, ok := m.(*apexBundle)
+ if !ok {
+ t.Fatalf("Expected module to be an apexBundle, was not")
+ }
+
+ if w, g := "out/bazel/execroot/__main__/public_key", ab.publicKeyFile.String(); w != g {
+ t.Errorf("Expected public key %q, got %q", w, g)
+ }
+
+ if w, g := "out/bazel/execroot/__main__/private_key", ab.privateKeyFile.String(); w != g {
+ t.Errorf("Expected private key %q, got %q", w, g)
+ }
+
+ if w, g := "out/bazel/execroot/__main__/container_cert", ab.containerCertificateFile.String(); w != g {
+ t.Errorf("Expected public container key %q, got %q", w, g)
+ }
+
+ if w, g := "out/bazel/execroot/__main__/container_private", ab.containerPrivateKeyFile.String(); w != g {
+ t.Errorf("Expected private container key %q, got %q", w, g)
+ }
+
+ if w, g := "out/bazel/execroot/__main__/signed_out.apex", ab.outputFile.String(); w != g {
+ t.Errorf("Expected output file %q, got %q", w, g)
+ }
+}
diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go
index 57a41b5..3fed1a1 100644
--- a/cmd/soong_build/main.go
+++ b/cmd/soong_build/main.go
@@ -187,7 +187,7 @@
globListFiles := writeBuildGlobsNinjaFile(ctx, configuration.SoongOutDir(), configuration)
ninjaDeps = append(ninjaDeps, globListFiles...)
- writeDepFile(cmdlineArgs.OutFile, *ctx.EventHandler, ninjaDeps)
+ writeDepFile(cmdlineArgs.OutFile, ctx.EventHandler, ninjaDeps)
}
// Run the code-generation phase to convert BazelTargetModules to BUILD files.
@@ -266,7 +266,7 @@
ninjaDeps = append(ninjaDeps, symlinkDeps...)
workspaceMarkerFile := workspace + ".marker"
- writeDepFile(workspaceMarkerFile, *ctx.EventHandler, ninjaDeps)
+ writeDepFile(workspaceMarkerFile, ctx.EventHandler, ninjaDeps)
touch(shared.JoinPath(topDir, workspaceMarkerFile))
return workspaceMarkerFile
}
@@ -293,7 +293,7 @@
return ret
}
-func writeMetrics(configuration android.Config, eventHandler metrics.EventHandler, metricsDir string) {
+func writeMetrics(configuration android.Config, eventHandler *metrics.EventHandler, metricsDir string) {
if len(metricsDir) < 1 {
fmt.Fprintf(os.Stderr, "\nMissing required env var for generating soong metrics: LOG_DIR\n")
os.Exit(1)
@@ -333,7 +333,7 @@
return bootstrap.GlobFileListFiles(globDir)
}
-func writeDepFile(outputFile string, eventHandler metrics.EventHandler, ninjaDeps []string) {
+func writeDepFile(outputFile string, eventHandler *metrics.EventHandler, ninjaDeps []string) {
eventHandler.Begin("ninja_deps")
defer eventHandler.End("ninja_deps")
depFile := shared.JoinPath(topDir, outputFile+".d")
@@ -347,14 +347,14 @@
// doChosenActivity runs Soong for a specific activity, like bp2build, queryview
// or the actual Soong build for the build.ninja file. Returns the top level
// output file of the specific activity.
-func doChosenActivity(ctx *android.Context, configuration android.Config, extraNinjaDeps []string) string {
+func doChosenActivity(ctx *android.Context, configuration android.Config, extraNinjaDeps []string, metricsDir string) string {
if configuration.BuildMode == android.SymlinkForest {
- runSymlinkForestCreation(configuration, extraNinjaDeps)
+ runSymlinkForestCreation(configuration, extraNinjaDeps, metricsDir)
return symlinkForestMarker
} else if configuration.BuildMode == android.Bp2build {
// Run the alternate pipeline of bp2build mutators and singleton to convert
// Blueprint to BUILD files before everything else.
- runBp2Build(configuration, extraNinjaDeps)
+ runBp2Build(configuration, extraNinjaDeps, metricsDir)
return bp2buildMarker
} else if configuration.IsMixedBuildsEnabled() {
runMixedModeBuild(configuration, ctx, extraNinjaDeps)
@@ -380,11 +380,11 @@
if configuration.BuildMode == android.GenerateQueryView {
queryviewMarkerFile := bazelQueryViewDir + ".marker"
runQueryView(bazelQueryViewDir, queryviewMarkerFile, configuration, ctx)
- writeDepFile(queryviewMarkerFile, *ctx.EventHandler, ninjaDeps)
+ writeDepFile(queryviewMarkerFile, ctx.EventHandler, ninjaDeps)
return queryviewMarkerFile
} else if configuration.BuildMode == android.GenerateModuleGraph {
writeJsonModuleGraphAndActions(ctx, moduleGraphFile, moduleActionsFile)
- writeDepFile(moduleGraphFile, *ctx.EventHandler, ninjaDeps)
+ writeDepFile(moduleGraphFile, ctx.EventHandler, ninjaDeps)
return moduleGraphFile
} else if configuration.BuildMode == android.GenerateDocFile {
// TODO: we could make writeDocs() return the list of documentation files
@@ -394,12 +394,12 @@
fmt.Fprintf(os.Stderr, "error building Soong documentation: %s\n", err)
os.Exit(1)
}
- writeDepFile(docFile, *ctx.EventHandler, ninjaDeps)
+ writeDepFile(docFile, ctx.EventHandler, ninjaDeps)
return docFile
} else {
// The actual output (build.ninja) was written in the RunBlueprint() call
// above
- writeDepFile(cmdlineArgs.OutFile, *ctx.EventHandler, ninjaDeps)
+ writeDepFile(cmdlineArgs.OutFile, ctx.EventHandler, ninjaDeps)
}
}
@@ -465,10 +465,10 @@
ctx := newContext(configuration)
ctx.EventHandler.Begin("soong_build")
- finalOutputFile := doChosenActivity(ctx, configuration, extraNinjaDeps)
+ finalOutputFile := doChosenActivity(ctx, configuration, extraNinjaDeps, logDir)
ctx.EventHandler.End("soong_build")
- writeMetrics(configuration, *ctx.EventHandler, logDir)
+ writeMetrics(configuration, ctx.EventHandler, logDir)
writeUsedEnvironmentFile(configuration, finalOutputFile)
}
@@ -614,8 +614,8 @@
// Ideally, bp2build would write a file that contains instructions to the
// symlink tree creation binary. Then the latter would not need to depend on
// the very heavy-weight machinery of soong_build .
-func runSymlinkForestCreation(configuration android.Config, extraNinjaDeps []string) {
- eventHandler := metrics.EventHandler{}
+func runSymlinkForestCreation(configuration android.Config, extraNinjaDeps []string, metricsDir string) {
+ eventHandler := &metrics.EventHandler{}
var ninjaDeps []string
ninjaDeps = append(ninjaDeps, extraNinjaDeps...)
@@ -651,7 +651,6 @@
writeDepFile(symlinkForestMarker, eventHandler, ninjaDeps)
touch(shared.JoinPath(topDir, symlinkForestMarker))
- metricsDir := configuration.Getenv("LOG_DIR")
codegenMetrics := bp2build.ReadCodegenMetrics(metricsDir)
if codegenMetrics == nil {
m := bp2build.CreateCodegenMetrics()
@@ -660,15 +659,15 @@
//TODO (usta) we cannot determine if we loaded a stale file, i.e. from an unrelated prior
//invocation of codegen. We should simply use a separate .pb file
}
- writeBp2BuildMetrics(codegenMetrics, configuration, eventHandler)
+ writeBp2BuildMetrics(codegenMetrics, eventHandler, metricsDir)
}
// Run Soong in the bp2build mode. This creates a standalone context that registers
// an alternate pipeline of mutators and singletons specifically for generating
// Bazel BUILD files instead of Ninja files.
-func runBp2Build(configuration android.Config, extraNinjaDeps []string) {
+func runBp2Build(configuration android.Config, extraNinjaDeps []string, metricsDir string) {
var codegenMetrics *bp2build.CodegenMetrics
- eventHandler := metrics.EventHandler{}
+ eventHandler := &metrics.EventHandler{}
eventHandler.Do("bp2build", func() {
// Register an alternate set of singletons and mutators for bazel
@@ -716,12 +715,11 @@
if configuration.IsEnvTrue("BP2BUILD_VERBOSE") {
codegenMetrics.Print()
}
- writeBp2BuildMetrics(codegenMetrics, configuration, eventHandler)
+ writeBp2BuildMetrics(codegenMetrics, eventHandler, metricsDir)
}
// Write Bp2Build metrics into $LOG_DIR
-func writeBp2BuildMetrics(codegenMetrics *bp2build.CodegenMetrics,
- configuration android.Config, eventHandler metrics.EventHandler) {
+func writeBp2BuildMetrics(codegenMetrics *bp2build.CodegenMetrics, eventHandler *metrics.EventHandler, metricsDir string) {
for _, event := range eventHandler.CompletedEvents() {
codegenMetrics.AddEvent(&bp2build_metrics_proto.Event{
Name: event.Id,
@@ -729,7 +727,6 @@
RealTime: event.RuntimeNanoseconds(),
})
}
- metricsDir := configuration.Getenv("LOG_DIR")
if len(metricsDir) < 1 {
fmt.Fprintf(os.Stderr, "\nMissing required env var for generating bp2build metrics: LOG_DIR\n")
os.Exit(1)
diff --git a/java/config/config.go b/java/config/config.go
index 45b668b..49d88c4 100644
--- a/java/config/config.go
+++ b/java/config/config.go
@@ -43,6 +43,7 @@
InstrumentFrameworkModules = []string{
"framework",
"framework-minus-apex",
+ "ims-common",
"telephony-common",
"services",
"android.car",