[Gradle, Wasm] Fix compileSync input for production binary

^KT-66228 fixed
^KT-66159 fixed
This commit is contained in:
Ilya Goncharov
2024-03-05 10:27:43 +00:00
committed by Space Team
parent 77b3f415a5
commit 0ce7bdc837
2 changed files with 27 additions and 26 deletions
@@ -10,10 +10,12 @@ import org.gradle.api.file.Directory
import org.gradle.api.file.RegularFile
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.TaskProvider
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptionsHelper
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.fileExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.isMain
import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType
import org.jetbrains.kotlin.gradle.targets.js.binaryen.BinaryenExec
import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution
@@ -23,6 +25,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.subtargets.createDefaultDistribution
import org.jetbrains.kotlin.gradle.targets.js.typescript.TypeScriptValidationTask
import org.jetbrains.kotlin.gradle.tasks.configuration.KotlinJsIrLinkConfig
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.filesProvider
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
@@ -60,11 +63,7 @@ sealed class JsIrBinary(
project.registerTask<DefaultIncrementalSyncTask>(
linkSyncTaskName
) { task ->
task.from.from(
linkTask.flatMap { linkTask ->
linkTask.destinationDirectory
}
)
syncInputConfigure(task)
task.from.from(project.tasks.named(compilation.processResourcesTaskName))
@@ -72,6 +71,14 @@ sealed class JsIrBinary(
}
}
protected open fun syncInputConfigure(syncTask: DefaultIncrementalSyncTask) {
syncTask.from.from(
linkTask.flatMap { linkTask ->
linkTask.destinationDirectory
}
)
}
// Wasi target doesn't have sync task
// need to extract wasm related binaries
val linkSyncTask: TaskProvider<DefaultIncrementalSyncTask>
@@ -187,6 +194,15 @@ open class ExecutableWasm(
name,
mode
) {
override fun syncInputConfigure(syncTask: DefaultIncrementalSyncTask) {
if (compilation.isMain() && mode == KotlinJsBinaryMode.PRODUCTION) {
syncTask.from.from(optimizeTask.flatMap { it.outputFileProperty.map { it.asFile.parentFile } })
syncTask.dependsOn(optimizeTask)
} else {
super.syncInputConfigure(syncTask)
}
}
val optimizeTaskName: String = optimizeTaskName()
val optimizeTask: TaskProvider<BinaryenExec> = BinaryenExec.create(compilation, optimizeTaskName) {
@@ -227,6 +243,12 @@ open class ExecutableWasm(
}
}
}
}.also { binaryenExec ->
if (compilation.isMain() && mode == KotlinJsBinaryMode.PRODUCTION) {
if (target.wasmTargetType == KotlinWasmTargetType.WASI) {
project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).dependsOn(binaryenExec)
}
}
}
private fun optimizeTaskName(): String =
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.gradle.testing.internal.configureConventions
import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.whenEvaluated
import org.jetbrains.kotlin.gradle.utils.withType
abstract class KotlinJsIrSubTarget(
val target: KotlinJsIrTarget,
@@ -59,11 +58,6 @@ abstract class KotlinJsIrSubTarget(
val npmProject = it.npmProject
@Suppress("DEPRECATION")
it.compilerOptions.options.freeCompilerArgs.add("$PER_MODULE_OUTPUT_NAME=${npmProject.name}")
it.binaries
.withType<ExecutableWasm>()
.configureEach { binary ->
configureBinaryen(binary)
}
}
}
@@ -229,21 +223,6 @@ abstract class KotlinJsIrSubTarget(
}
}
private fun configureBinaryen(binary: ExecutableWasm) {
val binaryenExec = binary.optimizeTask
if (binary.compilation.isMain() && binary.mode == KotlinJsBinaryMode.PRODUCTION) {
if (target.wasmTargetType == KotlinWasmTargetType.WASI) {
project.tasks.named(LifecycleBasePlugin.ASSEMBLE_TASK_NAME).dependsOn(binaryenExec)
} else {
binary.linkSyncTask.configure {
it.from.setFrom(binaryenExec.flatMap { it.outputFileProperty.map { it.asFile.parentFile } })
it.dependsOn(binaryenExec)
}
}
}
}
internal inline fun <reified T : Task> registerSubTargetTask(
name: String,
args: List<Any> = emptyList(),