diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/KotlinNativeLinkIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/KotlinNativeLinkIT.kt new file mode 100644 index 00000000000..a716b52272c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/KotlinNativeLinkIT.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2022 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. + */ + +package org.jetbrains.kotlin.gradle.native + +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.testbase.* +import org.junit.jupiter.api.DisplayName + +@DisplayName("KotlinNativeLink task tests") +@NativeGradlePluginTests +internal class KotlinNativeLinkIT : KGPBaseTest() { + + @DisplayName("KT-54113: afterEvaluate to sync languageSettings should run out of configuration methods scope") + @GradleTest + fun shouldSyncLanguageSettingsSafely(gradleVersion: GradleVersion) { + nativeProject("native-link-simple", gradleVersion) { + build("tasks") + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-link-simple/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-link-simple/build.gradle new file mode 100644 index 00000000000..3dc58cf8d70 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-link-simple/build.gradle @@ -0,0 +1,16 @@ +plugins { + id 'org.jetbrains.kotlin.multiplatform' +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + ("host") + + targets.named("host").configure { + binaries.test("integrationTests") + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-link-simple/src/hostMain/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-link-simple/src/hostMain/kotlin/main.kt new file mode 100644 index 00000000000..f6e36b84c3e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-link-simple/src/hostMain/kotlin/main.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2022 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. + */ + +fun main() { + println("Hello, Kotlin/Native!") +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index 141bcb96865..fcd61892058 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -73,18 +73,6 @@ open class KotlinNativeTargetConfigurator : AbstractKotl ) } - runOnceAfterEvaluated("Sync language settings for NativeLinkTask") { - result.configure { - // We propagate compilation free args to the link task for now (see KT-33717). - val defaultLanguageSettings = binary.compilation.languageSettings as? DefaultLanguageSettingsBuilder - if (defaultLanguageSettings != null) { - it.toolOptions.freeCompilerArgs.addAll( - defaultLanguageSettings.freeCompilerArgs - ) - } - } - } - if (binary !is TestExecutable) { tasks.named(binary.compilation.target.artifactsTaskName).dependsOn(result) @@ -96,6 +84,18 @@ open class KotlinNativeTargetConfigurator : AbstractKotl } } + private fun Project.syncLanguageSettingsToLinkTask(binary: NativeBinary) { + tasks.named(binary.linkTaskName, KotlinNativeLink::class.java).configure { + // We propagate compilation free args to the link task for now (see KT-33717). + val defaultLanguageSettings = binary.compilation.languageSettings as? DefaultLanguageSettingsBuilder + if (defaultLanguageSettings != null) { + it.toolOptions.freeCompilerArgs.addAll( + defaultLanguageSettings.freeCompilerArgs + ) + } + } + } + private fun Project.createFrameworkArtifact( binary: Framework, linkTask: TaskProvider @@ -317,6 +317,11 @@ open class KotlinNativeTargetConfigurator : AbstractKotl target.binaries.all { project.createLinkTask(it) } + project.runOnceAfterEvaluated("Sync language settings for NativeLinkTask") { + target.binaries.all { binary -> + project.syncLanguageSettingsToLinkTask(binary) + } + } target.binaries.withType(Executable::class.java).all { project.createRunTask(it)