diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt index ea3760a8506..97f4355763e 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt @@ -25,9 +25,7 @@ import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.presetName import org.junit.Assume import org.junit.Ignore -import org.junit.Rule import org.junit.Test -import org.junit.rules.ErrorCollector import java.io.File import java.nio.file.Files import java.util.* @@ -1179,6 +1177,29 @@ class GeneralNativeIT : BaseGradleIT() { } } + // KT-54439 + @Test + fun testLanguageSettingsSyncToNativeTasks() = with(transformNativeTestProjectWithPluginDsl("native-kotlin-options")) { + gradleBuildScript().modify { + """ + |${it.substringBefore("kotlin {")} + | + |kotlin { + | ${HostManager.host.presetName}("host") { + | compilations.named("main").configure { + | kotlinOptions.freeCompilerArgs += ["-Xverbose-phases=Linker"] + | } + | } + |} + """.trimMargin() + } + + build("assemble") { + assertSuccessful() + assertContains("-Xverbose-phases=Linker") + } + } + companion object { fun List.containsSequentially(vararg elements: String): Boolean { check(elements.isNotEmpty()) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index 7a847827780..683a9a1a4ba 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -11,10 +11,12 @@ import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions +import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationWithResources import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinNativeCompilationData import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinNativeFragmentMetadataCompilationData +import org.jetbrains.kotlin.gradle.targets.native.NativeCompilerOptions import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.konan.target.KonanTarget @@ -77,6 +79,9 @@ abstract class KotlinNativeCompilation @Inject constructor( override val target: KotlinNativeTarget get() = super.target as KotlinNativeTarget + override val compilerOptions: NativeCompilerOptions + get() = super.compilerOptions as NativeCompilerOptions + // Interop DSL. val cinterops = project.container(DefaultCInteropSettings::class.java) { cinteropName -> project.objects.newInstance(DefaultCInteropSettings::class.java, cinteropName, this) 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 140dcaa5707..85499d6e0e4 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 @@ -324,6 +324,11 @@ open class KotlinNativeTargetConfigurator : AbstractKotl project.syncLanguageSettingsToLinkTask(binary) } } + project.runOnceAfterEvaluated("Sync native compilation language settings to compiler options") { + target.compilations.all { compilation -> + compilation.compilerOptions.syncLanguageSettings() + } + } target.binaries.withType(Executable::class.java).all { project.createRunTask(it) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerOptions.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerOptions.kt index 6302c25f941..e2654716c5c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerOptions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeCompilerOptions.kt @@ -9,20 +9,20 @@ import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptionsDefault import org.jetbrains.kotlin.gradle.plugin.HasCompilerOptions -import org.jetbrains.kotlin.gradle.plugin.runOnceAfterEvaluated import org.jetbrains.kotlin.gradle.plugin.sources.applyLanguageSettingsToCompilerOptions import org.jetbrains.kotlin.project.model.LanguageSettings -internal class NativeCompilerOptions( +class NativeCompilerOptions( project: Project, - nativeLanguageSettings: LanguageSettings + private val nativeLanguageSettings: LanguageSettings ) : HasCompilerOptions { override val options: KotlinCommonCompilerOptions = project.objects .newInstance(KotlinCommonCompilerOptionsDefault::class.java) .apply { useK2.finalizeValue() - project.runOnceAfterEvaluated("apply Kotlin native properties from language settings") { - applyLanguageSettingsToCompilerOptions(nativeLanguageSettings, this) - } } + + fun syncLanguageSettings() { + applyLanguageSettingsToCompilerOptions(nativeLanguageSettings, options) + } }