[Gradle] Also configure JsIrLink tasks with target compiler options

This should synchronize options between JS compile and link tasks
configured with target compiler options DSL.

^KT-61253 Fixed
This commit is contained in:
Yahor Berdnikau
2023-09-01 12:59:54 +02:00
committed by Space Team
parent 38e7bf6afa
commit f866883871
5 changed files with 76 additions and 22 deletions
@@ -8,8 +8,11 @@ package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.Project
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptionsHelper
import org.jetbrains.kotlin.gradle.targets.js.ir.JsIrBinary
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
import org.jetbrains.kotlin.gradle.tasks.configuration.Kotlin2JsCompileConfig
@@ -50,6 +53,17 @@ internal class KotlinJsIrSourceSetProcessor(
it.libraries.from(project.filesProvider { compilation.runtimeDependencyFiles })
}
configAction.configureTask { task ->
val targetCompilerOptions = (compilation.target as KotlinJsIrTarget).compilerOptions
KotlinJsCompilerOptionsHelper.syncOptionsAsConvention(
targetCompilerOptions,
task.compilerOptions
)
// Restoring already configured module name
task.compilerOptions.moduleName.convention(
project.provider { compilation.npmProject.name }
)
task.modeProperty.set(binary.mode)
task.dependsOn(kotlinTask)
}
@@ -399,11 +399,7 @@ constructor(
override val compilerOptions: KotlinJsCompilerOptions = project.objects
.newInstance<KotlinJsCompilerOptionsDefault>()
.apply {
configureJsDefaultOptions()
if (platformType == KotlinPlatformType.wasm) {
freeCompilerArgs.add(WASM_BACKEND)
}
configureJsDefaultOptions(platformType)
freeCompilerArgs.add(DISABLE_PRE_IR)
}
@@ -85,21 +85,6 @@ open class KotlinJsIrTargetConfigurator :
}
}
override fun configureCompilations(target: KotlinJsIrTarget) {
super.configureCompilations(target)
target.compilations.all { compilation ->
compilation.binaries
.withType(JsIrBinary::class.java)
.all { binary ->
binary.linkTask.configure { linkTask ->
linkTask.compilerOptions.configureJsDefaultOptions()
}
}
}
}
override fun defineConfigurationsForTarget(target: KotlinJsIrTarget) {
super.defineConfigurationsForTarget(target)
@@ -118,10 +103,16 @@ open class KotlinJsIrTargetConfigurator :
}
internal companion object {
internal fun KotlinJsCompilerOptions.configureJsDefaultOptions() {
internal fun KotlinJsCompilerOptions.configureJsDefaultOptions(
platformType: KotlinPlatformType
) {
moduleKind.set(JsModuleKind.MODULE_UMD)
sourceMap.set(true)
sourceMapEmbedSources.set(JsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_NEVER)
if (platformType == KotlinPlatformType.wasm) {
freeCompilerArgs.add(WASM_BACKEND)
}
}
}
}
@@ -9,6 +9,10 @@ import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner
import org.jetbrains.kotlin.gradle.incremental.IncrementalModuleInfoBuildService
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
import org.jetbrains.kotlin.gradle.plugin.tcs
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType
import org.jetbrains.kotlin.gradle.targets.js.internal.LibraryFilterCachingService
import org.jetbrains.kotlin.gradle.targets.js.ir.*
@@ -37,7 +41,16 @@ internal open class BaseKotlin2JsCompileConfig<TASK : Kotlin2JsCompile>(
configureAdditionalFreeCompilerArguments(task, compilation)
task.moduleName.set(task.compilerOptions.moduleName)
val compilationTarget = compilation.tcs.compilation.target
if (compilationTarget is KotlinJsTarget ||
(compilationTarget is KotlinWithJavaTarget<*, *> && compilationTarget.platformType == KotlinPlatformType.js)
) {
// JS v1 which does not configure module name via target compiler options
task.compilerOptions.moduleName.convention(compilation.moduleName)
task.moduleName.set(providers.provider { compilation.moduleName })
} else {
task.moduleName.set(task.compilerOptions.moduleName)
}
@Suppress("DEPRECATION")
task.outputFileProperty.value(
@@ -371,6 +371,46 @@ class ProjectCompilerOptionsTests {
)
}
@Test
fun testJsLinkTaskAreAlsoConfiguredWithOptionsFromDSL() {
val project = buildProjectWithMPP()
project.runLifecycleAwareTest {
with(multiplatformExtension) {
js {
nodejs()
binaries.library()
compilerOptions {
moduleName.set("my-custom-module")
languageVersion.set(KotlinVersion.KOTLIN_1_8)
apiVersion.set(KotlinVersion.KOTLIN_1_8)
moduleKind.set(JsModuleKind.MODULE_PLAIN)
freeCompilerArgs.addAll("-Xstrict-implicit-export-types", "-Xexplicit-api=warning")
}
}
}
}
val jsTasks = listOf(
project.kotlinJsTask("compileKotlinJs"),
project.kotlinJsTask("compileDevelopmentLibraryKotlinJs"),
project.kotlinJsTask("compileProductionLibraryKotlinJs")
)
jsTasks.forEach { jsTask ->
if (jsTask.name == "compileKotlinJs") {
// JS IR has different module name from 'compileKotlinJs'
assertEquals("my-custom-module", jsTask.compilerOptions.moduleName.orNull)
}
assertEquals(KotlinVersion.KOTLIN_1_8, jsTask.compilerOptions.languageVersion.orNull)
assertEquals(KotlinVersion.KOTLIN_1_8, jsTask.compilerOptions.apiVersion.orNull)
assertEquals(JsModuleKind.MODULE_PLAIN, jsTask.compilerOptions.moduleKind.orNull)
assertTrue(
jsTask.compilerOptions.freeCompilerArgs.get().containsAll(
listOf("-Xstrict-implicit-export-types", "-Xexplicit-api=warning")
)
)
}
}
private fun Project.kotlinNativeTask(name: String): KotlinCompilationTask<KotlinNativeCompilerOptions> = tasks
.named<KotlinCompilationTask<KotlinNativeCompilerOptions>>(name)
.get()