[Gradle, Wasm] Add run task for wasi

^KT-61973 fixed
This commit is contained in:
Ilya Goncharov
2023-09-21 14:43:46 +00:00
committed by Space Team
parent 0d04b8783c
commit df95a8ed6e
5 changed files with 42 additions and 16 deletions
@@ -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) {
@@ -34,6 +34,7 @@ kotlin {
wasmWasi {
nodejs {}
binaries.executable()
}
sourceSets {
@@ -1,3 +1,7 @@
package my.pack.name
fun foo(): Int = 1
fun foo(): Int = 1
fun main() {
println("Hello from Wasi")
}
@@ -32,19 +32,20 @@ abstract class KotlinNodeJsIr @Inject constructor(target: KotlinJsIrTarget) :
project.tasks.withType<NodeJsExec>().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<NodeJsExec>(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)
@@ -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<String>()
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()