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 dce36153c8b..a2ed5a645b1 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 @@ -14,6 +14,7 @@ import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.testbase.* import org.junit.jupiter.api.DisplayName import java.io.File +import kotlin.io.path.appendText @JvmGradlePluginTests @DisplayName("Kotlin Java Toolchain support") @@ -659,6 +660,37 @@ class KotlinJavaToolchainTest : KGPBaseTest() { } } + @DisplayName("KT-55004: Should use non-default toolchain for parent project") + @GradleTest + internal fun toolchainFromParentProject(gradleVersion: GradleVersion) { + project( + projectName = "multiproject".fullProjectName, + gradleVersion = gradleVersion, + buildOptions = defaultBuildOptions.copy(logLevel = LogLevel.DEBUG) + ) { + //language=Groovy + buildGradle.appendText( + """ + | + |allprojects { + | tasks.withType(org.jetbrains.kotlin.gradle.tasks.UsesKotlinJavaToolchain.class) + | .configureEach { + | kotlinJavaToolchain.jdk.use( + | "${getJdk11Path()}", + | JavaVersion.VERSION_11 + | ) + | } + |} + """.trimMargin() + ) + + build(":lib:compileKotlin") { + assertOutputDoesNotContain("-jvm-target 1.8") + assertOutputContains("-jvm-target 11") + } + } + } + private fun BuildResult.assertJdkHomeIsUsingJdk( javaexecPath: String ) = assertOutputContains("[KOTLIN] Kotlin compilation 'jdkHome' argument: $javaexecPath") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/build.gradle new file mode 100644 index 00000000000..8b1059c1404 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/build.gradle @@ -0,0 +1,3 @@ +plugins { + id "org.jetbrains.kotlin.jvm" apply false +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/lib/build.gradle new file mode 100644 index 00000000000..e45c8e727de --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/lib/build.gradle @@ -0,0 +1,8 @@ +plugins { + id("org.jetbrains.kotlin.jvm") +} + +repositories { + mavenLocal() + mavenCentral() +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/lib/src/main/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/lib/src/main/kotlin/main.kt new file mode 100644 index 00000000000..63592fd783d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/lib/src/main/kotlin/main.kt @@ -0,0 +1,3 @@ +fun main() { + println("I know what you've done last summer...") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/settings.gradle new file mode 100644 index 00000000000..ea3dc068931 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-java-toolchain/multiproject/settings.gradle @@ -0,0 +1 @@ +include ":lib" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/ToolchainDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/ToolchainDsl.kt index defafd4f544..47f75336df5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/ToolchainDsl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/ToolchainDsl.kt @@ -13,6 +13,7 @@ import org.gradle.api.plugins.PluginContainer import org.gradle.api.tasks.TaskContainer import org.gradle.jvm.toolchain.JavaToolchainService import org.gradle.jvm.toolchain.JavaToolchainSpec +import org.jetbrains.kotlin.gradle.tasks.DefaultKotlinJavaToolchain import org.jetbrains.kotlin.gradle.tasks.UsesKotlinJavaToolchain import org.jetbrains.kotlin.gradle.tasks.withType import org.jetbrains.kotlin.gradle.utils.newInstance @@ -62,7 +63,8 @@ internal abstract class DefaultToolchainSupport @Inject constructor( tasks .withType() .configureEach { - it.kotlinJavaToolchain.toolchain.use(javaLauncher) + (it.kotlinJavaToolchain.toolchain as DefaultKotlinJavaToolchain.DefaultJavaToolchainSetter) + .useAsConvention(javaLauncher) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt index a2f01aab1eb..f11620fc6d9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/DefaultKotlinJavaToolchain.kt @@ -164,22 +164,29 @@ internal abstract class DefaultKotlinJavaToolchain @Inject constructor( } } - private class DefaultJavaToolchainSetter( + internal class DefaultJavaToolchainSetter( private val providedJvm: Property ) : KotlinJavaToolchain.JavaToolchainSetter { + + internal fun useAsConvention( + javaLauncher: Provider + ) { + providedJvm.convention(javaLauncher.map(::mapToJvm)) + } + override fun use( javaLauncher: Provider ) { - providedJvm.set( - javaLauncher.map { launcher -> - val metadata = launcher.metadata - val javaVersion = JavaVersion.toVersion(metadata.languageVersion.asInt()) - Jvm.discovered( - metadata.installationPath.asFile, - null, - javaVersion - ) - } + providedJvm.set(javaLauncher.map(::mapToJvm)) + } + + private fun mapToJvm(javaLauncher: JavaLauncher): Jvm { + val metadata = javaLauncher.metadata + val javaVersion = JavaVersion.toVersion(metadata.languageVersion.asInt()) + return Jvm.discovered( + metadata.installationPath.asFile, + null, + javaVersion ) } }