From 8d8253f5257e7ab8ffa001d2e491bd0934d9119e Mon Sep 17 00:00:00 2001 From: Spandan Das Date: Mon, 24 Jun 2024 17:38:27 +0000 Subject: [PATCH] Enforce that output files are created in primary ninja execution Missing output files in ninja execution will be treated as errors. Products can bypass this using the newly introduced BUILD_BROKEN_MISSING_OUTPUTS flag. Test: m nothing # verified missingoutfile appears in out/soong.log Test: checkbuild passes on presubmits Change-Id: I4eebcd08aa57fc6ccf1688c32e0d1fe06d66ab9a --- ui/build/config.go | 15 ++++++++++++--- ui/build/dumpvars.go | 6 ++++++ ui/build/ninja.go | 8 ++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ui/build/config.go b/ui/build/config.go index feded1c85..3b2f2c5bb 100644 --- a/ui/build/config.go +++ b/ui/build/config.go @@ -98,9 +98,10 @@ type configImpl struct { // Autodetected totalRAM uint64 - brokenDupRules bool - brokenUsesNetwork bool - brokenNinjaEnvVars []string + brokenDupRules bool + brokenUsesNetwork bool + brokenNinjaEnvVars []string + brokenMissingOutputs bool pathReplaced bool @@ -1591,6 +1592,14 @@ func (c *configImpl) BuildBrokenNinjaUsesEnvVars() []string { return c.brokenNinjaEnvVars } +func (c *configImpl) SetBuildBrokenMissingOutputs(val bool) { + c.brokenMissingOutputs = val +} + +func (c *configImpl) BuildBrokenMissingOutputs() bool { + return c.brokenMissingOutputs +} + func (c *configImpl) SetTargetDeviceDir(dir string) { c.targetDeviceDir = dir } diff --git a/ui/build/dumpvars.go b/ui/build/dumpvars.go index eba86a0fc..e77df44a5 100644 --- a/ui/build/dumpvars.go +++ b/ui/build/dumpvars.go @@ -235,6 +235,11 @@ func runMakeProductConfig(ctx Context, config Config) { "BUILD_BROKEN_SRC_DIR_IS_WRITABLE", "BUILD_BROKEN_SRC_DIR_RW_ALLOWLIST", + // Whether missing outputs should be treated as warnings + // instead of errors. + // `true` will relegate missing outputs to warnings. + "BUILD_BROKEN_MISSING_OUTPUTS", + // Not used, but useful to be in the soong.log "TARGET_BUILD_TYPE", "HOST_ARCH", @@ -301,4 +306,5 @@ func runMakeProductConfig(ctx Context, config Config) { config.SetBuildBrokenUsesNetwork(makeVars["BUILD_BROKEN_USES_NETWORK"] == "true") config.SetBuildBrokenNinjaUsesEnvVars(strings.Fields(makeVars["BUILD_BROKEN_NINJA_USES_ENV_VARS"])) config.SetSourceRootDirs(strings.Fields(makeVars["PRODUCT_SOURCE_ROOT_DIRS"])) + config.SetBuildBrokenMissingOutputs(makeVars["BUILD_BROKEN_MISSING_OUTPUTS"] == "true") } diff --git a/ui/build/ninja.go b/ui/build/ninja.go index 551b8ab41..ae27330a9 100644 --- a/ui/build/ninja.go +++ b/ui/build/ninja.go @@ -77,6 +77,14 @@ func runNinjaForBuild(ctx Context, config Config) { "-w", "dupbuild=err", "-w", "missingdepfile=err") + if !config.BuildBrokenMissingOutputs() { + // Missing outputs will be treated as errors. + // BUILD_BROKEN_MISSING_OUTPUTS can be used to bypass this check. + args = append(args, + "-w", "missingoutfile=err", + ) + } + cmd := Command(ctx, config, "ninja", executable, args...) // Set up the nsjail sandbox Ninja runs in.