Add out/partitions_were_clean_at_start_of_build.txt

Test: Presubmits
Change-Id: I1c7025f2c7594ae84b740ccbae4dcbc933b8cdf6
This commit is contained in:
Cole Faust 2023-10-04 17:00:22 -07:00
parent 29c559b785
commit 39ec9276a7
4 changed files with 52 additions and 1 deletions

View file

@ -298,6 +298,8 @@ func Build(ctx Context, config Config) {
runMakeProductConfig(ctx, config) runMakeProductConfig(ctx, config)
} }
checkForCleanPartitions(ctx, config)
// Everything below here depends on product config. // Everything below here depends on product config.
if inList("installclean", config.Arguments()) || if inList("installclean", config.Arguments()) ||

View file

@ -218,6 +218,50 @@ func installCleanIfNecessary(ctx Context, config Config) {
writeConfig() writeConfig()
} }
// Writes out/partitions_were_clean_at_start_of_build.txt.
// This file will contain "true" if there were no partition staging directories at the start of
// the build (most likely from having just run `m installclean`) and "false" otherwise.
// It's used to make a test that the staging directories are correct. That test can only be
// correctly run directly after `m installclean`, and this is how we check for that.
func checkForCleanPartitions(ctx Context, config Config) {
productOutPath := config.ProductOut()
productOut := func(path string) string {
return filepath.Join(productOutPath, path)
}
notExists := func(path string) bool {
_, err := os.Stat(path)
return os.IsNotExist(err)
}
clean := notExists(productOut("ramdisk")) &&
notExists(productOut("ramdisk_16k")) &&
notExists(productOut("debug_ramdisk")) &&
notExists(productOut("vendor_ramdisk")) &&
notExists(productOut("vendor_debug_ramdisk")) &&
notExists(productOut("vendor_kernel_ramdisk")) &&
notExists(productOut("test_harness_ramdisk")) &&
notExists(productOut("data")) &&
notExists(productOut("recovery")) &&
notExists(productOut("root")) &&
notExists(productOut("system")) &&
notExists(productOut("system_dlkm")) &&
notExists(productOut("system_other")) &&
notExists(productOut("vendor")) &&
notExists(productOut("vendor_dlkm")) &&
notExists(productOut("product")) &&
notExists(productOut("system_ext")) &&
notExists(productOut("oem")) &&
notExists(productOut("breakpad")) &&
notExists(productOut("cache")) &&
notExists(productOut("coverage")) &&
notExists(productOut("installer")) &&
notExists(productOut("odm")) &&
notExists(productOut("odm_dlkm"))
writeValueIfChanged(ctx, config, config.OutDir(), "partitions_were_clean_at_start_of_build.txt", fmt.Sprintf("%t\n", clean))
}
// cleanOldFiles takes an input file (with all paths relative to basePath), and removes files from // 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. // the filesystem if they were removed from the input file since the last execution.
func cleanOldFiles(ctx Context, basePath, newFile string) { func cleanOldFiles(ctx Context, basePath, newFile string) {

View file

@ -102,6 +102,8 @@ func runKati(ctx Context, config Config, extraSuffix string, args []string, envF
"--use_ninja_phony_output", "--use_ninja_phony_output",
// Support declaring symlink outputs in AOSP Ninja. // Support declaring symlink outputs in AOSP Ninja.
"--use_ninja_symlink_outputs", "--use_ninja_symlink_outputs",
// Support ninja validation actions with .KATI_VALIDATIONS: https://ninja-build.org/manual.html#validations
"--use_ninja_validations",
// Regenerate the Ninja file if environment inputs have changed. e.g. // Regenerate the Ninja file if environment inputs have changed. e.g.
// CLI flags, .mk file timestamps, env vars, $(wildcard ..) and some // CLI flags, .mk file timestamps, env vars, $(wildcard ..) and some
// $(shell ..) results. // $(shell ..) results.

View file

@ -103,8 +103,10 @@ func testForDanglingRules(ctx Context, config Config) {
// treated as an source file. // treated as an source file.
dexpreoptConfigFilePath := filepath.Join(outDir, "soong", "dexpreopt.config") dexpreoptConfigFilePath := filepath.Join(outDir, "soong", "dexpreopt.config")
// out/build_date.txt is considered a "source file" // These files are written by soong_ui at the beginning of every build.
// Ninja considers them "source files"
buildDatetimeFilePath := filepath.Join(outDir, "build_date.txt") buildDatetimeFilePath := filepath.Join(outDir, "build_date.txt")
cleanPartitionsFilePath := filepath.Join(outDir, "partitions_were_clean_at_start_of_build.txt")
// bpglob is built explicitly using Microfactory // bpglob is built explicitly using Microfactory
bpglob := filepath.Join(config.SoongOutDir(), "bpglob") bpglob := filepath.Join(config.SoongOutDir(), "bpglob")
@ -122,6 +124,7 @@ func testForDanglingRules(ctx Context, config Config) {
line == variablesFilePath || line == variablesFilePath ||
line == dexpreoptConfigFilePath || line == dexpreoptConfigFilePath ||
line == buildDatetimeFilePath || line == buildDatetimeFilePath ||
line == cleanPartitionsFilePath ||
line == bpglob { line == bpglob {
// Leaf node is in one of Soong's bootstrap directories, which do not have // Leaf node is in one of Soong's bootstrap directories, which do not have
// full build rules in the primary build.ninja file. // full build rules in the primary build.ninja file.