diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JsConfigurationCacheIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JsConfigurationCacheIT.kt index e5a200d8f25..e4cf5c4d5f8 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JsConfigurationCacheIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JsConfigurationCacheIT.kt @@ -127,6 +127,29 @@ abstract class AbstractJsConfigurationCacheIT(protected val irBackend: Boolean) ) } } + + @DisplayName("Node.js run correctly works with configuration cache") + @GradleTest + fun testNodeJsRun(gradleVersion: GradleVersion) { + project("kotlin-js-nodejs-project", gradleVersion) { + build("nodeRun", buildOptions = buildOptions) { + assertTasksExecuted(":nodeRun") + assertOutputContains( + "Calculating task graph as no configuration cache is available for tasks: nodeRun" + ) + + assertConfigurationCacheStored() + } + + build("clean", buildOptions = buildOptions) + + // Then run a build where tasks states are deserialized to check that they work correctly in this mode + build("nodeRun", buildOptions = buildOptions) { + assertTasksExecuted(":nodeRun") + assertConfigurationCacheReused() + } + } + } } @JsGradlePluginTests diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/WasmConfigurationCacheIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/WasmConfigurationCacheIT.kt new file mode 100644 index 00000000000..e107a3da670 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/WasmConfigurationCacheIT.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle + +import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType +import org.jetbrains.kotlin.gradle.testbase.* +import org.junit.jupiter.api.DisplayName + +@MppGradlePluginTests +class WasmConfigurationCacheIT : KGPBaseTest() { + override val defaultBuildOptions = + super.defaultBuildOptions.copy( + configurationCache = true, + ) + + @DisplayName("configuration cache is working for wasm") + @GradleTest + fun testKotlinWasmCompilation(gradleVersion: GradleVersion) { + project("wasm-d8-simple-project", gradleVersion) { + assertSimpleConfigurationCacheScenarioWorks( + "assemble", + buildOptions = defaultBuildOptions, + executedTaskNames = listOf(":compileKotlinWasm") + ) + } + } + + @DisplayName("D8 run correctly works with configuration cache") + @GradleTest + @GradleTestVersions(minVersion = TestVersions.Gradle.G_7_6) + fun testD8Run(gradleVersion: GradleVersion) { + project("wasm-d8-simple-project", gradleVersion) { + build("wasmD8Run", buildOptions = buildOptions) { + assertTasksExecuted(":wasmD8Run") + assertOutputContains( + "Calculating task graph as no configuration cache is available for tasks: wasmD8Run" + ) + + assertConfigurationCacheStored() + } + + build("clean", buildOptions = buildOptions) + + // Then run a build where tasks states are deserialized to check that they work correctly in this mode + build("wasmD8Run", buildOptions = buildOptions) { + assertTasksExecuted(":wasmD8Run") + assertConfigurationCacheReused() + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/build.gradle.kts new file mode 100644 index 00000000000..d70aa20233d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + wasm { + binaries.executable() + d8 { + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/src/wasmMain/kotlin/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/src/wasmMain/kotlin/A.kt new file mode 100644 index 00000000000..cb5d5fd08dd --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/wasm-d8-simple-project/src/wasmMain/kotlin/A.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +fun main() { + println("Hello, world") +} \ No newline at end of file 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 4617830c256..75c6acb7f91 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 @@ -13,17 +13,8 @@ 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 - -open class D8Exec -@Inject -constructor( - private val compilation: KotlinJsCompilation -) : AbstractExecTask(D8Exec::class.java) { - @Transient - @get:Internal - lateinit var d8: D8RootExtension +open class D8Exec : AbstractExecTask(D8Exec::class.java) { init { onlyIf { !inputFileProperty.isPresent || inputFileProperty.asFile.map { it.exists() }.get() @@ -45,9 +36,7 @@ constructor( if (inputFileProperty.isPresent) { val inputFile = inputFileProperty.asFile.get() workingDir = inputFile.parentFile - if (compilation.target.platformType == KotlinPlatformType.wasm) { - newArgs.add("--module") - } + newArgs.add("--module") newArgs.add(inputFile.canonicalPath) } args?.let { @@ -70,10 +59,8 @@ constructor( val project = target.project val d8 = D8RootPlugin.apply(project.rootProject) return project.registerTask( - name, - listOf(compilation) + name ) { - it.d8 = d8 it.executable = d8.requireConfigured().executablePath.absolutePath it.dependsOn(d8.setupTaskProvider) it.dependsOn(compilation.compileKotlinTaskProvider) 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 bfba48e5c27..110a0636340 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 @@ -23,12 +23,16 @@ open class NodeJsExec @Inject constructor( @Internal - override val compilation: KotlinJsCompilation + @Transient + override val compilation: KotlinJsCompilation, ) : AbstractExecTask(NodeJsExec::class.java), RequiresNpmDependencies { @Transient @get:Internal lateinit var nodeJs: NodeJsRootExtension + @Internal + val npmProject = compilation.npmProject + init { onlyIf { !inputFileProperty.isPresent || inputFileProperty.asFile.map { @@ -70,7 +74,7 @@ constructor( if (sourceMapStackTraces) { val sourceMapSupportArgs = mutableListOf( "--require", - compilation.npmProject.require("source-map-support/register.js") + npmProject.require("source-map-support/register.js") ) args?.let { sourceMapSupportArgs.addAll(it) }