Setup java paths in soong_ui

This way config.mk no longer needs to check which java is in PATH and
fix it. It'll be consistent for all build steps under soong_ui.

Also unify handling of ANDROID_JAVA_HOME / JAVA_HOME with
OVERRIDE_ANDROID_JAVA_HOME / EXPERIMENTAL_USE_OPENJDK9.

Test: m nothing
Test: build/soong/soong_ui.bash --make-mode nothing (w/o envsetup.sh)
Test: aosp_arm ninja files are the same before/after
Test: before/after ninja files match with OVERRIDE_ANDROID_JAVA_HOME
Test: before/after ninja files match with EXPERIMENTAL_USE_OPENJDK9
Change-Id: Icdb65093d9c346524074de239a4f895e4230a24d
diff --git a/ui/build/config.go b/ui/build/config.go
index 191a102..940bb2f 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -104,6 +104,9 @@
 		"MAKEFLAGS",
 		"MAKELEVEL",
 		"MFLAGS",
+
+		// Set in envsetup.sh, reset in makefiles
+		"ANDROID_JAVA_TOOLCHAIN",
 	)
 
 	// Tell python not to spam the source tree with .pyc files.
@@ -117,14 +120,12 @@
 		log.Fatalln("Error verifying tree state:", err)
 	}
 
-	if srcDir, err := filepath.Abs("."); err == nil {
-		if strings.ContainsRune(srcDir, ' ') {
-			log.Println("You are building in a directory whose absolute path contains a space character:")
-			log.Println()
-			log.Printf("%q\n", srcDir)
-			log.Println()
-			log.Fatalln("Directory names containing spaces are not supported")
-		}
+	if srcDir := absPath(ctx, "."); strings.ContainsRune(srcDir, ' ') {
+		log.Println("You are building in a directory whose absolute path contains a space character:")
+		log.Println()
+		log.Printf("%q\n", srcDir)
+		log.Println()
+		log.Fatalln("Directory names containing spaces are not supported")
 	}
 
 	if outDir := ret.OutDir(); strings.ContainsRune(outDir, ' ') {
@@ -143,6 +144,27 @@
 		log.Fatalln("Directory names containing spaces are not supported")
 	}
 
+	// Configure Java-related variables, including adding it to $PATH
+	javaHome := func() string {
+		if override, ok := ret.environ.Get("OVERRIDE_ANDROID_JAVA_HOME"); ok {
+			return override
+		}
+		if v, ok := ret.environ.Get("EXPERIMENTAL_USE_OPENJDK9"); ok && v != "" {
+			return filepath.Join("prebuilts/jdk/jdk9", ret.HostPrebuiltTag())
+		}
+		return filepath.Join("prebuilts/jdk/jdk8", ret.HostPrebuiltTag())
+	}()
+	absJavaHome := absPath(ctx, javaHome)
+
+	newPath := []string{filepath.Join(absJavaHome, "bin")}
+	if path, ok := ret.environ.Get("PATH"); ok && path != "" {
+		newPath = append(newPath, path)
+	}
+	ret.environ.Unset("OVERRIDE_ANDROID_JAVA_HOME")
+	ret.environ.Set("JAVA_HOME", absJavaHome)
+	ret.environ.Set("ANDROID_JAVA_HOME", javaHome)
+	ret.environ.Set("PATH", strings.Join(newPath, string(filepath.ListSeparator)))
+
 	return Config{ret}
 }
 
diff --git a/ui/build/sandbox_darwin.go b/ui/build/sandbox_darwin.go
index 2cf6e20..56791f7 100644
--- a/ui/build/sandbox_darwin.go
+++ b/ui/build/sandbox_darwin.go
@@ -50,14 +50,8 @@
 
 func (c *Cmd) wrapSandbox() {
 	homeDir, _ := c.Environment.Get("HOME")
-	outDir, err := filepath.Abs(c.config.OutDir())
-	if err != nil {
-		c.ctx.Fatalln("Failed to get absolute path of OUT_DIR:", err)
-	}
-	distDir, err := filepath.Abs(c.config.DistDir())
-	if err != nil {
-		c.ctx.Fatalln("Failed to get absolute path of DIST_DIR:", err)
-	}
+	outDir := absPath(c.ctx, c.config.OutDir())
+	distDir := absPath(c.ctx, c.config.DistDir())
 
 	c.Args[0] = c.Path
 	c.Path = sandboxExecPath
diff --git a/ui/build/soong.go b/ui/build/soong.go
index 8220597..d3bcf87 100644
--- a/ui/build/soong.go
+++ b/ui/build/soong.go
@@ -77,9 +77,7 @@
 		var cfg microfactory.Config
 		cfg.Map("github.com/google/blueprint", "build/blueprint")
 
-		if absPath, err := filepath.Abs("."); err == nil {
-			cfg.TrimPath = absPath
-		}
+		cfg.TrimPath = absPath(ctx, ".")
 
 		minibp := filepath.Join(config.SoongOutDir(), ".minibootstrap/minibp")
 		if _, err := microfactory.Build(&cfg, minibp, "github.com/google/blueprint/bootstrap/minibp"); err != nil {
diff --git a/ui/build/util.go b/ui/build/util.go
index 2555e8a..f698ccd 100644
--- a/ui/build/util.go
+++ b/ui/build/util.go
@@ -24,6 +24,14 @@
 	"unsafe"
 )
 
+func absPath(ctx Context, p string) string {
+	ret, err := filepath.Abs(p)
+	if err != nil {
+		ctx.Fatalf("Failed to get absolute path: %v", err)
+	}
+	return ret
+}
+
 // indexList finds the index of a string in a []string
 func indexList(s string, list []string) int {
 	for i, l := range list {