[WASM] Implement gradle plugin run tasks for wasm

This commit is contained in:
Igor Yakovlev
2022-06-10 15:39:50 +02:00
parent 1b6b3ec3b5
commit 177177ee8c
9 changed files with 66 additions and 37 deletions
@@ -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()
}
}
@@ -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<D8Exec>().named(runTaskName).configure(body)
}
override fun locateOrRegisterRunTask(binary: JsIrBinary, name: String) {
if (project.locateTask<D8Exec>(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)
}
@@ -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<NodeJsExec>(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
@@ -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<NodeJsExec>().named(runTaskName).configure(body)
}
override fun locateOrRegisterRunTask(binary: JsIrBinary, name: String) {
if (project.locateTask<NodeJsExec>(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)
}
@@ -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()
}
}
@@ -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)
@@ -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<String>()
with(args) {
addWasmExperimentalArguments()
add(testRunnerFile.absolutePath)
add("--")
addAll(cliArgs.toList())
}
return TCServiceMessagesTestExecutionSpec(
forkOptions = forkOptions,
@@ -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<String>()
with(args) {
add("--experimental-wasm-gc")
add("--experimental-wasm-eh")
addWasmExperimentalArguments()
add(testRunnerFile.absolutePath)
addAll(cliArgs.toList())
}
@@ -78,4 +78,9 @@ internal fun writeWasmUnitTestRunner(compiledFile: File): File {
""".trimIndent()
)
return testRunnerFile
}
internal fun MutableList<String>.addWasmExperimentalArguments() {
add("--experimental-wasm-gc")
add("--experimental-wasm-eh")
}