Add partialcompileclean phony
When SOONG_USE_PARTIAL_COMPILE transitions from on to off, we need to
remove all files that may have been built using partial compile.
Bug: b/396145326
Test: manual, TH
Change-Id: I1d91f95883fd8b1d92731a490244a898f25e614d
diff --git a/android/module.go b/android/module.go
index 80275a3..647dc37 100644
--- a/android/module.go
+++ b/android/module.go
@@ -2997,6 +2997,9 @@
func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) {
var checkbuildDeps Paths
+ // Create a top level partialcompileclean target for modules to add dependencies to.
+ ctx.Phony("partialcompileclean")
+
mmTarget := func(dir string) string {
return "MODULES-IN-" + strings.Replace(filepath.Clean(dir), "/", "-", -1)
}
diff --git a/ui/build/build.go b/ui/build/build.go
index 95d7831..781ca18 100644
--- a/ui/build/build.go
+++ b/ui/build/build.go
@@ -401,6 +401,7 @@
if what&RunKati != 0 {
installCleanIfNecessary(ctx, config)
}
+ partialCompileCleanIfNecessary(ctx, config)
runNinjaForBuild(ctx, config)
updateBuildIdDir(ctx, config)
}
diff --git a/ui/build/cleanbuild.go b/ui/build/cleanbuild.go
index 41cb5ab..723d90f 100644
--- a/ui/build/cleanbuild.go
+++ b/ui/build/cleanbuild.go
@@ -218,6 +218,52 @@
writeConfig()
}
+// When SOONG_USE_PARTIAL_COMPILE transitions from on to off, we need to remove
+// all files which were potentially built with partial compile, so that they
+// get rebuilt with that turned off.
+func partialCompileCleanIfNecessary(ctx Context, config Config) {
+ configFile := config.DevicePreviousUsePartialCompile()
+ currentValue, _ := config.Environment().Get("SOONG_USE_PARTIAL_COMPILE")
+
+ ensureDirectoriesExist(ctx, filepath.Dir(configFile))
+
+ writeValue := func() {
+ err := ioutil.WriteFile(configFile, []byte(currentValue), 0666) // a+rw
+ if err != nil {
+ ctx.Fatalln("Failed to write use partial compile config:", err)
+ }
+ }
+
+ previousValueBytes, err := ioutil.ReadFile(configFile)
+ if err != nil {
+ if os.IsNotExist(err) {
+ // Just write the new config file, no old config file to worry about.
+ writeValue()
+ return
+ } else {
+ ctx.Fatalln("Failed to read previous use partial compile config:", err)
+ }
+ }
+
+ previousValue := string(previousValueBytes)
+ switch previousValue {
+ case currentValue:
+ // Same value as before - nothing left to do here.
+ return
+ case "true":
+ // Transitioning from on to off. Build (phony) target: partialcompileclean.
+ ctx.BeginTrace(metrics.PrimaryNinja, "partialcompileclean")
+ defer ctx.EndTrace()
+
+ ctx.Printf("SOONG_USE_PARTIAL_COMPILE turned off, forcing partialcompileclean\n")
+
+ runNinja(ctx, config, []string{"partialcompileclean"})
+ default:
+ // Transitioning from off to on. Nothing to do in this case.
+ }
+ writeValue()
+}
+
// cleanOldFiles takes an input file (with all paths relative to basePath), and removes files from
// the filesystem if they were removed from the input file since the last execution.
func cleanOldFiles(ctx Context, basePath, newFile string) {
diff --git a/ui/build/config.go b/ui/build/config.go
index 2a00c41..a4f778d 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -1685,6 +1685,10 @@
return filepath.Join(c.ProductOut(), "previous_build_config.mk")
}
+func (c *configImpl) DevicePreviousUsePartialCompile() string {
+ return filepath.Join(c.ProductOut(), "previous_use_partial_compile.txt")
+}
+
func (c *configImpl) KatiPackageMkDir() string {
return filepath.Join(c.SoongOutDir(), "kati_packaging"+c.KatiSuffix())
}
diff --git a/ui/build/ninja.go b/ui/build/ninja.go
index 1d4285f..e2a568f 100644
--- a/ui/build/ninja.go
+++ b/ui/build/ninja.go
@@ -36,10 +36,16 @@
ninjaWeightListFileName = ".ninja_weight_list"
)
+// Runs ninja with the arguments from the command line, as found in
+// config.NinjaArgs().
+func runNinjaForBuild(ctx Context, config Config) {
+ runNinja(ctx, config, config.NinjaArgs())
+}
+
// Constructs and runs the Ninja command line with a restricted set of
// environment variables. It's important to restrict the environment Ninja runs
// for hermeticity reasons, and to avoid spurious rebuilds.
-func runNinjaForBuild(ctx Context, config Config) {
+func runNinja(ctx Context, config Config, ninjaArgs []string) {
ctx.BeginTrace(metrics.PrimaryNinja, "ninja")
defer ctx.EndTrace()
@@ -88,7 +94,7 @@
"-w", "missingdepfile=err",
}
}
- args = append(args, config.NinjaArgs()...)
+ args = append(args, ninjaArgs...)
var parallel int
if config.UseRemoteBuild() {
@@ -244,6 +250,8 @@
"RUST_LOG",
// SOONG_USE_PARTIAL_COMPILE only determines which half of the rule we execute.
+ // When it transitions true => false, we build phony target "partialcompileclean",
+ // which removes all files that could have been created while it was true.
"SOONG_USE_PARTIAL_COMPILE",
// Directory for ExecutionMetrics