diff options
| -rw-r--r-- | cmd/soong_ui/main.go | 1 | ||||
| -rw-r--r-- | java/config/config.go | 6 | ||||
| -rw-r--r-- | ui/build/config.go | 74 | ||||
| -rw-r--r-- | ui/build/ninja.go | 10 | ||||
| -rw-r--r-- | ui/build/rbe.go | 39 | ||||
| -rw-r--r-- | ui/build/rbe_test.go | 32 |
6 files changed, 126 insertions, 36 deletions
diff --git a/cmd/soong_ui/main.go b/cmd/soong_ui/main.go index 78e636cf0..89ece8d16 100644 --- a/cmd/soong_ui/main.go +++ b/cmd/soong_ui/main.go @@ -173,6 +173,7 @@ func main() { rbeMetricsFile := filepath.Join(logsDir, c.logsPrefix+"rbe_metrics.pb") soongMetricsFile := filepath.Join(logsDir, c.logsPrefix+"soong_metrics") defer build.UploadMetrics(buildCtx, config, c.forceDumbOutput, buildStarted, buildErrorFile, rbeMetricsFile, soongMetricsFile) + defer build.PrintGomaDeprecation(buildCtx, config) os.MkdirAll(logsDir, 0777) log.SetOutput(filepath.Join(logsDir, c.logsPrefix+"soong.log")) diff --git a/java/config/config.go b/java/config/config.go index 95add017d..1d0dd617e 100644 --- a/java/config/config.go +++ b/java/config/config.go @@ -148,9 +148,9 @@ func init() { pctx.HostBinToolVariable("DexpreoptGen", "dexpreopt_gen") pctx.VariableFunc("REJavaPool", remoteexec.EnvOverrideFunc("RBE_JAVA_POOL", "java16")) - pctx.VariableFunc("REJavacExecStrategy", remoteexec.EnvOverrideFunc("RBE_JAVAC_EXEC_STRATEGY", remoteexec.LocalExecStrategy)) - pctx.VariableFunc("RED8ExecStrategy", remoteexec.EnvOverrideFunc("RBE_D8_EXEC_STRATEGY", remoteexec.LocalExecStrategy)) - pctx.VariableFunc("RER8ExecStrategy", remoteexec.EnvOverrideFunc("RBE_R8_EXEC_STRATEGY", remoteexec.LocalExecStrategy)) + pctx.VariableFunc("REJavacExecStrategy", remoteexec.EnvOverrideFunc("RBE_JAVAC_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy)) + pctx.VariableFunc("RED8ExecStrategy", remoteexec.EnvOverrideFunc("RBE_D8_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy)) + pctx.VariableFunc("RER8ExecStrategy", remoteexec.EnvOverrideFunc("RBE_R8_EXEC_STRATEGY", remoteexec.RemoteLocalFallbackExecStrategy)) pctx.VariableFunc("RETurbineExecStrategy", remoteexec.EnvOverrideFunc("RBE_TURBINE_EXEC_STRATEGY", remoteexec.LocalExecStrategy)) pctx.VariableFunc("RESignApkExecStrategy", remoteexec.EnvOverrideFunc("RBE_SIGNAPK_EXEC_STRATEGY", remoteexec.LocalExecStrategy)) pctx.VariableFunc("REJarExecStrategy", remoteexec.EnvOverrideFunc("RBE_JAR_EXEC_STRATEGY", remoteexec.LocalExecStrategy)) diff --git a/ui/build/config.go b/ui/build/config.go index f0310d5a7..5bf4bafe3 100644 --- a/ui/build/config.go +++ b/ui/build/config.go @@ -15,6 +15,7 @@ package build import ( + "fmt" "os" "path/filepath" "runtime" @@ -187,7 +188,8 @@ func NewConfig(ctx Context, args ...string) Config { // Tell python not to spam the source tree with .pyc files. ret.environ.Set("PYTHONDONTWRITEBYTECODE", "1") - ret.environ.Set("TMPDIR", absPath(ctx, ret.TempDir())) + tmpDir := absPath(ctx, ret.TempDir()) + ret.environ.Set("TMPDIR", tmpDir) // Always set ASAN_SYMBOLIZER_PATH so that ASAN-based tools can symbolize any crashes symbolizerPath := filepath.Join("prebuilts/clang/host", ret.HostPrebuiltTag(), @@ -261,6 +263,12 @@ func NewConfig(ctx Context, args ...string) Config { ret.environ.Set("BUILD_DATETIME_FILE", buildDateTimeFile) + if ret.UseRBE() { + for k, v := range getRBEVars(ctx, Config{ret}) { + ret.environ.Set(k, v) + } + } + c := Config{ret} storeConfigMetrics(ctx, c) return c @@ -820,13 +828,73 @@ func (c *configImpl) StartRBE() bool { return true } -func (c *configImpl) RBEStatsOutputDir() string { +func (c *configImpl) logDir() string { + if c.Dist() { + return filepath.Join(c.DistDir(), "logs") + } + return c.OutDir() +} + +func (c *configImpl) rbeStatsOutputDir() string { for _, f := range []string{"RBE_output_dir", "FLAG_output_dir"} { if v, ok := c.environ.Get(f); ok { return v } } - return "" + return c.logDir() +} + +func (c *configImpl) rbeLogPath() string { + for _, f := range []string{"RBE_log_path", "FLAG_log_path"} { + if v, ok := c.environ.Get(f); ok { + return v + } + } + return fmt.Sprintf("text://%v/reproxy_log.txt", c.logDir()) +} + +func (c *configImpl) rbeExecRoot() string { + for _, f := range []string{"RBE_exec_root", "FLAG_exec_root"} { + if v, ok := c.environ.Get(f); ok { + return v + } + } + wd, err := os.Getwd() + if err != nil { + return "" + } + return wd +} + +func (c *configImpl) rbeDir() string { + if v, ok := c.environ.Get("RBE_DIR"); ok { + return v + } + return "prebuilts/remoteexecution-client/live/" +} + +func (c *configImpl) rbeReproxy() string { + for _, f := range []string{"RBE_re_proxy", "FLAG_re_proxy"} { + if v, ok := c.environ.Get(f); ok { + return v + } + } + return filepath.Join(c.rbeDir(), "reproxy") +} + +func (c *configImpl) rbeAuth() (string, string) { + credFlags := []string{"use_application_default_credentials", "use_gce_credentials", "credential_file"} + for _, cf := range credFlags { + for _, f := range []string{"RBE_" + cf, "FLAG_" + cf} { + if v, ok := c.environ.Get(f); ok { + v = strings.TrimSpace(v) + if v != "" && v != "false" && v != "0" { + return "RBE_" + cf, v + } + } + } + } + return "RBE_use_application_default_credentials", "true" } func (c *configImpl) UseRemoteBuild() bool { diff --git a/ui/build/ninja.go b/ui/build/ninja.go index 4fc1f01e5..dfc3be1f3 100644 --- a/ui/build/ninja.go +++ b/ui/build/ninja.go @@ -128,6 +128,16 @@ func runNinja(ctx Context, config Config) { "GOMA_USE_LOCAL", // RBE client + "RBE_compare", + "RBE_exec_root", + "RBE_exec_strategy", + "RBE_invocation_id", + "RBE_log_dir", + "RBE_platform", + "RBE_remote_accept_cache", + "RBE_remote_update_cache", + "RBE_server_address", + // TODO: remove old FLAG_ variables. "FLAG_compare", "FLAG_exec_root", "FLAG_exec_strategy", diff --git a/ui/build/rbe.go b/ui/build/rbe.go index fcdab3b03..67bcebb75 100644 --- a/ui/build/rbe.go +++ b/ui/build/rbe.go @@ -15,8 +15,11 @@ package build import ( + "fmt" + "math/rand" "os" "path/filepath" + "time" "android/soong/ui/metrics" ) @@ -34,10 +37,8 @@ const ( func rbeCommand(ctx Context, config Config, rbeCmd string) string { var cmdPath string - if rbeDir, ok := config.Environment().Get("RBE_DIR"); ok { + if rbeDir := config.rbeDir(); rbeDir != "" { cmdPath = filepath.Join(rbeDir, rbeCmd) - } else if home, ok := config.Environment().Get("HOME"); ok { - cmdPath = filepath.Join(home, "rbe", rbeCmd) } else { ctx.Fatalf("rbe command path not found") } @@ -49,6 +50,23 @@ func rbeCommand(ctx Context, config Config, rbeCmd string) string { return cmdPath } +func getRBEVars(ctx Context, config Config) map[string]string { + rand.Seed(time.Now().UnixNano()) + vars := map[string]string{ + "RBE_log_path": config.rbeLogPath(), + "RBE_log_dir": config.logDir(), + "RBE_re_proxy": config.rbeReproxy(), + "RBE_exec_root": config.rbeExecRoot(), + "RBE_output_dir": config.rbeStatsOutputDir(), + } + if config.StartRBE() { + vars["RBE_server_address"] = fmt.Sprintf("unix://%v/reproxy_%v.sock", absPath(ctx, config.TempDir()), rand.Intn(1000)) + } + k, v := config.rbeAuth() + vars[k] = v + return vars +} + func startRBE(ctx Context, config Config) { ctx.BeginTrace(metrics.RunSetupTool, "rbe_bootstrap") defer ctx.EndTrace() @@ -94,7 +112,7 @@ func DumpRBEMetrics(ctx Context, config Config, filename string) { return } - outputDir := config.RBEStatsOutputDir() + outputDir := config.rbeStatsOutputDir() if outputDir == "" { ctx.Fatal("RBE output dir variable not defined. Aborting metrics dumping.") } @@ -103,7 +121,20 @@ func DumpRBEMetrics(ctx Context, config Config, filename string) { // Stop the proxy first in order to generate the RBE metrics protobuf file. stopRBE(ctx, config) + if metricsFile == filename { + return + } if _, err := copyFile(metricsFile, filename); err != nil { ctx.Fatalf("failed to copy %q to %q: %v\n", metricsFile, filename, err) } } + +// PrintGomaDeprecation prints a PSA on the deprecation of Goma if it is set for the build. +func PrintGomaDeprecation(ctx Context, config Config) { + if config.UseGoma() { + fmt.Fprintln(ctx.Writer, "") + fmt.Fprintln(ctx.Writer, "Goma for Android is being deprecated and replaced with RBE.") + fmt.Fprintln(ctx.Writer, "See go/goma_android_deprecation for more details.") + fmt.Fprintln(ctx.Writer, "") + } +} diff --git a/ui/build/rbe_test.go b/ui/build/rbe_test.go index 92ef77921..c56a33c0a 100644 --- a/ui/build/rbe_test.go +++ b/ui/build/rbe_test.go @@ -94,24 +94,13 @@ func TestDumpRBEMetrics(t *testing.T) { func TestDumpRBEMetricsErrors(t *testing.T) { ctx := testContext() tests := []struct { - description string - rbeOutputDirDefined bool - bootstrapProgram string - expectedErr string + description string + bootstrapProgram string + expectedErr string }{{ - description: "output_dir not defined", - bootstrapProgram: rbeBootstrapProgram, - expectedErr: "RBE output dir variable not defined", - }, { - description: "stopRBE failed", - rbeOutputDirDefined: true, - bootstrapProgram: "#!/bin/bash\nexit 1\n", - expectedErr: "shutdown failed", - }, { - description: "failed to copy metrics file", - rbeOutputDirDefined: true, - bootstrapProgram: "#!/bin/bash\n", - expectedErr: "failed to copy", + description: "stopRBE failed", + bootstrapProgram: "#!/bin/bash\nexit 1\n", + expectedErr: "shutdown failed", }} for _, tt := range tests { @@ -139,15 +128,6 @@ func TestDumpRBEMetricsErrors(t *testing.T) { env.Set("OUT_DIR", tmpDir) env.Set("RBE_DIR", tmpDir) - if tt.rbeOutputDirDefined { - tmpRBEDir, err := ioutil.TempDir("", "") - if err != nil { - t.Fatalf("failed to create a temp directory for RBE: %v", err) - } - defer os.RemoveAll(tmpRBEDir) - env.Set("RBE_output_dir", tmpRBEDir) - } - config := Config{&configImpl{ environ: env, }} |