Revert "Revert "Ensure environment dependencies are correct""

This reverts commit 4068a5db6c60d890e4d49379d600fd34ee94fdec.

Now the Mac xcode-select and xcrun goes through Config.HostSystemTool,
which will grab $PATH through Config.Getenv

Test: m -j (on mac)
Change-Id: I2632c4fdb2ec961e59944cf02ff165e0fd3c869d
diff --git a/android/config.go b/android/config.go
index 8be16cf..b83ffd4 100644
--- a/android/config.go
+++ b/android/config.go
@@ -249,6 +249,20 @@
 	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 @@
 		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 c7409e8..ec5794e 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 @@
 // 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 b6b08fe..65fa1ed 100644
--- a/cc/config/x86_darwin_host.go
+++ b/cc/config/x86_darwin_host.go
@@ -115,7 +115,8 @@
 
 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 @@
 	})
 	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 @@
 	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 @@
 	}
 
 	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
 		}