diff --git a/build.gradle.kts b/build.gradle.kts index 5ebd527d5c7..a0d82cafeec 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -102,12 +102,31 @@ extra["ideaUltimatePluginDir"] = project.file(ideaUltimatePluginDir) extra["cidrPluginDir"] = project.file(cidrPluginDir) extra["isSonatypeRelease"] = false +// Work-around necessary to avoid setting null javaHome. Will be removed after support of lazy task configuration +val jdkNotFoundConst = "JDK NOT FOUND" + extra["JDK_16"] = jdkPath("1.6") extra["JDK_17"] = jdkPath("1.7") extra["JDK_18"] = jdkPath("1.8") extra["JDK_9"] = jdkPath("9") -extra["JDK_10"] = jdkPathIfFound("10") -extra["JDK_11"] = jdkPathIfFound("11") +extra["JDK_10"] = jdkPath("10") +extra["JDK_11"] = jdkPath("11") + +gradle.taskGraph.beforeTask() { + checkJDK() +} + +var jdkChecked: Boolean = false +fun checkJDK() { + if (jdkChecked) { + return + } + var unpresentJdks = JdkMajorVersion.values().filter { it.isMandatory() }.map { it -> it.name }.filter { it == null || extra[it] == jdkNotFoundConst }.toList() + if (!unpresentJdks.isEmpty()) { + throw GradleException("Please set environment variable${if (unpresentJdks.size > 1) "s" else ""}: ${unpresentJdks.joinToString()} to point to corresponding JDK installation.") + } + jdkChecked = true +} rootProject.apply { from(rootProject.file("versions.gradle.kts")) @@ -245,13 +264,18 @@ fun Task.listConfigurationContents(configName: String) { } val defaultJvmTarget = "1.8" -val defaultJavaHome = jdkPath(defaultJvmTarget!!) +val defaultJavaHome = jdkPath(defaultJvmTarget) val ignoreTestFailures by extra(project.findProperty("ignoreTestFailures")?.toString()?.toBoolean() ?: project.hasProperty("teamcity")) allprojects { jvmTarget = defaultJvmTarget - javaHome = defaultJavaHome + if (defaultJavaHome != null) { + javaHome = defaultJavaHome + } else { + logger.error("Could not find default java home. Please set environment variable JDK_${defaultJavaHome} to point to JDK ${defaultJavaHome} installation.") + } + // There are problems with common build dir: // - some tests (in particular js and binary-compatibility-validator depend on the fixed (default) location @@ -314,10 +338,10 @@ allprojects { task("listDistJar") { listConfigurationContents("distJar") } afterEvaluate { - logger.info("configuring project $name to compile to the target jvm version $jvmTarget using jdk: $javaHome") if (javaHome != defaultJavaHome || jvmTarget != defaultJvmTarget) { + logger.info("configuring project $name to compile to the target jvm version $jvmTarget using jdk: $javaHome") configureJvmProject(javaHome!!, jvmTarget!!) - } + } // else we will actually fail during the first task execution. We could not fail before configuration is done due to impact on import in IDE fun File.toProjectRootRelativePathOrSelf() = (relativeToOrNull(rootDir)?.takeUnless { it.startsWith("..") } ?: this).path @@ -644,14 +668,12 @@ configure { } } -fun jdkPathIfFound(version: String): String? { +fun jdkPath(version: String): String { val jdkName = "JDK_${version.replace(".", "")}" val jdkMajorVersion = JdkMajorVersion.valueOf(jdkName) - return configuredJdks.find { it.majorVersion == jdkMajorVersion }?.homeDir?.canonicalPath + return configuredJdks.find { it.majorVersion == jdkMajorVersion }?.homeDir?.canonicalPath?:jdkNotFoundConst } -fun jdkPath(version: String): String = jdkPathIfFound(version) - ?: throw GradleException ("Please set environment variable JDK_${version.replace(".", "")} to point to JDK $version installation") fun Project.configureJvmProject(javaHome: String, javaVersion: String) { tasks.withType { diff --git a/buildSrc/src/main/kotlin/jdksFinder.kt b/buildSrc/src/main/kotlin/jdksFinder.kt index a46d8a64ba7..80060a7d072 100644 --- a/buildSrc/src/main/kotlin/jdksFinder.kt +++ b/buildSrc/src/main/kotlin/jdksFinder.kt @@ -8,8 +8,10 @@ import java.io.File import net.rubygrapefruit.platform.WindowsRegistry.Key.HKEY_LOCAL_MACHINE import org.gradle.internal.os.OperatingSystem -enum class JdkMajorVersion { - JDK_16, JDK_17, JDK_18, JDK_9, JDK_10, JDK_11 +enum class JdkMajorVersion(val mandatory: Boolean = true) { + JDK_16, JDK_17, JDK_18, JDK_9(false), JDK_10(false), JDK_11(false); + + fun isMandatory() : Boolean = mandatory } val jdkAlternativeVarNames = mapOf(JdkMajorVersion.JDK_9 to listOf("JDK_19"))