From 177177ee8c7b93afe72a72c81346fedb7fb5e2fd Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Fri, 10 Jun 2022 15:39:50 +0200 Subject: [PATCH] [WASM] Implement gradle plugin run tasks for wasm --- .../kotlin/gradle/targets/js/d8/D8Exec.kt | 4 +++ .../kotlin/gradle/targets/js/ir/KotlinD8Ir.kt | 19 ++++++++++++++ .../targets/js/ir/KotlinJsIrSubTargetBase.kt | 25 ++----------------- .../gradle/targets/js/ir/KotlinNodeJsIr.kt | 19 ++++++++++++++ .../gradle/targets/js/nodejs/NodeJsExec.kt | 9 ++++--- .../gradle/targets/js/npm/NpmProject.kt | 2 +- .../gradle/targets/js/testing/KotlinWasmD8.kt | 16 ++++++------ .../targets/js/testing/KotlinWasmNode.kt | 4 +-- .../kotlin/gradle/targets/js/utils.kt | 5 ++++ 9 files changed, 66 insertions(+), 37 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/d8/D8Exec.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/d8/D8Exec.kt index f6614021fc7..e163048d4e2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/d8/D8Exec.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/d8/D8Exec.kt @@ -9,6 +9,7 @@ import org.gradle.api.file.RegularFileProperty import org.gradle.api.tasks.* import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.utils.newFileProperty import javax.inject.Inject @@ -74,6 +75,9 @@ constructor( it.executable = d8.requireConfigured().executablePath.absolutePath it.dependsOn(d8.setupTaskProvider) it.dependsOn(compilation.compileKotlinTaskProvider) + if (compilation.platformType == KotlinPlatformType.wasm) { + it.d8Args.addWasmExperimentalArguments() + } it.configuration() } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinD8Ir.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinD8Ir.kt index 11ea69c6c5b..d8c7293a135 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinD8Ir.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinD8Ir.kt @@ -10,6 +10,8 @@ import org.jetbrains.kotlin.gradle.targets.js.d8.D8RootPlugin import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinWasmD8Dsl import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinWasmD8 +import org.jetbrains.kotlin.gradle.tasks.dependsOn +import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.tasks.withType import javax.inject.Inject @@ -26,6 +28,23 @@ open class KotlinD8Ir @Inject constructor(target: KotlinJsIrTarget) : project.tasks.withType().named(runTaskName).configure(body) } + override fun locateOrRegisterRunTask(binary: JsIrBinary, name: String) { + if (project.locateTask(name) != null) return + + val runTaskHolder = D8Exec.create(binary.compilation, name) { + group = taskGroupName + inputFileProperty.set( + project.layout.file( + binary.linkSyncTask.map { + it.destinationDir + .resolve(binary.linkTask.get().outputFileProperty.get().name) + } + ) + ) + } + target.runTask.dependsOn(runTaskHolder) + } + override fun configureDefaultTestFramework(test: KotlinJsTest) { test.testFramework = KotlinWasmD8(test) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTargetBase.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTargetBase.kt index 659e76b0685..39eb420cf7e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTargetBase.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrSubTargetBase.kt @@ -7,9 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.ir import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode -import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec import org.jetbrains.kotlin.gradle.tasks.dependsOn -import org.jetbrains.kotlin.gradle.tasks.locateTask abstract class KotlinJsIrSubTargetBase(target: KotlinJsIrTarget, classifier: String) : KotlinJsIrSubTarget(target, classifier) { @@ -30,6 +28,7 @@ abstract class KotlinJsIrSubTargetBase(target: KotlinJsIrTarget, classifier: Str binary.mode.name.toLowerCase(), RUN_TASK_NAME ) + locateOrRegisterRunTask(binary, binaryRunName) if (binary.mode == KotlinJsBinaryMode.DEVELOPMENT) { @@ -38,27 +37,7 @@ abstract class KotlinJsIrSubTargetBase(target: KotlinJsIrTarget, classifier: Str } } - private fun locateOrRegisterRunTask( - binary: JsIrBinary, - name: String - ) { - val runTask = project.locateTask(name) - if (runTask == null) { - val runTaskHolder = NodeJsExec.create(binary.compilation, name) { - group = taskGroupName - inputFileProperty.set( - project.layout.file( - binary.linkSyncTask.map { - it.destinationDir - .resolve(binary.linkTask.get().outputFileProperty.get().name) - } - ) - ) - } - - target.runTask.dependsOn(runTaskHolder) - } - } + protected abstract fun locateOrRegisterRunTask(binary: JsIrBinary, name: String) override fun configureBuild(compilation: KotlinJsIrCompilation) { compilation.binaries diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt index 8f26ca2c6f8..6fa5fe70a00 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinNodeJsIr.kt @@ -11,6 +11,8 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinWasmNode +import org.jetbrains.kotlin.gradle.tasks.dependsOn +import org.jetbrains.kotlin.gradle.tasks.locateTask import org.jetbrains.kotlin.gradle.tasks.withType import javax.inject.Inject @@ -27,6 +29,23 @@ open class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) : project.tasks.withType().named(runTaskName).configure(body) } + override fun locateOrRegisterRunTask(binary: JsIrBinary, name: String) { + if (project.locateTask(name) != null) return + + val runTaskHolder = NodeJsExec.create(binary.compilation, name) { + group = taskGroupName + inputFileProperty.set( + project.layout.file( + binary.linkSyncTask.map { + it.destinationDir + .resolve(binary.linkTask.get().outputFileProperty.get().name) + } + ) + ) + } + target.runTask.dependsOn(runTaskHolder) + } + override fun configureTestDependencies(test: KotlinJsTest) { test.dependsOn(nodeJs.npmInstallTaskProvider, nodeJs.nodeJsSetupTaskProvider) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExec.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExec.kt index af8da8e9641..305a4f74fde 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExec.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExec.kt @@ -7,8 +7,10 @@ package org.jetbrains.kotlin.gradle.targets.js.nodejs import org.gradle.api.file.RegularFileProperty import org.gradle.api.tasks.* +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency +import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.tasks.registerTask @@ -99,9 +101,10 @@ constructor( it.executable = nodeJs.requireConfigured().nodeExecutable it.workingDir = npmProject.dir it.dependsOn(nodeJs.npmInstallTaskProvider) - - it.dependsOn(nodeJs.npmInstallTaskProvider, compilation.compileKotlinTaskProvider) - + it.dependsOn(compilation.compileKotlinTaskProvider) + if (compilation.platformType == KotlinPlatformType.wasm) { + it.nodeArgs.addWasmExperimentalArguments() + } it.configuration() } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt index 081c6f64a74..44f9fbd1408 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt @@ -68,7 +68,7 @@ open class NpmProject(@Transient val compilation: KotlinJsCompilation) : Seriali get() = dir.resolve(DIST_FOLDER) val main: String - get() = "$DIST_FOLDER/$name$extension" + get() = "$DIST_FOLDER${File.separator}$name$extension" val externalsDirRoot by lazy { project.buildDir.resolve("externals").resolve(name) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt index 452c086491f..0f019d74d3c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmD8.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSetti import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency +import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments import org.jetbrains.kotlin.gradle.targets.js.d8.D8RootPlugin import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm import org.jetbrains.kotlin.gradle.targets.js.isTeamCity @@ -57,14 +58,13 @@ internal class KotlinWasmD8(private val kotlinJsTest: KotlinJsTest) : KotlinJsTe exclude = task.excludePatterns ) - val args = mutableListOf( - "--experimental-wasm-gc", - "--experimental-wasm-eh", - testRunnerFile.absolutePath, - ) - - args.add("--") - args.addAll(cliArgs.toList()) + val args = mutableListOf() + with(args) { + addWasmExperimentalArguments() + add(testRunnerFile.absolutePath) + add("--") + addAll(cliArgs.toList()) + } return TCServiceMessagesTestExecutionSpec( forkOptions = forkOptions, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt index 4bd1038d483..97e1e526d50 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinWasmNode.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSetti import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency +import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm import org.jetbrains.kotlin.gradle.targets.js.isTeamCity import org.jetbrains.kotlin.gradle.targets.js.writeWasmUnitTestRunner @@ -48,8 +49,7 @@ internal class KotlinWasmNode(private val kotlinJsTest: KotlinJsTest) : KotlinJs val args = mutableListOf() with(args) { - add("--experimental-wasm-gc") - add("--experimental-wasm-eh") + addWasmExperimentalArguments() add(testRunnerFile.absolutePath) addAll(cliArgs.toList()) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/utils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/utils.kt index 456d8d46a78..fa232b0371e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/utils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/utils.kt @@ -78,4 +78,9 @@ internal fun writeWasmUnitTestRunner(compiledFile: File): File { """.trimIndent() ) return testRunnerFile +} + +internal fun MutableList.addWasmExperimentalArguments() { + add("--experimental-wasm-gc") + add("--experimental-wasm-eh") } \ No newline at end of file