From 0f40b2adceb977df25e926e9a8ef79c6505549cd Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Fri, 1 Sep 2023 11:53:04 +0000 Subject: [PATCH] [Gradle, wasm] Hack for mixed mode with js, wasmJs and wasmWasi ^KT-61623 fixed --- .../kotlin/gradle/KotlinWasmGradlePluginIT.kt | 16 ++++++++++ .../app/build.gradle.kts | 30 ++++++++++++++++++ .../app/src/commonMain/kotlin/B.kt | 8 +++++ .../build.gradle.kts | 31 +++++++++++++++++++ .../lib/build.gradle.kts | 14 +++++++++ .../lib/src/commonMain/kotlin/A.kt | 6 ++++ .../new-mpp-wasm-wasi-js-test/settings.gradle | 4 +++ .../new-mpp-wasm-wasi-js-test/yarnLockStub | 0 .../js/npm/resolver/KotlinRootNpmResolver.kt | 23 +++++++++++--- 9 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/app/src/commonMain/kotlin/B.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/lib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/lib/src/commonMain/kotlin/A.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/yarnLockStub 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 e0a59c93a23..e6cebfe4376 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 @@ -45,4 +45,20 @@ class KotlinWasmGradlePluginIT : KGPBaseTest() { } } } + + @DisplayName("Check wasi and js target") + @GradleTest + fun wasiAndJsTarget(gradleVersion: GradleVersion) { + project("new-mpp-wasm-wasi-js-test", gradleVersion) { + buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) + + build("assemble") { + assertTasksExecuted(":app:compileKotlinWasmWasi") + assertTasksExecuted(":app:compileKotlinWasmJs") + + assertTasksExecuted(":lib:compileKotlinWasmWasi") + assertTasksExecuted(":lib:compileKotlinWasmJs") + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/app/build.gradle.kts new file mode 100644 index 00000000000..2dc6ecbcd6d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/app/build.gradle.kts @@ -0,0 +1,30 @@ +plugins { + kotlin("multiplatform") +} + +kotlin { + + wasmWasi { + binaries.executable() + nodejs {} + } + + wasmJs { + binaries.executable() + nodejs {} + } + + sourceSets { + val wasmJsMain by getting { + dependencies { + implementation(project(":lib")) + } + } + + val wasmWasiMain by getting { + dependencies { + implementation(project(":lib")) + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/app/src/commonMain/kotlin/B.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/app/src/commonMain/kotlin/B.kt new file mode 100644 index 00000000000..757a3c7a8d7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/app/src/commonMain/kotlin/B.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. + */ + +class B { + val a = A() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/build.gradle.kts new file mode 100644 index 00000000000..0168c9f32b5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/build.gradle.kts @@ -0,0 +1,31 @@ +plugins { + kotlin("multiplatform").version("").apply(false) +} + +rootProject.plugins.withType { + rootProject.the().nodeVersion = "20.2.0" + + tasks.named("kotlinStoreYarnLock") { + //A little hacky way to make yarn results + inputFile.fileValue(projectDir.resolve("yarnLockStub")) + } +} + +rootProject.plugins.withType { + // Test that we can set the version and it is a String. + // But use the default version since update this place every time anyway. + rootProject.the().version = (version as String) +} + +allprojects.forEach { + it.tasks.withType().configureEach { + args.add("--ignore-engines") + } +} + +allprojects { + repositories { + mavenLocal() + mavenCentral() + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/lib/build.gradle.kts new file mode 100644 index 00000000000..6f4e8f1a535 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/lib/build.gradle.kts @@ -0,0 +1,14 @@ +plugins { + kotlin("multiplatform") +} + +kotlin { + + wasmWasi { + nodejs {} + } + + wasmJs { + nodejs {} + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/lib/src/commonMain/kotlin/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/lib/src/commonMain/kotlin/A.kt new file mode 100644 index 00000000000..7e08f4f6539 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/lib/src/commonMain/kotlin/A.kt @@ -0,0 +1,6 @@ +/* + * 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. + */ + +class A \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/settings.gradle new file mode 100644 index 00000000000..2d565bba918 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/settings.gradle @@ -0,0 +1,4 @@ +rootProject.name = "kotlin-wasm" + +include("lib") +include("app") \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/yarnLockStub b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-wasm-wasi-js-test/yarnLockStub new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt index 5881fddb422..a781c36905a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt @@ -9,8 +9,10 @@ import org.gradle.api.Project import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.isMain +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.NpmVersions import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.nodejs.TasksRequirements import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution import java.io.File @@ -53,19 +55,30 @@ class KotlinRootNpmResolver internal constructor( if (mainCompilations.isEmpty()) return null //TODO[Ilya Goncharov, Igor Iakovlev] Hack for Mixed mode of legacy and IR tooling and Wasm - var containsWasm = false + var containsWasmJs = false + var containsWasmWasi = false var containsIrJs = false var containsLegacyJs = false val errorMessage = "Cannot resolve project dependency $src -> $target." + "Dependency to project with multiple js/wasm compilations is not supported yet." - check(mainCompilations.size <= 3) { errorMessage } + // legacy + ir + wasmJs + wasmWasi + val maxMainCompilationsCount = 4 + + check(mainCompilations.size <= maxMainCompilationsCount) { errorMessage } for (npmResolver in mainCompilations) { when (val compilation = npmResolver.compilation) { is KotlinJsIrCompilation -> { if (compilation.platformType == KotlinPlatformType.wasm) { - check(!containsWasm) { errorMessage } - containsWasm = true + val jsTarget = compilation.target as KotlinJsIrTarget + if (jsTarget.wasmTargetType == KotlinWasmTargetType.JS) { + check(!containsWasmJs) { errorMessage } + containsWasmJs = true + } + if (jsTarget.wasmTargetType == KotlinWasmTargetType.WASI) { + check(!containsWasmWasi) { errorMessage } + containsWasmWasi = true + } } else { check(!containsIrJs) { errorMessage } containsIrJs = true @@ -78,7 +91,7 @@ class KotlinRootNpmResolver internal constructor( } } } - check(containsWasm || containsIrJs || containsLegacyJs) { errorMessage } + check(containsWasmJs || containsWasmWasi || containsIrJs || containsLegacyJs) { errorMessage } return mainCompilations }