diff --git a/android/config.go b/android/config.go index 8be16cfde..b83ffd4a5 100644 --- a/android/config.go +++ b/android/config.go @@ -249,6 +249,20 @@ func (c *config) BlueprintToolLocation() string { return filepath.Join(c.buildDir, "host", c.PrebuiltOS(), "bin") } +// HostSystemTool looks for non-hermetic tools from the system we're running on. +// Generally shouldn't be used, but useful to find the XCode SDK, etc. +func (c *config) HostSystemTool(name string) string { + for _, dir := range filepath.SplitList(c.Getenv("PATH")) { + path := filepath.Join(dir, name) + if s, err := os.Stat(path); err != nil { + continue + } else if m := s.Mode(); !s.IsDir() && m&0111 != 0 { + return path + } + } + return name +} + // PrebuiltOS returns the name of the host OS used in prebuilts directories func (c *config) PrebuiltOS() string { switch runtime.GOOS { @@ -289,7 +303,7 @@ func (c *config) Getenv(key string) string { if c.envFrozen { panic("Cannot access new environment variables after envdeps are frozen") } - val = os.Getenv(key) + val, _ = originalEnv[key] c.envDeps[key] = val } return val diff --git a/android/env.go b/android/env.go index c7409e872..ec5794e36 100644 --- a/android/env.go +++ b/android/env.go @@ -15,6 +15,9 @@ package android import ( + "os" + "strings" + "android/soong/env" "github.com/google/blueprint" @@ -27,6 +30,19 @@ import ( // compare the contents of the environment variables, rewriting the file if necessary to cause // a manifest regeneration. +var originalEnv map[string]string + +func init() { + originalEnv = make(map[string]string) + for _, env := range os.Environ() { + idx := strings.IndexRune(env, '=') + if idx != -1 { + originalEnv[env[:idx]] = env[idx+1:] + } + } + os.Clearenv() +} + func EnvSingleton() blueprint.Singleton { return &envSingleton{} } diff --git a/cc/config/x86_darwin_host.go b/cc/config/x86_darwin_host.go index b6b08fe15..65fa1edda 100644 --- a/cc/config/x86_darwin_host.go +++ b/cc/config/x86_darwin_host.go @@ -115,7 +115,8 @@ const ( func init() { pctx.VariableFunc("macSdkPath", func(config interface{}) (string, error) { - bytes, err := exec.Command("xcode-select", "--print-path").Output() + xcodeselect := config.(android.Config).HostSystemTool("xcode-select") + bytes, err := exec.Command(xcodeselect, "--print-path").Output() return strings.TrimSpace(string(bytes)), err }) pctx.VariableFunc("macSdkRoot", func(config interface{}) (string, error) { @@ -123,18 +124,16 @@ func init() { }) pctx.StaticVariable("macMinVersion", "10.8") pctx.VariableFunc("MacArPath", func(config interface{}) (string, error) { - bytes, err := exec.Command("xcrun", "--find", "ar").Output() - return strings.TrimSpace(string(bytes)), err + return xcrun(config.(android.Config), "--find", "ar") }) pctx.VariableFunc("MacStripPath", func(config interface{}) (string, error) { - bytes, err := exec.Command("xcrun", "--find", "strip").Output() - return strings.TrimSpace(string(bytes)), err + return xcrun(config.(android.Config), "--find", "strip") }) pctx.VariableFunc("MacToolPath", func(config interface{}) (string, error) { - bytes, err := exec.Command("xcrun", "--find", "ld").Output() - return filepath.Dir(strings.TrimSpace(string(bytes))), err + path, err := xcrun(config.(android.Config), "--find", "ld") + return filepath.Dir(path), err }) pctx.StaticVariable("DarwinGccVersion", darwinGccVersion) @@ -162,13 +161,20 @@ func init() { pctx.StaticVariable("DarwinX8664ClangLdflags", strings.Join(darwinX8664ClangLdflags, " ")) } +func xcrun(config android.Config, args ...string) (string, error) { + xcrun := config.HostSystemTool("xcrun") + bytes, err := exec.Command(xcrun, args...).Output() + return strings.TrimSpace(string(bytes)), err +} + func xcrunSdk(config android.Config, arg string) (string, error) { + xcrun := config.HostSystemTool("xcrun") if selected := config.Getenv("MAC_SDK_VERSION"); selected != "" { if !inList(selected, darwinSupportedSdkVersions) { return "", fmt.Errorf("MAC_SDK_VERSION %s isn't supported: %q", selected, darwinSupportedSdkVersions) } - bytes, err := exec.Command("xcrun", "--sdk", "macosx"+selected, arg).Output() + bytes, err := exec.Command(xcrun, "--sdk", "macosx"+selected, arg).Output() if err == nil { return strings.TrimSpace(string(bytes)), err } @@ -176,7 +182,7 @@ func xcrunSdk(config android.Config, arg string) (string, error) { } for _, sdk := range darwinSupportedSdkVersions { - bytes, err := exec.Command("xcrun", "--sdk", "macosx"+sdk, arg).Output() + bytes, err := exec.Command(xcrun, "--sdk", "macosx"+sdk, arg).Output() if err == nil { return strings.TrimSpace(string(bytes)), err }