diff options
Diffstat (limited to 'ui/build/java.go')
-rw-r--r-- | ui/build/java.go | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/ui/build/java.go b/ui/build/java.go new file mode 100644 index 00000000..473af012 --- /dev/null +++ b/ui/build/java.go @@ -0,0 +1,163 @@ +// Copyright 2017 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package build + +import ( + "regexp" + "runtime" + "strings" + "sync" +) + +const incompatibleJavacStr = "google" + +var javaVersionInfo = struct { + once sync.Once + startOnce sync.Once + + java_version_output string + javac_version_output string +}{} + +func getJavaVersions(ctx Context, config Config) { + javaVersionInfo.startOnce.Do(func() { + go func() { + if ctx.Tracer != nil { + thread := ctx.Tracer.NewThread("java_version") + ctx.Tracer.Begin("get version", thread) + defer ctx.Tracer.End(thread) + } + + getJavaVersionsImpl(ctx, config) + }() + }) +} + +func getJavaVersionsImpl(ctx Context, config Config) { + javaVersionInfo.once.Do(func() { + cmd := Command(ctx, config, "java", "java", "-version") + cmd.Environment.Unset("_JAVA_OPTIONS") + javaVersionInfo.java_version_output = string(cmd.CombinedOutputOrFatal()) + + cmd = Command(ctx, config, "javac", "javac", "-version") + cmd.Environment.Unset("_JAVA_OPTIONS") + javaVersionInfo.javac_version_output = string(cmd.CombinedOutputOrFatal()) + }) +} + +func checkJavaVersion(ctx Context, config Config) { + ctx.BeginTrace("java_version_check") + defer ctx.EndTrace() + + getJavaVersionsImpl(ctx, config) + + var required_java_version string + var java_version_regexp *regexp.Regexp + var javac_version_regexp *regexp.Regexp + + oj9_env, _ := config.Environment().Get("EXPERIMENTAL_USE_OPENJDK9") + experimental_use_openjdk9 := oj9_env != "" + + if experimental_use_openjdk9 { + required_java_version = "9" + java_version_regexp = regexp.MustCompile(`^java .* "9.*"`) + javac_version_regexp = regexp.MustCompile(`^javac 9`) + } else { + required_java_version = "1.8" + java_version_regexp = regexp.MustCompile(`[ "]1\.8[\. "$]`) + javac_version_regexp = java_version_regexp + } + + java_version := javaVersionInfo.java_version_output + javac_version := javaVersionInfo.javac_version_output + + found := false + for _, l := range strings.Split(java_version, "\n") { + if java_version_regexp.MatchString(l) { + java_version = l + found = true + break + } + } + if !found { + ctx.Println("***************************************************************") + ctx.Println("You are attempting to build with the incorrect version of java.") + ctx.Println() + ctx.Println("Your version is:", java_version) + ctx.Println("The required version is:", required_java_version+".x") + ctx.Println() + ctx.Println("Please follow the machine setup instructions at:") + ctx.Println(" https://source.android.com/source/initializing.html") + ctx.Println("***************************************************************") + ctx.Fatalln("stop") + } + + if runtime.GOOS == "linux" { + // Early access builds of OpenJDK 9 do not contain the string "openjdk" in the + // version name. TODO(tobiast): Reconsider once the OpenJDK 9 toolchain is stable. + // http://b/62123342 + if !strings.Contains(java_version, "openjdk") && !experimental_use_openjdk9 { + ctx.Println("*******************************************************") + ctx.Println("You are attempting to build with an unsupported JDK.") + ctx.Println() + ctx.Println("Only an OpenJDK based JDK is supported.") + ctx.Println() + ctx.Println("Please follow the machine setup instructions at:") + ctx.Println(" https://source.android.com/source/initializing.html") + ctx.Println("*******************************************************") + ctx.Fatalln("stop") + } + } else { // darwin + if strings.Contains(java_version, "openjdk") { + ctx.Println("*******************************************************") + ctx.Println("You are attempting to build with an unsupported JDK.") + ctx.Println() + ctx.Println("You use OpenJDK, but only Sun/Oracle JDK is supported.") + ctx.Println() + ctx.Println("Please follow the machine setup instructions at:") + ctx.Println(" https://source.android.com/source/initializing.html") + ctx.Println("*******************************************************") + ctx.Fatalln("stop") + } + } + + incompatible_javac := strings.Contains(javac_version, incompatibleJavacStr) + + found = false + for _, l := range strings.Split(javac_version, "\n") { + if javac_version_regexp.MatchString(l) { + javac_version = l + found = true + break + } + } + if !found || incompatible_javac { + ctx.Println("****************************************************************") + ctx.Println("You are attempting to build with the incorrect version of javac.") + ctx.Println() + ctx.Println("Your version is:", javac_version) + if incompatible_javac { + ctx.Println("The '" + incompatibleJavacStr + "' version is not supported for Android platform builds.") + ctx.Println("Use a publically available JDK and make sure you have run envsetup.sh / lunch.") + } else { + ctx.Println("The required version is:", required_java_version) + } + ctx.Println() + ctx.Println("Please follow the machine setup instructions at:") + ctx.Println(" https://source.android.com/source/initializing.html") + ctx.Println("****************************************************************") + ctx.Fatalln("stop") + } +} |