From df95a8ed6edea8aa2fcc1078f697783a704036af Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Thu, 21 Sep 2023 14:43:46 +0000 Subject: [PATCH] [Gradle, Wasm] Add run task for wasi ^KT-61973 fixed --- .../kotlin/gradle/KotlinWasmGradlePluginIT.kt | 12 ++++++++++ .../new-mpp-wasm-wasi-test/build.gradle.kts | 1 + .../src/wasmWasiMain/kotlin/foo.kt | 6 ++++- .../gradle/targets/js/ir/KotlinNodeJsIr.kt | 22 +++++++++++-------- .../gradle/targets/js/nodejs/NodeJsExec.kt | 17 +++++++++----- 5 files changed, 42 insertions(+), 16 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt index 201b31ea084..a833638cc59 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinWasmGradlePluginIT.kt @@ -44,6 +44,18 @@ class KotlinWasmGradlePluginIT : KGPBaseTest() { } } + @DisplayName("Check wasi target run") + @GradleTest + fun wasiRun(gradleVersion: GradleVersion) { + project("new-mpp-wasm-wasi-test", gradleVersion) { + buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) + + build(":wasmWasiNodeRun") { + assertOutputContains("Hello from Wasi") + } + } + } + @DisplayName("Check wasi and js target") @GradleTest fun wasiAndJsTarget(gradleVersion: GradleVersion) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/build.gradle.kts index c4c89c013b2..850397be459 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/build.gradle.kts @@ -34,6 +34,7 @@ kotlin { wasmWasi { nodejs {} + binaries.executable() } sourceSets { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/src/wasmWasiMain/kotlin/foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/src/wasmWasiMain/kotlin/foo.kt index da63ad63b9c..0eaa512f947 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/src/wasmWasiMain/kotlin/foo.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-test/src/wasmWasiMain/kotlin/foo.kt @@ -1,3 +1,7 @@ package my.pack.name -fun foo(): Int = 1 \ No newline at end of file +fun foo(): Int = 1 + +fun main() { + println("Hello from Wasi") +} \ No newline at end of file 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 b1f101ae135..b28d12abbfb 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 @@ -32,19 +32,20 @@ abstract class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) : project.tasks.withType().named(runTaskName).configure(body) } - override fun configureRun(compilation: KotlinJsIrCompilation) { - if (target.wasmTargetType != KotlinWasmTargetType.WASI) { - super.configureRun(compilation) - } - } - override fun locateOrRegisterRunTask(binary: JsIrBinary, name: String) { if (project.locateTask(name) != null) return - val runTaskHolder = NodeJsExec.create(binary.compilation, name) { + val compilation = binary.compilation + val runTaskHolder = NodeJsExec.create(compilation, name) { group = taskGroupName - dependsOn(binary.linkSyncTask) - inputFileProperty.fileProvider( + val inputFile = if ((compilation.target as KotlinJsIrTarget).wasmTargetType == KotlinWasmTargetType.WASI) { + dependsOn(binary.linkTask) + sourceMapStackTraces = false + binary.linkTask.flatMap { linkTask -> + linkTask.outputFileProperty + } + } else { + dependsOn(binary.linkSyncTask) binary.linkSyncTask.flatMap { linkSyncTask -> binary.linkTask.flatMap { linkTask -> linkTask.outputFileProperty.map { file -> @@ -52,6 +53,9 @@ abstract class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) : } } } + } + inputFileProperty.fileProvider( + inputFile ) } target.runTask.dependsOn(runTaskHolder) 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 57435769c0c..41de8a75885 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 @@ -11,8 +11,10 @@ import org.gradle.work.DisableCachingByDefault import org.gradle.work.NormalizeLineEndings import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.addWasmExperimentalArguments +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNodeJsExtension import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject @@ -68,7 +70,7 @@ constructor( val newArgs = mutableListOf() newArgs.addAll(nodeArgs) if (inputFileProperty.isPresent) { - newArgs.add(inputFileProperty.asFile.get().canonicalPath) + newArgs.add(inputFileProperty.asFile.get().normalize().absolutePath) } args?.let { newArgs.addAll(it) } args = newArgs @@ -106,11 +108,14 @@ constructor( ) { it.nodeJs = nodeJs it.executable = nodeJs.requireConfigured().nodeExecutable - it.workingDir = npmProject.dir - it.dependsOn( - nodeJsTaskProviders.npmInstallTaskProvider, - nodeJsTaskProviders.storeYarnLockTaskProvider, - ) + if ((compilation.target as? KotlinJsIrTarget)?.wasmTargetType != KotlinWasmTargetType.WASI) { + it.workingDir = npmProject.dir + it.dependsOn( + nodeJsTaskProviders.npmInstallTaskProvider, + nodeJsTaskProviders.storeYarnLockTaskProvider, + ) + } + it.dependsOn(nodeJsTaskProviders.nodeJsSetupTaskProvider) it.dependsOn(compilation.compileKotlinTaskProvider) if (compilation.platformType == KotlinPlatformType.wasm) { it.nodeArgs.addWasmExperimentalArguments()