From a32b2c4a3f87cae94aaf00543ebcf7872103c3a5 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Fri, 14 Oct 2022 12:15:31 +0200 Subject: [PATCH] Fix wrong context of LanguageSettings to compiler options sync Add Native target configuration to always iterate on all native target compilations in afterEvaluate and trigger sync of compilation LanguageSettings to compiler options. This way afterEvaluate will be called in the correct context. ^KT-54439 Fixed --- .../kotlin/gradle/native/GeneralNativeIT.kt | 25 +++++++++++++++++-- .../targets/native/KotlinNativeCompilation.kt | 5 ++++ .../native/KotlinNativeTargetConfigurator.kt | 5 ++++ .../targets/native/NativeCompilerOptions.kt | 12 ++++----- 4 files changed, 39 insertions(+), 8 deletions(-) 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) + } }