diff options
Diffstat (limited to 'android/env.go')
-rw-r--r-- | android/env.go | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/android/env.go b/android/env.go index 46bd3d6c5..c7c96d5cf 100644 --- a/android/env.go +++ b/android/env.go @@ -15,9 +15,11 @@ package android import ( + "fmt" "os" "os/exec" "strings" + "syscall" "android/soong/env" ) @@ -30,28 +32,59 @@ import ( // a manifest regeneration. var originalEnv map[string]string -var SoongDelveListen string -var SoongDelvePath string +var soongDelveListen string +var soongDelvePath string +var soongDelveEnv []string func init() { // Delve support needs to read this environment variable very early, before NewConfig has created a way to // access originalEnv with dependencies. Store the value where soong_build can find it, it will manually // ensure the dependencies are created. - SoongDelveListen = os.Getenv("SOONG_DELVE") - SoongDelvePath, _ = exec.LookPath("dlv") + soongDelveListen = os.Getenv("SOONG_DELVE") + soongDelvePath, _ = exec.LookPath("dlv") originalEnv = make(map[string]string) + soongDelveEnv = []string{} for _, env := range os.Environ() { idx := strings.IndexRune(env, '=') if idx != -1 { originalEnv[env[:idx]] = env[idx+1:] + if env[:idx] != "SOONG_DELVE" { + soongDelveEnv = append(soongDelveEnv, env) + } } } + // Clear the environment to prevent use of os.Getenv(), which would not provide dependencies on environment // variable values. The environment is available through ctx.Config().Getenv, ctx.Config().IsEnvTrue, etc. os.Clearenv() } +func ReexecWithDelveMaybe() { + if soongDelveListen == "" { + return + } + + if soongDelvePath == "" { + fmt.Fprintln(os.Stderr, "SOONG_DELVE is set but failed to find dlv") + os.Exit(1) + } + dlvArgv := []string{ + soongDelvePath, + "--listen=:" + soongDelveListen, + "--headless=true", + "--api-version=2", + "exec", + os.Args[0], + "--", + } + dlvArgv = append(dlvArgv, os.Args[1:]...) + os.Chdir(absSrcDir) + syscall.Exec(soongDelvePath, dlvArgv, soongDelveEnv) + fmt.Fprintln(os.Stderr, "exec() failed while trying to reexec with Delve") + os.Exit(1) +} + // getenv checks either os.Getenv or originalEnv so that it works before or after the init() // function above. It doesn't add any dependencies on the environment variable, so it should // only be used for values that won't change. For values that might change use ctx.Config().Getenv. |