Ship the build log and trace on the build servers

Test: m -j; m -j dist
Change-Id: I4718e7a0cda6719bbab4243038ea2666c212cf19
diff --git a/cmd/multiproduct_kati/main.go b/cmd/multiproduct_kati/main.go
index 2ff19ce..21d8383 100644
--- a/cmd/multiproduct_kati/main.go
+++ b/cmd/multiproduct_kati/main.go
@@ -102,7 +102,7 @@
 	log.Println("Output directory:", *outDir)
 
 	build.SetupOutDir(buildCtx, config)
-	log.SetOutput(filepath.Join(config.OutDir(), "build.log"))
+	log.SetOutput(filepath.Join(config.OutDir(), "soong.log"))
 	trace.SetOutput(filepath.Join(config.OutDir(), "build.trace"))
 
 	vars, err := build.DumpMakeVars(buildCtx, config, nil, nil, []string{"all_named_products"})
@@ -137,7 +137,7 @@
 			}
 
 			productLog := logger.New(&bytes.Buffer{})
-			productLog.SetOutput(filepath.Join(productOutDir, "build.log"))
+			productLog.SetOutput(filepath.Join(productOutDir, "soong.log"))
 
 			productCtx := build.Context{&build.ContextImpl{
 				Context:        ctx,
diff --git a/cmd/soong_ui/main.go b/cmd/soong_ui/main.go
index de941f4..06a601e 100644
--- a/cmd/soong_ui/main.go
+++ b/cmd/soong_ui/main.go
@@ -70,8 +70,15 @@
 
 	log.SetVerbose(config.IsVerbose())
 	build.SetupOutDir(buildCtx, config)
-	log.SetOutput(filepath.Join(config.OutDir(), "build.log"))
-	trace.SetOutput(filepath.Join(config.OutDir(), "build.trace"))
+
+	if config.Dist() {
+		os.MkdirAll(config.DistDir(), 0777)
+		log.SetOutput(filepath.Join(config.DistDir(), "logs", "soong.log"))
+		trace.SetOutput(filepath.Join(config.DistDir(), "logs", "build.trace"))
+	} else {
+		log.SetOutput(filepath.Join(config.OutDir(), "soong.log"))
+		trace.SetOutput(filepath.Join(config.OutDir(), "build.trace"))
+	}
 
 	if start, ok := os.LookupEnv("TRACE_BEGIN_SOONG"); ok {
 		if !strings.HasSuffix(start, "N") {
diff --git a/ui/build/config.go b/ui/build/config.go
index 35c5213..4853643 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -35,6 +35,7 @@
 	parallel  int
 	keepGoing int
 	verbose   bool
+	dist      bool
 
 	// From the product config
 	katiArgs   []string
@@ -90,6 +91,8 @@
 		} else if arg == "showcommands" {
 			ret.verbose = true
 			continue
+		} else if arg == "dist" {
+			ret.dist = true
 		}
 		if arg[0] == '-' {
 			var err error
@@ -183,6 +186,13 @@
 	return "out"
 }
 
+func (c *configImpl) DistDir() string {
+	if distDir, ok := c.environ.Get("DIST_DIR"); ok {
+		return distDir
+	}
+	return filepath.Join(c.OutDir(), "dist")
+}
+
 func (c *configImpl) NinjaArgs() []string {
 	return c.ninjaArgs
 }
@@ -198,6 +208,10 @@
 	panic("SetKatiSuffix has not been called")
 }
 
+func (c *configImpl) Dist() bool {
+	return c.dist
+}
+
 func (c *configImpl) IsVerbose() bool {
 	return c.verbose
 }