From 4e2456bc0977b5510f9c35610f0c2d89ce9cd3c3 Mon Sep 17 00:00:00 2001 From: Dan Willemsen Date: Thu, 3 Oct 2019 16:45:58 -0700 Subject: [PATCH] Fix dumpvars $PATH / $TMPDIR Instead of just using the host $PATH during dumpvars, use our path configuration from the regular build. But instead of creating a ton of symlinks to the interposer, just use a small directory of symlinks. This only takes ~3ms (vs ~300ms), at the expense of error logging. Since we do just about the same product configuration at the start of the build, we can just rely on the logging there. This fixes warnings printed by the Mac build, since we using the host `date` instead of the toybox version: usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] TMPDIR was being shared with the main build, but we're allowed to run in parallel. If a build is started while we're running, our TMPDIR may be cleared. Instead, create our own temporary directory, which doesn't need to be a stable value (as we never do caching here). Fixes: 141893400 Test: (on mac) source build/envsetup.sh; lunch Change-Id: I0ff536e71dc5649cae26daa0087eb80861704021 --- ui/build/dumpvars.go | 14 +++++++++++++- ui/build/path.go | 46 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/ui/build/dumpvars.go b/ui/build/dumpvars.go index 82b275010..1925e87b9 100644 --- a/ui/build/dumpvars.go +++ b/ui/build/dumpvars.go @@ -17,6 +17,8 @@ package build import ( "bytes" "fmt" + "io/ioutil" + "os" "strings" "android/soong/ui/metrics" @@ -51,7 +53,17 @@ func DumpMakeVars(ctx Context, config Config, goals, vars []string) (map[string] var ret map[string]string if len(makeVars) > 0 { - var err error + tmpDir, err := ioutil.TempDir("", "dumpvars") + if err != nil { + return nil, err + } + defer os.RemoveAll(tmpDir) + + // It's not safe to use the same TMPDIR as the build, as that can be removed. + config.Environment().Set("TMPDIR", tmpDir) + + SetupLitePath(ctx, config) + ret, err = dumpMakeVars(ctx, config, goals, makeVars, false) if err != nil { return ret, err diff --git a/ui/build/path.go b/ui/build/path.go index 0e1c02cac..c34ba1b52 100644 --- a/ui/build/path.go +++ b/ui/build/path.go @@ -18,6 +18,7 @@ import ( "fmt" "io/ioutil" "os" + "os/exec" "path/filepath" "runtime" "strings" @@ -53,6 +54,51 @@ func parsePathDir(dir string) []string { return ret } +// A "lite" version of SetupPath used for dumpvars, or other places that need +// minimal overhead (but at the expense of logging). +func SetupLitePath(ctx Context, config Config) { + if config.pathReplaced { + return + } + + ctx.BeginTrace(metrics.RunSetupTool, "litepath") + defer ctx.EndTrace() + + origPath, _ := config.Environment().Get("PATH") + myPath, _ := config.Environment().Get("TMPDIR") + myPath = filepath.Join(myPath, "path") + ensureEmptyDirectoriesExist(ctx, myPath) + + os.Setenv("PATH", origPath) + for name, pathConfig := range paths.Configuration { + if !pathConfig.Symlink { + continue + } + + origExec, err := exec.LookPath(name) + if err != nil { + continue + } + origExec, err = filepath.Abs(origExec) + if err != nil { + continue + } + + err = os.Symlink(origExec, filepath.Join(myPath, name)) + if err != nil { + ctx.Fatalln("Failed to create symlink:", err) + } + } + + myPath, _ = filepath.Abs(myPath) + + prebuiltsPath, _ := filepath.Abs("prebuilts/build-tools/path/" + runtime.GOOS + "-x86") + myPath = prebuiltsPath + string(os.PathListSeparator) + myPath + + config.Environment().Set("PATH", myPath) + config.pathReplaced = true +} + func SetupPath(ctx Context, config Config) { if config.pathReplaced { return