From 77890545476d218345838e70a503f55afba013e9 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Tue, 29 Jun 2021 15:42:02 +0200 Subject: [PATCH] Migrate repo to use JVM toolchains Gradle feature. ^KT-46972 Fixed --- ReadMe.md | 24 +-- build.gradle.kts | 115 +--------- .../src/main/kotlin/CacheableProguradTask.kt | 32 +-- buildSrc/src/main/kotlin/JvmToolchain.kt | 86 ++++++++ buildSrc/src/main/kotlin/LibrariesCommon.kt | 75 +++++++ buildSrc/src/main/kotlin/dependencies.kt | 14 +- buildSrc/src/main/kotlin/embeddable.kt | 20 ++ buildSrc/src/main/kotlin/jdksFinder.kt | 198 ------------------ compiler/compiler.version/build.gradle.kts | 16 +- .../build.gradle.kts | 2 +- compiler/tests-common-jvm6/build.gradle.kts | 2 +- compiler/tests-different-jdk/build.gradle.kts | 62 +++--- .../codegen/jdk/SeparateJavaProcessHelper.kt | 4 +- compiler/tests-java8/build.gradle.kts | 1 - core/compiler.common.jvm/build.gradle.kts | 8 +- core/compiler.common/build.gradle.kts | 8 +- core/descriptors.jvm/build.gradle.kts | 8 +- core/descriptors.runtime/build.gradle.kts | 29 +-- core/descriptors/build.gradle.kts | 8 +- .../build.gradle.kts | 8 +- core/deserialization.common/build.gradle.kts | 8 +- core/deserialization/build.gradle.kts | 8 +- core/metadata.jvm/build.gradle.kts | 8 +- core/metadata/build.gradle.kts | 8 +- core/util.runtime/build.gradle.kts | 8 +- dependencies/tools-jar-api/build.gradle.kts | 5 +- gradle.properties | 4 + libraries/commonConfiguration.gradle | 79 ------- .../annotations-common/build.gradle | 2 +- libraries/kotlin.test/common/build.gradle | 2 +- libraries/kotlin.test/junit/build.gradle | 5 +- libraries/kotlin.test/junit5/build.gradle | 12 +- libraries/kotlin.test/jvm/build.gradle | 6 +- libraries/kotlin.test/testng/build.gradle | 7 +- libraries/kotlinx-metadata/build.gradle.kts | 3 +- .../kotlinx-metadata/jvm/build.gradle.kts | 3 +- libraries/reflect/api/build.gradle | 8 +- libraries/reflect/build.gradle.kts | 22 +- libraries/scripting/common/build.gradle.kts | 2 +- .../dependencies-maven/build.gradle.kts | 2 +- .../scripting/dependencies/build.gradle.kts | 2 +- libraries/scripting/intellij/build.gradle.kts | 2 - libraries/scripting/jvm/build.gradle.kts | 8 +- libraries/stdlib/common/build.gradle | 2 +- libraries/stdlib/jdk7/build.gradle | 22 +- libraries/stdlib/jdk8/build.gradle | 28 +-- .../jvm-minimal-for-test/build.gradle.kts | 8 +- libraries/stdlib/jvm/build.gradle | 9 +- libraries/stdlib/samples/build.gradle | 5 - libraries/tools/kotlin-allopen/build.gradle | 2 - .../tools/kotlin-annotations-jvm/build.gradle | 9 +- .../build.gradle.kts | 25 ++- .../kotlin/gradle/KotlinJavaToolchainTest.kt | 4 +- .../kotlin-gradle-plugin/build.gradle.kts | 1 - .../tools/kotlin-main-kts/build.gradle.kts | 26 ++- libraries/tools/kotlin-noarg/build.gradle | 8 - .../kotlin-sam-with-receiver/build.gradle | 8 - .../build.gradle | 6 - .../tools/kotlin-serialization/build.gradle | 6 - .../build.gradle.kts | 7 +- libraries/tools/script-runtime/build.gradle | 4 +- .../build.gradle.kts | 2 +- plugins/kapt3/kapt3-runtime/build.gradle.kts | 2 +- .../parcelize-runtime/build.gradle.kts | 2 +- .../build.gradle.kts | 2 +- .../scripting-ide-services/build.gradle.kts | 2 +- prepare/compiler/build.gradle.kts | 23 +- 67 files changed, 424 insertions(+), 723 deletions(-) create mode 100644 buildSrc/src/main/kotlin/JvmToolchain.kt create mode 100644 buildSrc/src/main/kotlin/LibrariesCommon.kt delete mode 100644 buildSrc/src/main/kotlin/jdksFinder.kt diff --git a/ReadMe.md b/ReadMe.md index 7feb2f6d60a..f356a69e71c 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -41,20 +41,20 @@ Support for multiplatform programming is one of Kotlin’s key benefits. It redu ## Build environment requirements -In order to build Kotlin distribution you need to have: +This repository is using [Gradle toolchains](https://docs.gradle.org/current/userguide/toolchains.html) feature +to select and auto-provision required JDKs from [AdoptOpenJdk](https://adoptopenjdk.net) project. -- JDK 1.6, 1.7, 1.8 and 9 -- Setup environment variables as following: +Unfortunately [AdoptOpenJdk](https://adoptopenjdk.net) project does not provide required JDK 1.6 and 1.7 images, +so you could either download them manually and provide path to installation via `JDK_16` and `JDK_17` environment variables or +use following SDK managers: +- [Asdf-vm](https://asdf-vm.com/) +- [Jabba](https://github.com/shyiko/jabba) +- [SDKMAN!](https://sdkman.io/) - JAVA_HOME="path to JDK 1.8" - JDK_16="path to JDK 1.6" - JDK_17="path to JDK 1.7" - JDK_18="path to JDK 1.8" - JDK_9="path to JDK 9" - -For local development, if you're not working on bytecode generation or the standard library, it's OK to have only JDK 1.8 and JDK 9 installed, and to point `JDK_16` and `JDK_17` environment variables to your JDK 1.8 installation. - -You also can use [Gradle properties](https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties) to setup `JDK_*` variables. +Alternatively, it is still possible to only provide required JDKs via environment variables +(see [gradle.properties](./gradle.properties#L5) for supported variable names). To ensure Gradle uses only JDKs +from environmental variables - disable Gradle toolchain auto-detection by passing `-Porg.gradle.java.installations.auto-detect=false` option +(or put it into `$GRADLE_USER_HOME/gradle.properties`). Note: The JDK 6 for MacOS is not available on Oracle's site. You can install it by diff --git a/build.gradle.kts b/build.gradle.kts index f0782b5db8d..a97df692a6f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,6 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.crypto.checksum.Checksum import org.gradle.plugins.ide.idea.model.IdeaModel -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import proguard.gradle.ProGuardTask buildscript { @@ -56,13 +55,6 @@ pill { val isTeamcityBuild = project.kotlinBuildProperties.isTeamcityBuild -val configuredJdks: List = - getConfiguredJdks().also { - it.forEach { jdkId -> - logger.info("Using ${jdkId.majorVersion} home: ${jdkId.homeDir}") - } - } - val defaultSnapshotVersion: String by extra val buildNumber by extra(findProperty("build.number")?.toString() ?: defaultSnapshotVersion) val kotlinVersion by extra( @@ -114,37 +106,6 @@ subprojects { extra["kotlinNativeVersion"] = kotlinNativeVersionObject } -// Work-around necessary to avoid setting null javaHome. Will be removed after support of lazy task configuration -val jdkNotFoundConst = "JDK NOT FOUND" - -if (isTeamcityBuild) { - extra["JDK_16"] = jdkPath("1.6") - extra["JDK_17"] = jdkPath("1.7") -} else { - extra["JDK_16"] = jdkPath("1.6", "1.8") - extra["JDK_17"] = jdkPath("1.7", "1.8") -} -extra["JDK_18"] = jdkPath("1.8") -extra["JDK_9"] = jdkPath("9") -extra["JDK_10"] = jdkPath("10") -extra["JDK_11"] = jdkPath("11") -extra["JDK_15"] = jdkPath("15") - -// allow opening the project without setting up all env variables (see KT-26413) -if (!kotlinBuildProperties.isInIdeaSync) { - checkJDK() -} - -fun checkJDK() { - val missingEnvVars = JdkMajorVersion.values() - .filter { it.isMandatory() && extra[it.name] == jdkNotFoundConst } - .mapTo(ArrayList()) { it.name } - - if (missingEnvVars.isNotEmpty()) { - throw GradleException("Required environment variables are missing: ${missingEnvVars.joinToString()}") - } -} - rootProject.apply { from(rootProject.file("gradle/versions.gradle.kts")) from(rootProject.file("gradle/report.gradle.kts")) @@ -423,8 +384,6 @@ fun Task.listConfigurationContents(configName: String) { } } -val defaultJvmTarget = "1.8" -val defaultJavaHome = jdkPath(if (Platform[203].orHigher()) "11" else defaultJvmTarget) val ignoreTestFailures by extra(project.kotlinBuildProperties.ignoreTestFailures) allprojects { @@ -470,17 +429,16 @@ allprojects { } } - jvmTarget = defaultJvmTarget - javaHome = defaultJavaHome - // There are problems with common build dir: // - some tests (in particular js and binary-compatibility-validator depend on the fixed (default) location // - idea seems unable to exclude common buildDir from indexing // therefore it is disabled by default // buildDir = File(commonBuildDir, project.name) - - configureJvmProject(javaHome!!, jvmTarget!!) + project.configureJvmDefaultToolchain() + plugins.withId("java-base") { + project.configureShadowJarSubstitutionInCompileClasspath() + } val commonCompilerArgs = listOfNotNull( "-Xopt-in=kotlin.RequiresOptIn", @@ -581,11 +539,6 @@ allprojects { apply(from = "$rootDir/gradle/cacheRedirector.gradle.kts") afterEvaluate { - 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 fun FileCollection.printClassPath(role: String) = @@ -1105,66 +1058,6 @@ configure { } } -fun jdkPathOrNull(version: String): String? { - val jdkName = "JDK_${version.replace(".", "")}" - val jdkMajorVersion = JdkMajorVersion.valueOf(jdkName) - return configuredJdks.find { it.majorVersion == jdkMajorVersion }?.homeDir?.canonicalPath -} - -fun jdkPath(version: String, vararg replacementVersions: String): String { - return jdkPathOrNull(version) ?: run { - replacementVersions.asSequence().map { jdkPathOrNull(it) }.find { it != null } - } ?: jdkNotFoundConst -} - -fun Project.configureJvmProject(javaHome: String, javaVersion: String) { - val currentJavaHome = File(System.getProperty("java.home")!!).canonicalPath - val shouldFork = !currentJavaHome.startsWith(File(javaHome).canonicalPath) - - tasks.withType { - if (name != "compileJava9Java") { - sourceCompatibility = javaVersion - targetCompatibility = javaVersion - options.isFork = shouldFork - options.forkOptions.javaHome = file(javaHome) - options.compilerArgs.add("-proc:none") - options.encoding = "UTF-8" - } - } - - tasks.withType { - kotlinOptions.jdkHome = javaHome - kotlinOptions.jvmTarget = javaVersion - kotlinOptions.freeCompilerArgs += "-Xjvm-default=compatibility" - } - - tasks.withType { - executable = File(javaHome, "bin/java").canonicalPath - } - - plugins.withId("java-base") { - configureShadowJarSubstitutionInCompileClasspath() - } -} - -fun Project.configureShadowJarSubstitutionInCompileClasspath() { - val substitutionMap = mapOf(":kotlin-reflect" to ":kotlin-reflect-api") - - fun configureSubstitution(substitution: DependencySubstitution) { - val requestedProject = (substitution.requested as? ProjectComponentSelector)?.projectPath ?: return - val replacementProject = substitutionMap[requestedProject] ?: return - substitution.useTarget(project(replacementProject), "Non-default shadow jars should not be used in compile classpath") - } - - sourceSets.all { - for (configName in listOf(compileOnlyConfigurationName, compileClasspathConfigurationName)) { - configurations.getByName(configName).resolutionStrategy.dependencySubstitution { - all(::configureSubstitution) - } - } - } -} - tasks.register("findShadowJarsInClasspath") { doLast { fun Collection.printSorted(indent: String = " ") { diff --git a/buildSrc/src/main/kotlin/CacheableProguradTask.kt b/buildSrc/src/main/kotlin/CacheableProguradTask.kt index 744f83e8317..0c92276689d 100644 --- a/buildSrc/src/main/kotlin/CacheableProguradTask.kt +++ b/buildSrc/src/main/kotlin/CacheableProguradTask.kt @@ -4,32 +4,36 @@ */ import groovy.lang.Closure +import org.gradle.api.JavaVersion import org.gradle.api.file.FileCollection +import org.gradle.api.provider.Property +import org.gradle.api.provider.Provider import org.gradle.api.tasks.* -import org.gradle.internal.jvm.Jvm -import org.gradle.internal.jvm.inspection.JvmVersionDetector +import org.gradle.jvm.toolchain.JavaLauncher +import org.gradle.kotlin.dsl.property import proguard.ClassSpecification import java.io.File -import javax.inject.Inject - @CacheableTask -open class CacheableProguardTask @Inject constructor( - private val jvmVersionDetector: JvmVersionDetector -) : proguard.gradle.ProGuardTask() { +open class CacheableProguardTask : proguard.gradle.ProGuardTask() { - @Internal - var jdkHome: File? = null + @get:Internal + val javaLauncher: Property = project.objects.property() + + @get:Internal + val jdkHomePath: Provider = javaLauncher.map { it.metadata.installationPath.asFile } @get:Optional @get:Input - internal val jdkMajorVersion: String? - get() = jdkHome?.let { jvmVersionDetector.getJavaVersion(Jvm.forHome(jdkHome)) }?.majorVersion + internal val jdkMajorVersion: Provider = javaLauncher.map { + JavaVersion.toVersion(it.metadata.languageVersion.toString()) + } @CompileClasspath - override fun getLibraryJarFileCollection(): FileCollection = super.getLibraryJarFileCollection().filter { libraryFile -> - jdkHome?.let { !libraryFile.absoluteFile.startsWith(it.absoluteFile) } ?: true - } + override fun getLibraryJarFileCollection(): FileCollection = super.getLibraryJarFileCollection() + .filter { libraryFile -> + jdkHomePath.orNull?.let { !libraryFile.absoluteFile.startsWith(it.absoluteFile) } ?: true + } @InputFiles @PathSensitive(PathSensitivity.RELATIVE) diff --git a/buildSrc/src/main/kotlin/JvmToolchain.kt b/buildSrc/src/main/kotlin/JvmToolchain.kt new file mode 100644 index 00000000000..cb46d15d4bb --- /dev/null +++ b/buildSrc/src/main/kotlin/JvmToolchain.kt @@ -0,0 +1,86 @@ +@file:JvmName("JvmToolchain") +import org.gradle.api.Project +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.compile.JavaCompile +import org.gradle.jvm.toolchain.* +import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +enum class JdkMajorVersion( + val majorVersion: Int, + private val mandatory: Boolean = true +) { + JDK_1_6(6), + JDK_1_7(7), + JDK_1_8(8), + JDK_9(9), + JDK_10(10, false), + JDK_11(11, false), + JDK_15(15, false), + JDK_16(16, false); + + fun isMandatory(): Boolean = mandatory +} + +fun Project.configureJvmDefaultToolchain() { + configureJvmToolchain(JdkMajorVersion.JDK_1_8) +} + +fun Project.configureJvmToolchain( + jdkVersion: JdkMajorVersion +) { + plugins.withId("org.jetbrains.kotlin.jvm") { + val kotlinExtension = extensions.getByType() + + kotlinExtension.jvmToolchain { + (this as JavaToolchainSpec).languageVersion + .set(JavaLanguageVersion.of(jdkVersion.majorVersion)) + } + + tasks + .matching { it.name != "compileJava9Java" && it is JavaCompile } + .configureEach { + with(this as JavaCompile) { + options.compilerArgs.add("-proc:none") + options.encoding = "UTF-8" + } + } + + tasks.withType().configureEach { + kotlinOptions.freeCompilerArgs += "-Xjvm-default=compatibility" + } + } +} + +fun Project.updateJvmTarget( + jvmTarget: String +) { + tasks.withType().configureEach { + kotlinOptions.jvmTarget = jvmTarget + } + + tasks.withType().configureEach { + sourceCompatibility = jvmTarget + targetCompatibility = jvmTarget + } +} + +fun Project.getToolchainCompilerFor( + jdkVersion: JdkMajorVersion +): Provider { + val service = project.extensions.getByType() + return service.compilerFor { + this.languageVersion.set(JavaLanguageVersion.of(jdkVersion.majorVersion)) + } +} + +fun Project.getToolchainLauncherFor( + jdkVersion: JdkMajorVersion +): Provider { + val service = project.extensions.getByType() + return service.launcherFor { + this.languageVersion.set(JavaLanguageVersion.of(jdkVersion.majorVersion)) + } +} diff --git a/buildSrc/src/main/kotlin/LibrariesCommon.kt b/buildSrc/src/main/kotlin/LibrariesCommon.kt new file mode 100644 index 00000000000..eab78c61571 --- /dev/null +++ b/buildSrc/src/main/kotlin/LibrariesCommon.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:JvmName("LibrariesCommon") + +import org.gradle.api.JavaVersion +import org.gradle.api.Project +import org.gradle.api.file.FileCollection +import org.gradle.api.tasks.compile.JavaCompile +import org.gradle.kotlin.dsl.extra +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.provideDelegate +import org.gradle.kotlin.dsl.withType +import org.gradle.process.CommandLineArgumentProvider +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +@JvmOverloads +fun Project.configureJava9Compilation( + moduleName: String, + moduleOutputs: Collection = setOf(sourceSets["main"].output) +) { + configurations["java9CompileClasspath"].extendsFrom(configurations["compileClasspath"]) + + tasks.named("compileJava9Java", JavaCompile::class.java) { + dependsOn(moduleOutputs) + + javaCompiler.set(getToolchainCompilerFor(JdkMajorVersion.JDK_9)) + targetCompatibility = JavaVersion.VERSION_1_9.toString() + sourceCompatibility = JavaVersion.VERSION_1_9.toString() + + // module-info.java should be in java9 source set by convention + val java9SourceSet = sourceSets["java9"].java + destinationDir = file("${java9SourceSet.outputDir}/META-INF/versions/9") + options.sourcepath = files(java9SourceSet.srcDirs) + val compileClasspath = configurations["java9CompileClasspath"] + val moduleFiles = objects.fileCollection().from(moduleOutputs) + val modulePath = compileClasspath.filter { it !in moduleFiles.files } + classpath = objects.fileCollection().from() + options.compilerArgumentProviders.add( + Java9AdditionalArgumentsProvider( + moduleName, + moduleFiles, + modulePath + ) + ) + } +} + +private class Java9AdditionalArgumentsProvider( + private val moduleName: String, + private val moduleFiles: FileCollection, + private val modulePath: FileCollection +) : CommandLineArgumentProvider { + override fun asArguments(): Iterable = listOf( + "--module-path", modulePath.asPath, + "--patch-module", "$moduleName=${moduleFiles.asPath}", + "-Xlint:-requires-transitive-automatic" // suppress automatic module transitive dependencies in kotlin.test + ) +} + +fun Project.disableDeprecatedJvmTargetWarning() { + if (!kotlinBuildProperties.disableWerror) { + val tasksWithWarnings: List by rootProject.extra + tasks.withType().configureEach { + if (!tasksWithWarnings.contains(path)) { + kotlinOptions { + allWarningsAsErrors = true + freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" + } + } + } + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/dependencies.kt b/buildSrc/src/main/kotlin/dependencies.kt index e4720bc7ac5..2176e3aab25 100644 --- a/buildSrc/src/main/kotlin/dependencies.kt +++ b/buildSrc/src/main/kotlin/dependencies.kt @@ -13,6 +13,8 @@ import org.gradle.api.artifacts.* import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection +import org.gradle.internal.jvm.Jvm +import org.gradle.jvm.toolchain.JavaLanguageVersion import org.gradle.kotlin.dsl.accessors.runtime.addDependencyTo import org.gradle.kotlin.dsl.closureOf import org.gradle.kotlin.dsl.exclude @@ -287,14 +289,16 @@ fun Project.firstFromJavaHomeThatExists(vararg paths: String, jdkHome: File = Fi fun Project.toolsJarApi(): Any = if (kotlinBuildProperties.isInJpsBuildIdeaSync) - files(toolsJarFile() ?: error("tools.jar is not found!")) + toolsJar() else dependencies.project(":dependencies:tools-jar-api") -fun Project.toolsJar(): FileCollection = files(toolsJarFile() ?: error("tools.jar is not found!")) - -fun Project.toolsJarFile(jdkHome: File = File(this.property("JDK_18") as String)): File? = - firstFromJavaHomeThatExists("lib/tools.jar", jdkHome = jdkHome) +fun Project.toolsJar(): FileCollection = files( + getToolchainLauncherFor(JdkMajorVersion.JDK_1_8) + .map { + Jvm.forHome(it.metadata.installationPath.asFile).toolsJar ?: throw GradleException("tools.jar not found!") + } +) val compilerManifestClassPath get() = "annotations-13.0.jar kotlin-stdlib.jar kotlin-reflect.jar kotlin-script-runtime.jar trove4j.jar" diff --git a/buildSrc/src/main/kotlin/embeddable.kt b/buildSrc/src/main/kotlin/embeddable.kt index 648aeb25d45..aa5cb3e6211 100644 --- a/buildSrc/src/main/kotlin/embeddable.kt +++ b/buildSrc/src/main/kotlin/embeddable.kt @@ -2,6 +2,8 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.Project +import org.gradle.api.artifacts.DependencySubstitution +import org.gradle.api.artifacts.component.ProjectComponentSelector import org.gradle.api.file.DuplicatesStrategy import org.gradle.api.tasks.TaskProvider import org.gradle.jvm.tasks.Jar @@ -80,6 +82,24 @@ private fun Project.compilerShadowJar(taskName: String, body: ShadowJar.() -> Un } } +fun Project.configureShadowJarSubstitutionInCompileClasspath() { + val substitutionMap = mapOf(":kotlin-reflect" to ":kotlin-reflect-api") + + fun configureSubstitution(substitution: DependencySubstitution) { + val requestedProject = (substitution.requested as? ProjectComponentSelector)?.projectPath ?: return + val replacementProject = substitutionMap[requestedProject] ?: return + substitution.useTarget(project(replacementProject), "Non-default shadow jars should not be used in compile classpath") + } + + sourceSets.all { + for (configName in listOf(compileOnlyConfigurationName, compileClasspathConfigurationName)) { + configurations.getByName(configName).resolutionStrategy.dependencySubstitution { + all(::configureSubstitution) + } + } + } +} + fun Project.embeddableCompiler(taskName: String = "embeddable", body: ShadowJar.() -> Unit = {}): TaskProvider = compilerShadowJar(taskName) { configureEmbeddableCompilerRelocation() diff --git a/buildSrc/src/main/kotlin/jdksFinder.kt b/buildSrc/src/main/kotlin/jdksFinder.kt deleted file mode 100644 index 0cb386e66de..00000000000 --- a/buildSrc/src/main/kotlin/jdksFinder.kt +++ /dev/null @@ -1,198 +0,0 @@ -@file:Suppress("unused") // usages in build scripts are not tracked properly - -import net.rubygrapefruit.platform.Native -import net.rubygrapefruit.platform.WindowsRegistry -import org.gradle.api.GradleException -import org.gradle.api.Project -import java.nio.file.Paths -import java.io.File -import net.rubygrapefruit.platform.WindowsRegistry.Key.HKEY_LOCAL_MACHINE -import org.gradle.internal.os.OperatingSystem - -enum class JdkMajorVersion(private val mandatory: Boolean = true) { - JDK_16, JDK_17, JDK_18, JDK_9, JDK_10(false), JDK_11(false), /*15.0*/JDK_15(false); - - fun isMandatory(): Boolean = mandatory -} - -val jdkAlternativeVarNames = mapOf(JdkMajorVersion.JDK_9 to listOf("JDK_19"), JdkMajorVersion.JDK_15 to listOf("JDK_15_0")) - -data class JdkId(val explicit: Boolean, val majorVersion: JdkMajorVersion, var version: String, var homeDir: File) - -fun Project.getConfiguredJdks(): List { - val res = arrayListOf() - for (jdkMajorVersion in JdkMajorVersion.values()) { - val explicitJdkEnvVal = findProperty(jdkMajorVersion.name)?.toString() - ?: System.getenv(jdkMajorVersion.name) - ?: jdkAlternativeVarNames[jdkMajorVersion]?.mapNotNull { System.getenv(it) }?.firstOrNull() - ?: continue - val explicitJdk = Paths.get(explicitJdkEnvVal).toRealPath().toFile() - if (!explicitJdk.isDirectory) { - throw GradleException("Invalid environment value $jdkMajorVersion: $explicitJdkEnvVal, expecting JDK home path") - } - res.add(JdkId(true, jdkMajorVersion, "X", explicitJdk)) - } - if (res.size < JdkMajorVersion.values().size) { - res.discoverJdks(this) - } - return res -} - -// see JEP 223 -private val javaMajorVersionRegex = Regex("""(?:1\.)?(\d+).*""") -private val javaVersionRegex = Regex("""(?:1\.)?(\d+)(\.\d+)?([+-_]\w+){0,3}""") - -fun MutableCollection.addIfBetter(project: Project, version: String, id: String, homeDir: File): Boolean { - val matchString = javaMajorVersionRegex.matchEntire(version)?.groupValues?.get(1) - val majorJdkVersion = when (matchString) { - "6" -> JdkMajorVersion.JDK_16 - "7" -> JdkMajorVersion.JDK_17 - "8" -> JdkMajorVersion.JDK_18 - "9" -> JdkMajorVersion.JDK_9 - else -> { - project.logger.info("Cannot recognize version string '$version' (found version '$matchString')") - return false - } - } - val prev = find { it.majorVersion == majorJdkVersion } - if (prev == null) { - add(JdkId(false, majorJdkVersion, version, homeDir)) - return true - } - if (prev.explicit) return false - val versionsComparisonRes = compareVersions(prev.version, version) - if (versionsComparisonRes < 0 || (versionsComparisonRes == 0 && id.contains("64"))) { // prefer 64-bit - prev.version = version - prev.homeDir = homeDir - return true - } - return false -} - -private fun compareVersions(left: String, right: String): Int { - if (left == right) return 0 - fun MatchResult.extractNumVer(): List = - groups.drop(2).map { - it?.value?.filter { it in '0'..'9' }?.toIntOrNull() ?: 0 - } - val lmi = (javaVersionRegex.matchEntire(left)?.extractNumVer() ?: emptyList()).iterator() - val rmi = (javaVersionRegex.matchEntire(right)?.extractNumVer() ?: emptyList()).iterator() - while (lmi.hasNext() && rmi.hasNext()) { - val l = lmi.next() - val r = rmi.next() - when { - l < r -> return -1 - l > r -> return 1 - } - } - return when { - rmi.hasNext() -> -1 - lmi.hasNext() -> 1 - else -> 0 - } -} - -fun MutableCollection.discoverJdks(project: Project) { - val os = OperatingSystem.current() - when { - os.isWindows -> discoverJdksOnWindows(project) - os.isMacOsX -> discoverJdksOnMacOS(project) - else -> discoverJdksOnUnix(project) - } -} - -private val macOsJavaHomeOutRegexes = - listOf( - Regex("""\s+(\S+),\s+(\S+):\s+".*?"\s+(.+)"""), - Regex("""\s+(\S+)\s+\((.*?)\):\s+(.+)"""), - Regex("""\s+(\S+)\s+\((.*?)\)\s+"[^"]*"\s+-\s+"[^"]*"\s(.+)"""), - Regex("""\s+(\S+)\s+\((.+)\)\s+".+"\s+-\s+".+"\s+(.+)""")) - -fun MutableCollection.discoverJdksOnMacOS(project: Project) { - val procBuilder = ProcessBuilder("/usr/libexec/java_home", "-V").redirectErrorStream(true) - val process = procBuilder.start() - val retCode = process.waitFor() - if (retCode != 0) throw GradleException("Unable to run 'java_home', return code $retCode") - process.inputStream.bufferedReader().forEachLine { line -> - for (rex in macOsJavaHomeOutRegexes) { - val matchResult = rex.matchEntire(line) - if (matchResult != null) { - val jdkHomeDir = File(matchResult.groupValues[3]) - // Filter out JRE installed at /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/ - // and shown by the java_home tool - if (!jdkHomeDir.path.contains("JavaAppletPlugin.plugin")) { - addIfBetter(project, matchResult.groupValues[1], matchResult.groupValues[0], jdkHomeDir) - break - } - } - } - } -} - -private val unixConventionalJdkLocations = listOf( - "/usr/lib/jvm", // *deb, Arch - "/opt", // *rpm, Gentoo, HP/UX - "/usr/lib", // Slackware 32 - "/usr/lib64", // Slackware 64 - "/usr/local", // OpenBSD, FreeBSD - "/usr/pkg/java", // NetBSD - "/usr/jdk/instances") // Solaris - -private val unixConventionalJdkDirRex = Regex("jdk|jre|java|zulu") - -fun MutableCollection.discoverJdksOnUnix(project: Project) { - for (loc in unixConventionalJdkLocations) { - val installedJdks = File(loc).listFiles { dir -> - dir.isDirectory && - unixConventionalJdkDirRex.containsMatchIn(dir.name) && - fileFrom(dir, "bin", "java").isFile - } ?: continue - for (dir in installedJdks) { - val versionMatch = javaVersionRegex.find(dir.name) - if (versionMatch == null) { - project.logger.info("Unable to extract version from possible JDK dir: $dir") - } - else { - addIfBetter(project, versionMatch.value, dir.name, dir) - } - } - } -} - -private val windowsConventionalJdkRegistryPaths = listOf( - "SOFTWARE\\JavaSoft\\Java Development Kit", - "SOFTWARE\\Wow6432Node\\JavaSoft\\Java Development Kit", - "SOFTWARE\\JavaSoft\\JDK", - "SOFTWARE\\Wow6432Node\\JavaSoft\\JDK") - -fun MutableCollection.discoverJdksOnWindows(project: Project) { - val registry = Native.get(WindowsRegistry::class.java) - for (regPath in windowsConventionalJdkRegistryPaths) { - val jdkKeys = try { - registry.getSubkeys(HKEY_LOCAL_MACHINE, regPath) - } catch (e: RuntimeException) { - // ignore missing nodes - continue - } - for (jdkKey in jdkKeys) { - try { - val javaHome = registry.getStringValue(HKEY_LOCAL_MACHINE, regPath + "\\" + jdkKey, "JavaHome") - val versionMatch = javaVersionRegex.find(jdkKey) - if (versionMatch == null) { - project.logger.info("Unable to extract version from possible JDK location: $javaHome ($jdkKey)") - } - else { - javaHome.takeIf { it.isNotEmpty() } - ?.let { File(it) } - ?.takeIf { it.isDirectory && fileFrom(it, "bin", "java.exe").isFile } - ?.let { - addIfBetter(project, versionMatch.value, jdkKey, it) - } - } - } - catch (e: RuntimeException) { - // Ignore - } - } - } -} diff --git a/compiler/compiler.version/build.gradle.kts b/compiler/compiler.version/build.gradle.kts index 7ff0df88716..6e425286530 100644 --- a/compiler/compiler.version/build.gradle.kts +++ b/compiler/compiler.version/build.gradle.kts @@ -5,8 +5,13 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +// This module does not apply Kotlin plugin, so we are setting toolchain via +// java extension +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(6)) + } +} val kotlinVersion: String by rootProject.extra @@ -19,15 +24,10 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.named("processResources") { val kotlinVersionLocal = kotlinVersion inputs.property("compilerVersion", kotlinVersionLocal) filesMatching("META-INF/compiler.version") { filter("tokens" to mapOf("snapshot" to kotlinVersionLocal)) } -} \ No newline at end of file +} diff --git a/compiler/incremental-compilation-impl/build.gradle.kts b/compiler/incremental-compilation-impl/build.gradle.kts index 6f2090e8a1a..c95e68dbf6a 100644 --- a/compiler/incremental-compilation-impl/build.gradle.kts +++ b/compiler/incremental-compilation-impl/build.gradle.kts @@ -44,7 +44,7 @@ projectTest("testJvmICWithJdk11", parallel = true) { filter { includeTestsMatching("org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunnerTestGenerated*") } - executable = "${rootProject.extra["JDK_11"]}/bin/java" + javaLauncher.set(project.getToolchainLauncherFor(JdkMajorVersion.JDK_11)) } testsJar() diff --git a/compiler/tests-common-jvm6/build.gradle.kts b/compiler/tests-common-jvm6/build.gradle.kts index 40e91a9afd9..a003988f168 100644 --- a/compiler/tests-common-jvm6/build.gradle.kts +++ b/compiler/tests-common-jvm6/build.gradle.kts @@ -3,7 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" +project.updateJvmTarget("1.6") dependencies { compile(kotlinStdlib()) diff --git a/compiler/tests-different-jdk/build.gradle.kts b/compiler/tests-different-jdk/build.gradle.kts index 3fb84bb828a..863ce38abc9 100644 --- a/compiler/tests-different-jdk/build.gradle.kts +++ b/compiler/tests-different-jdk/build.gradle.kts @@ -1,5 +1,3 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile - plugins { kotlin("jvm") id("jps-compatible") @@ -28,40 +26,45 @@ sourceSets { } fun Project.codegenTest( - target: Int, jvm: Int, - jdk: String = "JDK_${if (jvm <= 8) "1" else ""}$jvm", - body: Test.() -> Unit -) { - codegenTest(target, jvm.toString(), jdk, body = body) -} - -fun Project.codegenTest( - target: Int, jvm: String, jdk: String, + target: Int, + jdk: JdkMajorVersion, + jvm: String = jdk.majorVersion.toString(), targetInTestClass: String = "$target", - body: Test.() -> Unit -): TaskProvider = projectTest("codegenTarget${targetInTestClass}Jvm${jvm}Test", jUnit5Enabled = true) { + body: Test.() -> Unit = {} +): TaskProvider = projectTest( + taskName = "codegenTarget${targetInTestClass}Jvm${jvm}Test", + jUnit5Enabled = true +) { dependsOn(":dist") workingDir = rootDir val testName = "JvmTarget${targetInTestClass}OnJvm${jvm}" filter.includeTestsMatching("org.jetbrains.kotlin.codegen.jdk.$testName") + javaLauncher.set(project.getToolchainLauncherFor(jdk)) + systemProperty("kotlin.test.default.jvm.target", "${if (target <= 8) "1." else ""}$target") body() doFirst { - val jdkPath = project.findProperty(jdk) ?: error("$jdk is not optional to run this test") - executable = "$jdkPath/bin/java" - println("Running tests with $target target and $executable") + logger.warn("Running tests with $target target and ${javaLauncher.get().metadata.installationPath.asFile}") } group = "verification" } -codegenTest(target = 6, jvm = 6, jdk = "JDK_18") { +codegenTest( + target = 6, + jdk = JdkMajorVersion.JDK_1_8, + jvm = JdkMajorVersion.JDK_1_6.majorVersion.toString() +) { dependsOn(testJvm6ServerRuntime) doFirst { systemProperty("kotlin.test.default.jvm.target", "1.6") systemProperty("kotlin.test.java.compilation.target", "1.6") + systemProperty( + "JDK_16", + project.getToolchainLauncherFor(JdkMajorVersion.JDK_1_6).get().metadata.installationPath.asFile.absolutePath + ) val port = project.findProperty("kotlin.compiler.codegen.tests.port") ?: "5100" systemProperty("kotlin.test.box.in.separate.process.port", port) @@ -70,37 +73,36 @@ codegenTest(target = 6, jvm = 6, jdk = "JDK_18") { } //JDK 8 -codegenTest(target = 6, jvm = 8) {} +codegenTest(target = 6, jdk = JdkMajorVersion.JDK_1_8) // This is default one and is executed in default build configuration -codegenTest(target = 8, jvm = 8) {} +codegenTest(target = 8, jdk = JdkMajorVersion.JDK_1_8) //JDK 11 -codegenTest(target = 6, jvm = 11) {} +codegenTest(target = 6, jdk = JdkMajorVersion.JDK_11) -codegenTest(target = 8, jvm = 11) {} +codegenTest(target = 8, jdk = JdkMajorVersion.JDK_11) -codegenTest(target = 11, jvm = 11) {} +codegenTest(target = 11, jdk = JdkMajorVersion.JDK_11) //JDK 15 -codegenTest(target = 6, jvm = 15) {} +codegenTest(target = 6, jdk = JdkMajorVersion.JDK_15) -codegenTest(target = 8, jvm = 15) {} +codegenTest(target = 8, jdk = JdkMajorVersion.JDK_15) -codegenTest(target = 15, jvm = 15) { +codegenTest(target = 15, jdk = JdkMajorVersion.JDK_15) { systemProperty("kotlin.test.box.d8.disable", true) } //..also add this two tasks to build after adding fresh jdks to build agents -val mostRecentJdk = JdkMajorVersion.values().last().name +val mostRecentJdk = JdkMajorVersion.values().last() //LAST JDK from JdkMajorVersion available on machine -codegenTest(target = 6, jvm = "Last", jdk = mostRecentJdk) {} - -codegenTest(target = 8, jvm = "Last", jdk = mostRecentJdk) {} +codegenTest(target = 6, jvm = "Last", jdk = mostRecentJdk) +codegenTest(target = 8, jvm = "Last", jdk = mostRecentJdk) codegenTest( - mostRecentJdk.substringAfter('_').toInt(), + target = mostRecentJdk.majorVersion, targetInTestClass = "Last", jvm = "Last", jdk = mostRecentJdk diff --git a/compiler/tests-different-jdk/tests/org/jetbrains/kotlin/codegen/jdk/SeparateJavaProcessHelper.kt b/compiler/tests-different-jdk/tests/org/jetbrains/kotlin/codegen/jdk/SeparateJavaProcessHelper.kt index 45b90628c7a..75c9d7efb3c 100644 --- a/compiler/tests-different-jdk/tests/org/jetbrains/kotlin/codegen/jdk/SeparateJavaProcessHelper.kt +++ b/compiler/tests-different-jdk/tests/org/jetbrains/kotlin/codegen/jdk/SeparateJavaProcessHelper.kt @@ -37,9 +37,11 @@ object SeparateJavaProcessHelper { private fun initJdkProcess() { println("Configuring JDK6 Test server...") - val jdkPath = System.getenv("JDK_16") ?: error("JDK_16 is not optional to run this test") + val jdkPath = System.getProperty("JDK_16") ?: error("JDK_16 is not optional to run this test") val executable = File(jdkPath, "bin/java").canonicalPath + assert(File(executable).exists()) { "Not a JDK path: $jdkPath"} + val main = "org.jetbrains.kotlin.test.clientserver.TestProcessServer" val classpath = System.getProperty("kotlin.test.box.in.separate.process.server.classpath") ?: System.getProperty("java.class.path") diff --git a/compiler/tests-java8/build.gradle.kts b/compiler/tests-java8/build.gradle.kts index 52a43201b33..622a96a6358 100644 --- a/compiler/tests-java8/build.gradle.kts +++ b/compiler/tests-java8/build.gradle.kts @@ -23,7 +23,6 @@ sourceSets { } projectTest(parallel = true) { - executable = "${rootProject.extra["JDK_18"]!!}/bin/java" dependsOn(":dist") workingDir = rootDir systemProperty("kotlin.test.script.classpath", testSourceSet.output.classesDirs.joinToString(File.pathSeparator)) diff --git a/core/compiler.common.jvm/build.gradle.kts b/core/compiler.common.jvm/build.gradle.kts index 9ecd82c2c7a..0457df91b5b 100644 --- a/core/compiler.common.jvm/build.gradle.kts +++ b/core/compiler.common.jvm/build.gradle.kts @@ -3,8 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { api(project(":core:compiler.common")) @@ -15,11 +14,6 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType().configureEach { kotlinOptions { freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" diff --git a/core/compiler.common/build.gradle.kts b/core/compiler.common/build.gradle.kts index da0fdabab0e..2655c6e7c86 100644 --- a/core/compiler.common/build.gradle.kts +++ b/core/compiler.common/build.gradle.kts @@ -3,8 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { compile(project(":core:util.runtime")) @@ -17,11 +16,6 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType().configureEach { kotlinOptions { freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" diff --git a/core/descriptors.jvm/build.gradle.kts b/core/descriptors.jvm/build.gradle.kts index bf39ff227ad..e5e9ea03f31 100644 --- a/core/descriptors.jvm/build.gradle.kts +++ b/core/descriptors.jvm/build.gradle.kts @@ -3,8 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { compile(project(":kotlin-annotations-jvm")) @@ -21,11 +20,6 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType().configureEach { kotlinOptions { freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" diff --git a/core/descriptors.runtime/build.gradle.kts b/core/descriptors.runtime/build.gradle.kts index 9e880a49b38..b21fe3f0fe8 100644 --- a/core/descriptors.runtime/build.gradle.kts +++ b/core/descriptors.runtime/build.gradle.kts @@ -1,10 +1,24 @@ -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.tasks.UsesKotlinJavaToolchain plugins { kotlin("jvm") id("jps-compatible") } +// Only compilation tasks should use JDK 1.6 +project.disableDeprecatedJvmTargetWarning() +tasks + .matching { it.name == "compileKotlin" && it is UsesKotlinJavaToolchain } + .configureEach { + (this as UsesKotlinJavaToolchain).kotlinJavaToolchain.toolchain.use(project.getToolchainLauncherFor(JdkMajorVersion.JDK_1_6)) + } + +tasks + .matching { it.name == "compileJava" && it is JavaCompile } + .configureEach { + (this as JavaCompile).javaCompiler.set(project.getToolchainCompilerFor(JdkMajorVersion.JDK_1_6)) + } + dependencies { compileOnly(project(":core:util.runtime")) compileOnly(project(":core:descriptors")) @@ -23,19 +37,6 @@ sourceSets { "test" { projectDefault() } } -val compileJava by tasks.getting(JavaCompile::class) { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - -val compileKotlin by tasks.getting(KotlinCompile::class) { - kotlinOptions { - jvmTarget = "1.6" - jdkHome = rootProject.extra["JDK_16"] as String - freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" - } -} - val generateTests by generator("org.jetbrains.kotlin.generators.tests.GenerateRuntimeDescriptorTestsKt") projectTest(parallel = true) { diff --git a/core/descriptors/build.gradle.kts b/core/descriptors/build.gradle.kts index a9a953dc60d..1c707e59684 100644 --- a/core/descriptors/build.gradle.kts +++ b/core/descriptors/build.gradle.kts @@ -3,8 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { compile(project(":core:compiler.common")) @@ -18,11 +17,6 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType().configureEach { kotlinOptions { freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" diff --git a/core/deserialization.common.jvm/build.gradle.kts b/core/deserialization.common.jvm/build.gradle.kts index 4c664eb2ffc..71418e3ffc3 100644 --- a/core/deserialization.common.jvm/build.gradle.kts +++ b/core/deserialization.common.jvm/build.gradle.kts @@ -3,8 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { api(project(":core:metadata.jvm")) @@ -17,11 +16,6 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType().configureEach { kotlinOptions { freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" diff --git a/core/deserialization.common/build.gradle.kts b/core/deserialization.common/build.gradle.kts index 2ca04c99d2c..0f1e8038e40 100644 --- a/core/deserialization.common/build.gradle.kts +++ b/core/deserialization.common/build.gradle.kts @@ -3,8 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { api(project(":core:compiler.common")) @@ -16,11 +15,6 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType().configureEach { kotlinOptions { freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" diff --git a/core/deserialization/build.gradle.kts b/core/deserialization/build.gradle.kts index be02b300b26..36042bac08a 100644 --- a/core/deserialization/build.gradle.kts +++ b/core/deserialization/build.gradle.kts @@ -3,8 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { compile(project(":core:metadata")) @@ -19,11 +18,6 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType().configureEach { kotlinOptions { freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" diff --git a/core/metadata.jvm/build.gradle.kts b/core/metadata.jvm/build.gradle.kts index 211acec8a6a..e8fd594ccf8 100644 --- a/core/metadata.jvm/build.gradle.kts +++ b/core/metadata.jvm/build.gradle.kts @@ -3,8 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { api(project(":core:metadata")) @@ -15,11 +14,6 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType().configureEach { kotlinOptions { freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" diff --git a/core/metadata/build.gradle.kts b/core/metadata/build.gradle.kts index b1d30dab9d2..4d261bf3f93 100644 --- a/core/metadata/build.gradle.kts +++ b/core/metadata/build.gradle.kts @@ -3,8 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { compile(protobufLite()) @@ -16,11 +15,6 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType().configureEach { kotlinOptions { freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" diff --git a/core/util.runtime/build.gradle.kts b/core/util.runtime/build.gradle.kts index 8e0116b50f6..e80b0d25d9b 100644 --- a/core/util.runtime/build.gradle.kts +++ b/core/util.runtime/build.gradle.kts @@ -3,8 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { compileOnly(kotlinStdlib()) @@ -15,11 +14,6 @@ sourceSets { "test" {} } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType().configureEach { kotlinOptions { freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" diff --git a/dependencies/tools-jar-api/build.gradle.kts b/dependencies/tools-jar-api/build.gradle.kts index c975a5e4250..d88b16a4573 100644 --- a/dependencies/tools-jar-api/build.gradle.kts +++ b/dependencies/tools-jar-api/build.gradle.kts @@ -5,6 +5,7 @@ import java.util.zip.ZipFile plugins { base + `java-base` } val runtimeElements by configurations.creating { @@ -15,10 +16,8 @@ val runtimeElements by configurations.creating { } } -val JDK_18: String by rootProject.extra - val toolsJarStubs by tasks.registering { - val toolsJarFile = toolsJarFile(jdkHome = File(JDK_18)) ?: error("Couldn't find tools.jar in $JDK_18") + val toolsJarFile = toolsJar().singleFile inputs.file(toolsJarFile) val outDir = buildDir.resolve(name) diff --git a/gradle.properties b/gradle.properties index 548e4a6f3a0..e0bfdf6463f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,7 @@ org.gradle.jvmargs=-Duser.country=US -Dkotlin.daemon.jvm.options=-Xmx2200m -Dfil org.gradle.parallel=true org.gradle.caching=true +org.gradle.java.installations.fromEnv=JDK_16,JDK_17,JDK_18,JDK_9,JDK_10,JDK_11,JDK_15 cacheRedirectorEnabled=true defaultSnapshotVersion=1.5.255-SNAPSHOT @@ -24,6 +25,9 @@ kotlin.build.publishing.attempts=20 ## The following properties can be added to your local.properties file to customize the build: +# Enable when https://youtrack.jetbrains.com/issue/KT-47520 will be fixed +kotlin.jvm.target.validation.mode=ignore + #jpsBuild=true #cidrPluginsEnabled=true #idea.fir.plugin=true diff --git a/libraries/commonConfiguration.gradle b/libraries/commonConfiguration.gradle index f17358a95ec..1a091687263 100644 --- a/libraries/commonConfiguration.gradle +++ b/libraries/commonConfiguration.gradle @@ -1,84 +1,5 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -ext.configureJavaOnlyJvm6Project = { Project project -> - project.tasks.withType(JavaCompile) { - sourceCompatibility = 1.6 - targetCompatibility = 1.6 - options.fork = true - options.forkOptions.javaHome = file(JDK_16) - } -} - -List tasksWithWarnings = (List) rootProject.ext.get("tasksWithWarnings") - -ext.configureJvm6Project = { Project project -> - project.configure(project) { - configurations { - sources - } - - project.ext.jvmTarget = "1.6" - project.ext.javaHome = JDK_16 - - task sourcesJar(type: Jar, dependsOn: classes) { - classifier = 'sources' - from sourceSets.main.kotlin - } - - configureJavaOnlyJvm6Project(project) - - tasks.withType(project.compileKotlin.class) { - kotlinOptions.jdkHome = JDK_16 - kotlinOptions.jvmTarget = "1.6" - } - - test { - executable = "$JDK_16/bin/java" - } - } - - if (!BuildPropertiesExtKt.getDisableWerror(project.kotlinBuildProperties)) { - project.tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinCompile.class) { task -> - if (!tasksWithWarnings.contains(task.path)) { - task.kotlinOptions { - allWarningsAsErrors = true - freeCompilerArgs += "-Xsuppress-deprecated-jvm-target-warning" - } - } - } - } -} - -ext.compileJava9Sources = { Project project, String moduleName, Collection moduleOutputs = [project.sourceSets.main.output] -> - // module-info.java should be in java9 source set by convention - SourceDirectorySet java9SourceSet = project.sourceSets.java9.java - project.configurations.java9CompileClasspath.extendsFrom(project.configurations.compileClasspath) - project.tasks.getByName("compileJava9Java").configure { JavaCompile it -> - dependsOn(moduleOutputs) - it.sourceCompatibility = 1.9 - it.targetCompatibility = 1.9 - it.destinationDir = file("${java9SourceSet.outputDir}/META-INF/versions/9") - it.options.fork = true - it.options.forkOptions.javaHome = file(JDK_9) - it.options.sourcepath = files(java9SourceSet.srcDirs) - def compileClasspath = project.configurations.java9CompileClasspath - def objects = project.objects - - doFirst { - def moduleFiles = objects.fileCollection().from(*moduleOutputs) - def modulePath = compileClasspath.filter { !(it in moduleFiles.files) } - - options.compilerArgs = [ - '--module-path', modulePath.asPath, - '--patch-module', "$moduleName=${moduleFiles.asPath}", - '-Xlint:-requires-transitive-automatic' // suppress automatic module transitive dependencies in kotlin.test - ] - - classpath = objects.fileCollection().from() - } - } -} - ext.manifestAttributes = { Manifest manifest, Project project, String component = null, boolean multiRelease = false -> project.configure(manifest) { attributes \ diff --git a/libraries/kotlin.test/annotations-common/build.gradle b/libraries/kotlin.test/annotations-common/build.gradle index 56e1dd87ed6..ed799821538 100644 --- a/libraries/kotlin.test/annotations-common/build.gradle +++ b/libraries/kotlin.test/annotations-common/build.gradle @@ -2,7 +2,7 @@ description = 'Kotlin Test Annotations Common' apply plugin: 'kotlin-platform-common' -jvmTarget = "1.6" +JvmToolchain.updateJvmTarget(project, "1.6") dependencies { compile kotlinStdlib("common") diff --git a/libraries/kotlin.test/common/build.gradle b/libraries/kotlin.test/common/build.gradle index fb64ba6973f..df6b94e1ef8 100644 --- a/libraries/kotlin.test/common/build.gradle +++ b/libraries/kotlin.test/common/build.gradle @@ -2,7 +2,7 @@ description = 'Kotlin Test Common' apply plugin: 'kotlin-platform-common' -jvmTarget = "1.6" +JvmToolchain.updateJvmTarget(project, "1.6") dependencies { compile kotlinStdlib("common") diff --git a/libraries/kotlin.test/junit/build.gradle b/libraries/kotlin.test/junit/build.gradle index 1fb0dc85c6e..81d834109fe 100644 --- a/libraries/kotlin.test/junit/build.gradle +++ b/libraries/kotlin.test/junit/build.gradle @@ -2,7 +2,8 @@ description = 'Kotlin Test JUnit' apply plugin: 'kotlin-platform-jvm' -configureJvm6Project(project) +JvmToolchain.configureJvmToolchain(project, JdkMajorVersion.JDK_1_6) +LibrariesCommon.disableDeprecatedJvmTargetWarning(project) def includeJava9 = BuildPropertiesExtKt.getIncludeJava9(project.kotlinBuildProperties) @@ -47,5 +48,5 @@ compileTestKotlin { configureJvmIrBackend(project) if (includeJava9) { - compileJava9Sources(project, 'kotlin.test.junit') + LibrariesCommon.configureJava9Compilation(project, 'kotlin.test.junit') } diff --git a/libraries/kotlin.test/junit5/build.gradle b/libraries/kotlin.test/junit5/build.gradle index 48d180522c4..4d0a35c4757 100644 --- a/libraries/kotlin.test/junit5/build.gradle +++ b/libraries/kotlin.test/junit5/build.gradle @@ -2,10 +2,6 @@ description = 'Kotlin Test JUnit 5' apply plugin: 'kotlin-platform-jvm' -configureJvm6Project(project) -ext.javaHome = JDK_18 -ext.jvmTarget = "1.8" - def includeJava9 = BuildPropertiesExtKt.getIncludeJava9(project.kotlinBuildProperties) sourceSets { @@ -34,11 +30,6 @@ jar { configureSourcesJar() configureJavadocJar() -tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) { - kotlinOptions.jdkHome = JDK_18 - kotlinOptions.jvmTarget = 1.8 -} - compileKotlin { kotlinOptions.freeCompilerArgs = [ "-Xallow-kotlin-package", @@ -57,10 +48,9 @@ compileTestKotlin { configureJvmIrBackend(project) if (includeJava9) { - compileJava9Sources(project, 'kotlin.test.junit5') + LibrariesCommon.configureJava9Compilation(project, 'kotlin.test.junit5') } test { useJUnitPlatform() - executable = "$JDK_18/bin/java" } diff --git a/libraries/kotlin.test/jvm/build.gradle b/libraries/kotlin.test/jvm/build.gradle index 4aecb1e7b80..72860140551 100644 --- a/libraries/kotlin.test/jvm/build.gradle +++ b/libraries/kotlin.test/jvm/build.gradle @@ -4,8 +4,8 @@ apply plugin: 'kotlin-platform-jvm' archivesBaseName = 'kotlin-test' -configureJvm6Project(project) - +JvmToolchain.configureJvmToolchain(project, JdkMajorVersion.JDK_1_6) +LibrariesCommon.disableDeprecatedJvmTargetWarning(project) def includeJava9 = BuildPropertiesExtKt.getIncludeJava9(project.kotlinBuildProperties) @@ -62,5 +62,5 @@ compileTestKotlin { configureJvmIrBackend(project) if (includeJava9) { - compileJava9Sources(project, 'kotlin.test') + LibrariesCommon.configureJava9Compilation(project, 'kotlin.test') } diff --git a/libraries/kotlin.test/testng/build.gradle b/libraries/kotlin.test/testng/build.gradle index dd96564e7d0..a19d5a233f0 100644 --- a/libraries/kotlin.test/testng/build.gradle +++ b/libraries/kotlin.test/testng/build.gradle @@ -2,8 +2,9 @@ description = 'Kotlin Test TestNG' apply plugin: 'kotlin-platform-jvm' -configureJvm6Project(project) -ext.javaHome = JDK_17 +JvmToolchain.configureJvmToolchain(project, JdkMajorVersion.JDK_1_7) +JvmToolchain.updateJvmTarget(project, "1.6") +LibrariesCommon.disableDeprecatedJvmTargetWarning(project) def includeJava9 = BuildPropertiesExtKt.getIncludeJava9(project.kotlinBuildProperties) @@ -50,7 +51,7 @@ compileTestKotlin { configureJvmIrBackend(project) if (includeJava9) { - compileJava9Sources(project, 'kotlin.test.testng') + LibrariesCommon.configureJava9Compilation(project, 'kotlin.test.testng') } test { diff --git a/libraries/kotlinx-metadata/build.gradle.kts b/libraries/kotlinx-metadata/build.gradle.kts index af06e142d6f..3867f1ceb7c 100644 --- a/libraries/kotlinx-metadata/build.gradle.kts +++ b/libraries/kotlinx-metadata/build.gradle.kts @@ -11,8 +11,7 @@ pill { variant = PillExtension.Variant.FULL } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) sourceSets { "main" { projectDefault() } diff --git a/libraries/kotlinx-metadata/jvm/build.gradle.kts b/libraries/kotlinx-metadata/jvm/build.gradle.kts index 547166aa428..c486c992f62 100644 --- a/libraries/kotlinx-metadata/jvm/build.gradle.kts +++ b/libraries/kotlinx-metadata/jvm/build.gradle.kts @@ -26,8 +26,7 @@ group = "org.jetbrains.kotlinx" val deployVersion = findProperty("kotlinxMetadataDeployVersion") as String? version = deployVersion ?: "0.1-SNAPSHOT" -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) sourceSets { "main" { projectDefault() } diff --git a/libraries/reflect/api/build.gradle b/libraries/reflect/api/build.gradle index 37b3d1dfd86..a6f1c7b7596 100644 --- a/libraries/reflect/api/build.gradle +++ b/libraries/reflect/api/build.gradle @@ -2,7 +2,8 @@ description = '' apply plugin: 'kotlin' -configureJvm6Project(project) +JvmToolchain.configureJvmToolchain(project, JdkMajorVersion.JDK_1_6) +LibrariesCommon.disableDeprecatedJvmTargetWarning(project) def includeJava9 = BuildPropertiesExtKt.getIncludeJava9(project.kotlinBuildProperties) @@ -32,8 +33,9 @@ dependencies { } if (includeJava9) { - compileJava9Sources( - project, 'kotlin.reflect', + LibrariesCommon.configureJava9Compilation( + project, + 'kotlin.reflect', [sourceSets.main.output, configurations.compileOnly.filter { !it.name.contains("kotlin-stdlib") }] diff --git a/libraries/reflect/build.gradle.kts b/libraries/reflect/build.gradle.kts index 1c9a6e3b7ee..16e0306b6f2 100644 --- a/libraries/reflect/build.gradle.kts +++ b/libraries/reflect/build.gradle.kts @@ -20,9 +20,11 @@ plugins { java } -val JDK_16: String by rootProject.extra - -callGroovy("configureJavaOnlyJvm6Project", project) +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(6)) + } +} publish() @@ -150,9 +152,19 @@ val proguard by task { injars(mapOf("filter" to "!META-INF/**,!**/*.kotlin_builtins"), proguardAdditionalInJars) outjars(proguardOutput) - jdkHome = File(JDK_16) + javaLauncher.set(project.getToolchainLauncherFor(JdkMajorVersion.JDK_1_6)) libraryjars(mapOf("filter" to "!META-INF/versions/**"), proguardDeps) - libraryjars(firstFromJavaHomeThatExists("jre/lib/rt.jar", "../Classes/classes.jar", jdkHome = jdkHome!!)) + libraryjars( + project.files( + javaLauncher.map { + firstFromJavaHomeThatExists( + "jre/lib/rt.jar", + "../Classes/classes.jar", + jdkHome = it.metadata.installationPath.asFile + ) + } + ) + ) configuration("$core/reflection.jvm/reflection.pro") } diff --git a/libraries/scripting/common/build.gradle.kts b/libraries/scripting/common/build.gradle.kts index 1b0adbdfd28..fa6af0f26c5 100644 --- a/libraries/scripting/common/build.gradle.kts +++ b/libraries/scripting/common/build.gradle.kts @@ -3,7 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" +project.updateJvmTarget("1.6") dependencies { compile(kotlinStdlib()) diff --git a/libraries/scripting/dependencies-maven/build.gradle.kts b/libraries/scripting/dependencies-maven/build.gradle.kts index e095d751c85..7378ddbb8bf 100644 --- a/libraries/scripting/dependencies-maven/build.gradle.kts +++ b/libraries/scripting/dependencies-maven/build.gradle.kts @@ -3,7 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" +project.updateJvmTarget("1.6") configurations.implementation { /** diff --git a/libraries/scripting/dependencies/build.gradle.kts b/libraries/scripting/dependencies/build.gradle.kts index a9f6d5b2c1f..82cfe467532 100644 --- a/libraries/scripting/dependencies/build.gradle.kts +++ b/libraries/scripting/dependencies/build.gradle.kts @@ -3,7 +3,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" +project.updateJvmTarget("1.6") dependencies { compile(kotlinStdlib()) diff --git a/libraries/scripting/intellij/build.gradle.kts b/libraries/scripting/intellij/build.gradle.kts index b25d6bc8596..cba252f6fa6 100644 --- a/libraries/scripting/intellij/build.gradle.kts +++ b/libraries/scripting/intellij/build.gradle.kts @@ -4,8 +4,6 @@ plugins { id("jps-compatible") } -jvmTarget = "1.8" - dependencies { compile(project(":kotlin-script-runtime")) compile(kotlinStdlib()) diff --git a/libraries/scripting/jvm/build.gradle.kts b/libraries/scripting/jvm/build.gradle.kts index 2da19f7fcd0..540ce40708e 100644 --- a/libraries/scripting/jvm/build.gradle.kts +++ b/libraries/scripting/jvm/build.gradle.kts @@ -3,9 +3,7 @@ plugins { id("jps-compatible") } -val JDK_16: String by project -jvmTarget = "1.6" -javaHome = JDK_16 +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) dependencies { compile(project(":kotlin-script-runtime")) @@ -26,10 +24,6 @@ tasks.withType> { ) } -tasks.withType { - executable = "$JDK_16/bin/java" -} - publish() runtimeJar() diff --git a/libraries/stdlib/common/build.gradle b/libraries/stdlib/common/build.gradle index 4a47b124125..9dd22af4c60 100644 --- a/libraries/stdlib/common/build.gradle +++ b/libraries/stdlib/common/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'kotlin-platform-common' configurePublishing(project) -jvmTarget = "1.6" +JvmToolchain.updateJvmTarget(project, "1.6") def commonSrcDir = "../src" def commonTestSrcDir = "../test" diff --git a/libraries/stdlib/jdk7/build.gradle b/libraries/stdlib/jdk7/build.gradle index a7774d0ed55..239f91b657c 100644 --- a/libraries/stdlib/jdk7/build.gradle +++ b/libraries/stdlib/jdk7/build.gradle @@ -2,13 +2,14 @@ description = 'Kotlin Standard Library JDK 7 extension' apply plugin: 'kotlin' -configureJvm6Project(project) +JvmToolchain.configureJvmToolchain(project, JdkMajorVersion.JDK_1_7) +JvmToolchain.updateJvmTarget(project, "1.6") +LibrariesCommon.disableDeprecatedJvmTargetWarning(project) + configurePublishing(project) configureSourcesJar() configureJavadocJar() -ext.javaHome = JDK_17 - sourceSets { main { kotlin { @@ -66,10 +67,6 @@ artifacts { archives modularJar } -tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) { - kotlinOptions.jdkHome = JDK_17 -} - compileKotlin { kotlinOptions.freeCompilerArgs = [ "-Xallow-kotlin-package", @@ -97,18 +94,12 @@ compileTestKotlin { configureJvmIrBackend(project) -compileJava9Sources(project, 'kotlin.stdlib.jdk7') - -test { - executable = "$JDK_17/bin/java" -} +LibrariesCommon.configureJava9Compilation(project, 'kotlin.stdlib.jdk7') task testJdk6Tests(type: Test) { dependsOn(':kotlin-stdlib:testClasses') group = "verification" - executable = "$JDK_17/bin/java" - doFirst { testClassesDirs = project(':kotlin-stdlib').sourceSets.test.output classpath = files( @@ -121,12 +112,9 @@ task testJdk6Tests(type: Test) { task testNoJdk7(type: Test, dependsOn: noJdk7TestClasses) { group = "verification" - executable = "$JDK_17/bin/java" - testClassesDirs = sourceSets.noJdk7Test.output.classesDirs classpath = sourceSets.noJdk7Test.runtimeClasspath } - check.dependsOn testJdk6Tests, testNoJdk7 diff --git a/libraries/stdlib/jdk8/build.gradle b/libraries/stdlib/jdk8/build.gradle index 0d8f659fe60..298019939ed 100644 --- a/libraries/stdlib/jdk8/build.gradle +++ b/libraries/stdlib/jdk8/build.gradle @@ -2,14 +2,10 @@ description = 'Kotlin Standard Library JDK 8 extension' apply plugin: 'kotlin' -configureJvm6Project(project) configurePublishing(project) configureSourcesJar() configureJavadocJar() -ext.javaHome = JDK_18 -ext.jvmTarget = "1.8" - dependencies { compile project(':kotlin-stdlib') compile project(':kotlin-stdlib-jdk7') @@ -59,11 +55,6 @@ artifacts { archives modularJar } -tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) { - kotlinOptions.jdkHome = JDK_18 - kotlinOptions.jvmTarget = 1.8 -} - compileKotlin { kotlinOptions.freeCompilerArgs = [ "-Xallow-kotlin-package", @@ -87,19 +78,13 @@ compileTestKotlin { configureJvmIrBackend(project) -compileJava9Sources(project, 'kotlin.stdlib.jdk8') - -test { - executable = "$JDK_18/bin/java" -} +LibrariesCommon.configureJava9Compilation(project, 'kotlin.stdlib.jdk8') task testJdk6Tests(type: Test) { thisTask -> dependsOn(':kotlin-stdlib:testClasses') check.dependsOn(thisTask) group = "verification" - executable = "$JDK_18/bin/java" - doFirst { testClassesDirs = project(':kotlin-stdlib').sourceSets.test.output classpath = files( @@ -109,13 +94,12 @@ task testJdk6Tests(type: Test) { thisTask -> } } - -[9, 10, 11].forEach { v -> - task(type: Test, "jdk${v}Test") { thisTask -> +[JdkMajorVersion.JDK_9, JdkMajorVersion.JDK_10, JdkMajorVersion.JDK_11].forEach { jvmVersion -> + tasks.register("jdk${jvmVersion.majorVersion}Test", Test) { thisTask -> check.dependsOn(thisTask) group = "verification" - executable = "${project.property("JDK_$v")}/bin/java" - if (v > 9) - enabled(file(executable).parentFile.isDirectory()) + thisTask.javaLauncher.set( + JvmToolchain.getToolchainLauncherFor(project, jvmVersion) + ) } } diff --git a/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts b/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts index ad059d24e9c..304216229c0 100644 --- a/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts +++ b/libraries/stdlib/jvm-minimal-for-test/build.gradle.kts @@ -7,8 +7,7 @@ plugins { `maven-publish` } -jvmTarget = "1.6" -javaHome = rootProject.extra["JDK_16"] as String +project.configureJvmToolchain(JdkMajorVersion.JDK_1_6) val builtins by configurations.creating { isCanBeResolved = true @@ -54,11 +53,6 @@ val copySources by task { into(File(buildDir, "src")) } -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} - tasks.withType { dependsOn(copySources) kotlinOptions { diff --git a/libraries/stdlib/jvm/build.gradle b/libraries/stdlib/jvm/build.gradle index 67f05c2259d..01b046e0d59 100644 --- a/libraries/stdlib/jvm/build.gradle +++ b/libraries/stdlib/jvm/build.gradle @@ -4,7 +4,9 @@ apply plugin: 'kotlin-platform-jvm' archivesBaseName = 'kotlin-stdlib' -configureJvm6Project(project) +JvmToolchain.configureJvmToolchain(project, JdkMajorVersion.JDK_1_6) +LibrariesCommon.disableDeprecatedJvmTargetWarning(project) + configurePublishing(project) configureJavadocJar() configureSourcesJar() @@ -38,6 +40,8 @@ sourceSets { } } +LibrariesCommon.configureJava9Compilation(project, 'kotlin.stdlib', [sourceSets.main.output]) + configurations { commonSources longRunningTestCompile.extendsFrom(testCompile) @@ -127,9 +131,6 @@ compileKotlin { } } - -compileJava9Sources(project, 'kotlin.stdlib', [sourceSets.main.output]) - compileTestKotlin { kotlinOptions { freeCompilerArgs += [ diff --git a/libraries/stdlib/samples/build.gradle b/libraries/stdlib/samples/build.gradle index 050c8601400..efb49908bc8 100644 --- a/libraries/stdlib/samples/build.gradle +++ b/libraries/stdlib/samples/build.gradle @@ -11,7 +11,6 @@ sourceSets { compileTestKotlin { kotlinOptions { - jdkHome = JDK_18 freeCompilerArgs = [ "-Xopt-in=kotlin.ExperimentalStdlibApi", "-Xopt-in=kotlin.ExperimentalUnsignedTypes", @@ -19,7 +18,3 @@ compileTestKotlin { ] } } - -test { - executable = "$JDK_18/bin/java" -} diff --git a/libraries/tools/kotlin-allopen/build.gradle b/libraries/tools/kotlin-allopen/build.gradle index 01a707301c2..e349505f387 100644 --- a/libraries/tools/kotlin-allopen/build.gradle +++ b/libraries/tools/kotlin-allopen/build.gradle @@ -54,5 +54,3 @@ pluginBundle { } configurePluginMarkers(project) - -test.executable = "${JDK_18}/bin/java" diff --git a/libraries/tools/kotlin-annotations-jvm/build.gradle b/libraries/tools/kotlin-annotations-jvm/build.gradle index 42e2c3bdfed..14c55d0da77 100644 --- a/libraries/tools/kotlin-annotations-jvm/build.gradle +++ b/libraries/tools/kotlin-annotations-jvm/build.gradle @@ -2,7 +2,9 @@ description = 'Kotlin annotations for JVM' apply plugin: 'kotlin' -configureJvm6Project(project) +JvmToolchain.configureJvmToolchain(project, JdkMajorVersion.JDK_1_6) +LibrariesCommon.disableDeprecatedJvmTargetWarning(project) + configurePublishing(project) sourceSets { @@ -20,11 +22,6 @@ dependencies { configureSourcesJar() configureJavadocJar() -tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) { - kotlinOptions.jdkHome = JDK_16 - kotlinOptions.jvmTarget = 1.6 -} - compileKotlin { kotlinOptions.freeCompilerArgs = [ "-Xallow-kotlin-package", diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts index a9f2610501b..2a184c2df74 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts @@ -1,5 +1,4 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.pill.PillExtension plugins { @@ -198,11 +197,6 @@ tasks.named("check") { } } -tasks.withType { - kotlinOptions.jdkHome = rootProject.extra["JDK_18"] as String - kotlinOptions.jvmTarget = "1.8" -} - tasks.withType { val noTestProperty = project.providers.gradleProperty("noTest") onlyIf { !noTestProperty.isPresent } @@ -210,17 +204,22 @@ tasks.withType { dependsOn(":kotlin-gradle-plugin:validatePlugins") dependsOnKotlinGradlePluginInstall() - executable = "${rootProject.extra["JDK_18"]!!}/bin/java" - systemProperty("kotlinVersion", rootProject.extra["kotlinVersion"] as String) systemProperty("runnerGradleVersion", gradle.gradleVersion) - systemProperty("jdk9Home", rootProject.extra["JDK_9"] as String) - systemProperty("jdk10Home", rootProject.extra["JDK_10"] as String) - systemProperty("jdk11Home", rootProject.extra["JDK_11"] as String) + val jdk9Provider = project.getToolchainLauncherFor(JdkMajorVersion.JDK_9).map { it.metadata.installationPath.asFile.absolutePath } + val jdk10Provider = project.getToolchainLauncherFor(JdkMajorVersion.JDK_10).map { it.metadata.installationPath.asFile.absolutePath } + val jdk11Provider = project.getToolchainLauncherFor(JdkMajorVersion.JDK_11).map { it.metadata.installationPath.asFile.absolutePath } val mavenLocalRepo = project.providers.systemProperty("maven.repo.local").forUseAtConfigurationTime().orNull - if (mavenLocalRepo != null) { - systemProperty("maven.repo.local", mavenLocalRepo) + + // Query required JDKs paths only on execution phase to avoid triggering auto-download on project configuration phase + doFirst { + systemProperty("jdk9Home", jdk9Provider.get()) + systemProperty("jdk10Home", jdk10Provider.get()) + systemProperty("jdk11Home", jdk11Provider.get()) + if (mavenLocalRepo != null) { + systemProperty("maven.repo.local", mavenLocalRepo) + } } useAndroidSdk() diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt index b0174c6c6ca..c4b67c5e423 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinJavaToolchainTest.kt @@ -595,8 +595,8 @@ class KotlinJavaToolchainTest : KGPBaseTest() { ) = assertOutputContains("[KOTLIN] Kotlin compilation 'jdkHome' argument: $javaexecPath") private fun getUserJdk(): JavaInfo = Jvm.forHome(File(System.getenv("JAVA_HOME"))) - private fun getJdk9(): JavaInfo = Jvm.forHome(File(System.getenv("JDK_9"))) - private fun getJdk11(): JavaInfo = Jvm.forHome(File(System.getenv("JDK_11"))) + private fun getJdk9(): JavaInfo = Jvm.forHome(File(System.getProperty("jdk9Home"))) + private fun getJdk11(): JavaInfo = Jvm.forHome(File(System.getProperty("jdk11Home"))) // replace required for windows paths so Groovy will not complain about unexpected char '\' private fun getJdk9Path(): String = getJdk9().javaHome.absolutePath.replace("\\", "\\\\") private fun getJdk11Path(): String = getJdk11().javaHome.absolutePath.replace("\\", "\\\\") diff --git a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts index 35128da0b96..1149ee609cc 100644 --- a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts @@ -145,7 +145,6 @@ tasks { } projectTest { - executable = "${rootProject.extra["JDK_18"]!!}/bin/java" dependsOn(tasks.named("validatePlugins")) workingDir = rootDir diff --git a/libraries/tools/kotlin-main-kts/build.gradle.kts b/libraries/tools/kotlin-main-kts/build.gradle.kts index 21c949e3ead..df32e85ffc2 100644 --- a/libraries/tools/kotlin-main-kts/build.gradle.kts +++ b/libraries/tools/kotlin-main-kts/build.gradle.kts @@ -1,5 +1,5 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import proguard.gradle.ProGuardTask +import org.gradle.internal.jvm.Jvm description = "Kotlin \"main\" script definition" @@ -8,7 +8,6 @@ plugins { id("jps-compatible") } -val JDK_18: String by rootProject.extra val jarBaseName = property("archivesBaseName") as String val localPackagesToRelocate = @@ -88,13 +87,28 @@ val proguard by task { outjars(fileFrom(buildDir, "libs", "$jarBaseName-$version-after-proguard.jar")) - jdkHome = File(JDK_18) + javaLauncher.set(project.getToolchainLauncherFor(JdkMajorVersion.JDK_1_8)) + libraryjars(mapOf("filter" to "!META-INF/versions/**"), proguardLibraryJars) libraryjars( files( - firstFromJavaHomeThatExists("jre/lib/rt.jar", "../Classes/classes.jar", jdkHome = jdkHome!!), - firstFromJavaHomeThatExists("jre/lib/jsse.jar", "../Classes/jsse.jar", jdkHome = jdkHome!!), - toolsJarFile(jdkHome = jdkHome!!) + javaLauncher.map { + firstFromJavaHomeThatExists( + "jre/lib/rt.jar", + "../Classes/classes.jar", + jdkHome = it.metadata.installationPath.asFile + ) + }, + javaLauncher.map { + firstFromJavaHomeThatExists( + "jre/lib/jsse.jar", + "../Classes/jsse.jar", + jdkHome = it.metadata.installationPath.asFile + ) + }, + javaLauncher.map { + Jvm.forHome(it.metadata.installationPath.asFile).toolsJar + } ) ) } diff --git a/libraries/tools/kotlin-noarg/build.gradle b/libraries/tools/kotlin-noarg/build.gradle index f60460e14e3..bea9432d85a 100644 --- a/libraries/tools/kotlin-noarg/build.gradle +++ b/libraries/tools/kotlin-noarg/build.gradle @@ -3,12 +3,6 @@ apply plugin: 'jps-compatible' configureGradlePluginPublishing(project) -compileJava { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - options.fork = false -} - pill { variant = 'FULL' } @@ -60,5 +54,3 @@ pluginBundle { } configurePluginMarkers(project) - -test.executable = "${JDK_18}/bin/java" diff --git a/libraries/tools/kotlin-sam-with-receiver/build.gradle b/libraries/tools/kotlin-sam-with-receiver/build.gradle index a3a6b1bfab3..374294949e4 100644 --- a/libraries/tools/kotlin-sam-with-receiver/build.gradle +++ b/libraries/tools/kotlin-sam-with-receiver/build.gradle @@ -3,12 +3,6 @@ apply plugin: 'jps-compatible' configurePublishing(project) -compileJava { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - options.fork = false -} - pill { variant = 'FULL' } @@ -45,5 +39,3 @@ ArtifactsKt.noDefaultJar(project) ArtifactsKt.runtimeJar(project, EmbeddableKt.rewriteDefaultJarDepsToShadedCompiler(project, {}), {}) configureSourcesJar() configureJavadocJar() - -test.executable = "${JDK_18}/bin/java" diff --git a/libraries/tools/kotlin-serialization-unshaded/build.gradle b/libraries/tools/kotlin-serialization-unshaded/build.gradle index cec31ae6461..fc6c5478d59 100644 --- a/libraries/tools/kotlin-serialization-unshaded/build.gradle +++ b/libraries/tools/kotlin-serialization-unshaded/build.gradle @@ -6,12 +6,6 @@ dependencies { embedded(project(":kotlinx-serialization-compiler-plugin")) { transitive = false } } -compileJava { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - options.fork = false -} - TaskProvider jar = tasks.named("jar") jar.configure { manifestAttributes(manifest, project) diff --git a/libraries/tools/kotlin-serialization/build.gradle b/libraries/tools/kotlin-serialization/build.gradle index 3f880e1b3e4..9c9f88fc36a 100644 --- a/libraries/tools/kotlin-serialization/build.gradle +++ b/libraries/tools/kotlin-serialization/build.gradle @@ -7,12 +7,6 @@ pill { variant = 'FULL' } -compileJava { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - options.fork = false -} - dependencies { compileOnly project(':kotlin-gradle-plugin') compile project(':kotlin-gradle-plugin-api') diff --git a/libraries/tools/mutability-annotations-compat/build.gradle.kts b/libraries/tools/mutability-annotations-compat/build.gradle.kts index 333e6186fca..deb86330a72 100644 --- a/libraries/tools/mutability-annotations-compat/build.gradle.kts +++ b/libraries/tools/mutability-annotations-compat/build.gradle.kts @@ -5,12 +5,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" - -tasks.withType { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" -} +project.updateJvmTarget("1.6") sourceSets { "main" { projectDefault() } diff --git a/libraries/tools/script-runtime/build.gradle b/libraries/tools/script-runtime/build.gradle index d2989069696..7c4cc88bac6 100644 --- a/libraries/tools/script-runtime/build.gradle +++ b/libraries/tools/script-runtime/build.gradle @@ -2,7 +2,9 @@ description 'Kotlin Script Runtime' apply plugin: 'kotlin' -configureJvm6Project(project) +JvmToolchain.configureJvmToolchain(project, JdkMajorVersion.JDK_1_6) +LibrariesCommon.disableDeprecatedJvmTargetWarning(project) + configurePublishing(project) dependencies { diff --git a/plugins/android-extensions/android-extensions-runtime/build.gradle.kts b/plugins/android-extensions/android-extensions-runtime/build.gradle.kts index 3e144b350d1..420eda91837 100644 --- a/plugins/android-extensions/android-extensions-runtime/build.gradle.kts +++ b/plugins/android-extensions/android-extensions-runtime/build.gradle.kts @@ -5,7 +5,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" +project.updateJvmTarget("1.6") dependencies { compile(kotlinStdlib()) diff --git a/plugins/kapt3/kapt3-runtime/build.gradle.kts b/plugins/kapt3/kapt3-runtime/build.gradle.kts index 6ee8ab12434..65470b4fbb8 100644 --- a/plugins/kapt3/kapt3-runtime/build.gradle.kts +++ b/plugins/kapt3/kapt3-runtime/build.gradle.kts @@ -9,7 +9,7 @@ dependencies { compile(kotlinStdlib()) } -jvmTarget = "1.6" +project.updateJvmTarget("1.6") sourceSets { "main" { projectDefault() } diff --git a/plugins/parcelize/parcelize-runtime/build.gradle.kts b/plugins/parcelize/parcelize-runtime/build.gradle.kts index ac00368bef9..eddc393d217 100644 --- a/plugins/parcelize/parcelize-runtime/build.gradle.kts +++ b/plugins/parcelize/parcelize-runtime/build.gradle.kts @@ -5,7 +5,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.6" +project.updateJvmTarget("1.6") dependencies { compile(kotlinStdlib()) diff --git a/plugins/scripting/scripting-ide-services-test/build.gradle.kts b/plugins/scripting/scripting-ide-services-test/build.gradle.kts index b238295d180..668f39bd7a6 100644 --- a/plugins/scripting/scripting-ide-services-test/build.gradle.kts +++ b/plugins/scripting/scripting-ide-services-test/build.gradle.kts @@ -3,7 +3,7 @@ plugins { kotlin("jvm") } -jvmTarget = "1.8" +project.updateJvmTarget("1.8") val allTestsRuntime by configurations.creating val testCompile by configurations diff --git a/plugins/scripting/scripting-ide-services/build.gradle.kts b/plugins/scripting/scripting-ide-services/build.gradle.kts index 312519a5a6a..9e722c59398 100644 --- a/plugins/scripting/scripting-ide-services/build.gradle.kts +++ b/plugins/scripting/scripting-ide-services/build.gradle.kts @@ -6,7 +6,7 @@ plugins { id("jps-compatible") } -jvmTarget = "1.8" +project.updateJvmTarget("1.8") publish() diff --git a/prepare/compiler/build.gradle.kts b/prepare/compiler/build.gradle.kts index a3530a648c8..760f75cd361 100644 --- a/prepare/compiler/build.gradle.kts +++ b/prepare/compiler/build.gradle.kts @@ -1,5 +1,6 @@ @file:Suppress("HasPlatformType") +import org.gradle.internal.jvm.Jvm import java.util.regex.Pattern.quote description = "Kotlin Compiler" @@ -265,7 +266,7 @@ val packCompiler by task { val proguard by task { dependsOn(packCompiler) - jdkHome = File(JDK_18) + javaLauncher.set(project.getToolchainLauncherFor(JdkMajorVersion.JDK_1_8)) configuration("$projectDir/compiler.pro") @@ -291,9 +292,23 @@ val proguard by task { libraryjars(mapOf("filter" to "!META-INF/versions/**"), proguardLibraries) libraryjars( files( - firstFromJavaHomeThatExists("jre/lib/rt.jar", "../Classes/classes.jar", jdkHome = jdkHome!!), - firstFromJavaHomeThatExists("jre/lib/jsse.jar", "../Classes/jsse.jar", jdkHome = jdkHome!!), - toolsJarFile(jdkHome = jdkHome!!) + javaLauncher.map { + firstFromJavaHomeThatExists( + "jre/lib/rt.jar", + "../Classes/classes.jar", + jdkHome = it.metadata.installationPath.asFile + ) + }, + javaLauncher.map { + firstFromJavaHomeThatExists( + "jre/lib/jsse.jar", + "../Classes/jsse.jar", + jdkHome = it.metadata.installationPath.asFile + ) + }, + javaLauncher.map { + Jvm.forHome(it.metadata.installationPath.asFile).toolsJar + } ) )