platform_build_soong/ui/build/java.go
Tobias Thierer 849bb6bf99 Allow version 9 toolchains for EXPERIMENTAL_USE_OPENJDK9
By default, the Android build enforces an OpenJDK 8 toolchain,
whose name contains the strings "openjdk" and "1.8".

After this CL, the check can be changed to enforce a toolchain
name starting with "9" and without the need for "openjdk" having
to occur in the name.

This experimental new check can be enabled by running:
  export EXPERIMENTAL_USE_OPENJDK9=true
To switch back to the standard check, run:
  unset EXPERIMENTAL_USE_OPENJDK9

Test: make ANDROID_COMPILE_WITH_JACK=false checkbuild tests \
      && make checkbuild tests
      (with OpenJDK 8u45 toolchain on the PATH)
Test: make EXPERIMENTAL_USE_OPENJDK9=true \
      ANDROID_COMPILE_WITH_JACK=false checkbuild
      (with jdk 9-ea+170 toolchain on the PATH)
Bug: 38177295

Change-Id: I75de3e23fe0b7f41eb6dd3f55dadd3fa3c3383bd
2017-05-26 12:45:25 +01:00

163 lines
5.5 KiB
Go

// 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")
}
}