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
This commit is contained in:
Yahor Berdnikau
2022-10-14 12:15:31 +02:00
committed by Space Team
parent 901ebcc043
commit a32b2c4a3f
4 changed files with 39 additions and 8 deletions
@@ -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<String>.containsSequentially(vararg elements: String): Boolean {
check(elements.isNotEmpty())
@@ -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)
@@ -324,6 +324,11 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : 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)
@@ -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<KotlinCommonCompilerOptions> {
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)
}
}