[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.file.RegularFile
import org.gradle.api.provider.Provider import org.gradle.api.provider.Provider
import org.gradle.api.tasks.TaskProvider 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.dsl.KotlinJsCompilerOptionsHelper
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.fileExtension 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.KotlinWasmTargetType
import org.jetbrains.kotlin.gradle.targets.js.binaryen.BinaryenExec import org.jetbrains.kotlin.gradle.targets.js.binaryen.BinaryenExec
import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution 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.subtargets.createDefaultDistribution
import org.jetbrains.kotlin.gradle.targets.js.typescript.TypeScriptValidationTask import org.jetbrains.kotlin.gradle.targets.js.typescript.TypeScriptValidationTask
import org.jetbrains.kotlin.gradle.tasks.configuration.KotlinJsIrLinkConfig 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.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.filesProvider import org.jetbrains.kotlin.gradle.utils.filesProvider
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
@@ -60,11 +63,7 @@ sealed class JsIrBinary(
project.registerTask<DefaultIncrementalSyncTask>( project.registerTask<DefaultIncrementalSyncTask>(
linkSyncTaskName linkSyncTaskName
) { task -> ) { task ->
task.from.from( syncInputConfigure(task)
linkTask.flatMap { linkTask ->
linkTask.destinationDirectory
}
)
task.from.from(project.tasks.named(compilation.processResourcesTaskName)) 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 // Wasi target doesn't have sync task
// need to extract wasm related binaries // need to extract wasm related binaries
val linkSyncTask: TaskProvider<DefaultIncrementalSyncTask> val linkSyncTask: TaskProvider<DefaultIncrementalSyncTask>
@@ -187,6 +194,15 @@ open class ExecutableWasm(
name, name,
mode 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 optimizeTaskName: String = optimizeTaskName()
val optimizeTask: TaskProvider<BinaryenExec> = BinaryenExec.create(compilation, 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 = 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.testing.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.whenEvaluated import org.jetbrains.kotlin.gradle.utils.whenEvaluated
import org.jetbrains.kotlin.gradle.utils.withType
abstract class KotlinJsIrSubTarget( abstract class KotlinJsIrSubTarget(
val target: KotlinJsIrTarget, val target: KotlinJsIrTarget,
@@ -59,11 +58,6 @@ abstract class KotlinJsIrSubTarget(
val npmProject = it.npmProject val npmProject = it.npmProject
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
it.compilerOptions.options.freeCompilerArgs.add("$PER_MODULE_OUTPUT_NAME=${npmProject.name}") 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( internal inline fun <reified T : Task> registerSubTargetTask(
name: String, name: String,
args: List<Any> = emptyList(), args: List<Any> = emptyList(),