Merge remote-tracking branch 'aosp/upstream'

* aosp/upstream:
  Add --empty-ninja-file for test usecases

Test: m blueprint_tools
Test: build/soong/build_test.bash
Change-Id: Ia6a5aec00059f165f06fc29446cb4bf7ca410812
diff --git a/bootstrap.bash b/bootstrap.bash
index c02fe81..08b85b5 100755
--- a/bootstrap.bash
+++ b/bootstrap.bash
@@ -93,6 +93,11 @@
 # If RUN_TESTS is set, behave like -t was passed in as an option.
 [ ! -z "$RUN_TESTS" ] && EXTRA_ARGS="${EXTRA_ARGS} -t"
 
+# If EMPTY_NINJA_FILE is set, have the primary build write out a 0-byte ninja
+# file instead of a full length one. Useful if you don't plan on executing the
+# build, but want to verify the primary builder execution.
+[ ! -z "$EMPTY_NINJA_FILE" ] && EXTRA_ARGS="${EXTRA_ARGS} --empty-ninja-file"
+
 # Allow the caller to pass in a list of module files
 if [ -z "${BLUEPRINT_LIST_FILE}" ]; then
   BLUEPRINT_LIST_FILE="${BUILDDIR}/.bootstrap/bplist"
diff --git a/bootstrap/bootstrap.go b/bootstrap/bootstrap.go
index ed33f20..3464c0b 100644
--- a/bootstrap/bootstrap.go
+++ b/bootstrap/bootstrap.go
@@ -650,6 +650,9 @@
 	if s.config.moduleListFile != "" {
 		extraSharedFlagArray = append(extraSharedFlagArray, "-l", s.config.moduleListFile)
 	}
+	if s.config.emptyNinjaFile {
+		extraSharedFlagArray = append(extraSharedFlagArray, "--empty-ninja-file")
+	}
 	extraSharedFlagString := strings.Join(extraSharedFlagArray, " ")
 
 	var primaryBuilderName, primaryBuilderExtraFlags string
diff --git a/bootstrap/command.go b/bootstrap/command.go
index ac3fd00..da0191b 100644
--- a/bootstrap/command.go
+++ b/bootstrap/command.go
@@ -41,6 +41,7 @@
 	runGoTests     bool
 	noGC           bool
 	moduleListFile string
+	emptyNinjaFile bool
 
 	BuildDir      string
 	NinjaBuildDir string
@@ -60,6 +61,7 @@
 	flag.BoolVar(&noGC, "nogc", false, "turn off GC for debugging")
 	flag.BoolVar(&runGoTests, "t", false, "build and run go tests during bootstrap")
 	flag.StringVar(&moduleListFile, "l", "", "file that lists filepaths to parse")
+	flag.BoolVar(&emptyNinjaFile, "empty-ninja-file", false, "write out a 0-byte ninja file")
 }
 
 func Main(ctx *blueprint.Context, config interface{}, extraNinjaFileDeps ...string) {
@@ -122,7 +124,9 @@
 
 	bootstrapConfig := &Config{
 		stage: stage,
+
 		topLevelBlueprintsFile: flag.Arg(0),
+		emptyNinjaFile:         emptyNinjaFile,
 		runGoTests:             runGoTests,
 		moduleListFile:         moduleListFile,
 	}
@@ -175,6 +179,10 @@
 		fatalf("error generating Ninja file contents: %s", err)
 	}
 
+	if stage == StageMain && emptyNinjaFile {
+		buf.Reset()
+	}
+
 	const outFilePermissions = 0666
 	err = ioutil.WriteFile(outFile, buf.Bytes(), outFilePermissions)
 	if err != nil {
diff --git a/bootstrap/config.go b/bootstrap/config.go
index 790ac4b..0772b0a 100644
--- a/bootstrap/config.go
+++ b/bootstrap/config.go
@@ -105,6 +105,7 @@
 
 	topLevelBlueprintsFile string
 
+	emptyNinjaFile bool
 	runGoTests     bool
 	moduleListFile string
 }