diff --git a/build-logic/src/main/kotlin/kotlinx/io/conventions/kotlinx-io-multiplatform.gradle.kts b/build-logic/src/main/kotlin/kotlinx/io/conventions/kotlinx-io-multiplatform.gradle.kts index c4cc02478..e90ff8e7d 100644 --- a/build-logic/src/main/kotlin/kotlinx/io/conventions/kotlinx-io-multiplatform.gradle.kts +++ b/build-logic/src/main/kotlin/kotlinx/io/conventions/kotlinx-io-multiplatform.gradle.kts @@ -3,8 +3,14 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENCE file. */ +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinHierarchyBuilder +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType +import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask import kotlin.jvm.optionals.getOrNull @@ -30,7 +36,7 @@ kotlin { } } - js(IR) { + js { browser { testTask(Action { filter.setExcludePatterns("*SmokeFileTest*") @@ -38,23 +44,23 @@ kotlin { } } - @OptIn(org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl::class) + @OptIn(ExperimentalWasmDsl::class) wasmJs { nodejs() // Disabled because we can't exclude some tests: https://youtrack.jetbrains.com/issue/KT-58291 // browser() } - @OptIn(org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl::class) + @OptIn(ExperimentalWasmDsl::class) wasmWasi { nodejs() } + nativeTargets() + sourceSets { - commonTest { - dependencies { - implementation(kotlin("test")) - } + commonTest.dependencies { + implementation(kotlin("test")) } } @@ -63,42 +69,45 @@ kotlin { configureSourceSet() } - configureNativePlatforms() - - val appleTargets = appleTargets() - val mingwTargets = mingwTargets() + @OptIn(ExperimentalKotlinGradlePluginApi::class) + applyDefaultHierarchyTemplate { + common { + group("native") { + group("nonApple") { + group("mingw") + group("unix") { + group("linux") + group("androidNative") + } + } + } + group("nodeFilesystemShared") { + withJs() + withWasmJs() + } + group("wasm") { + withWasmJs() + withWasmWasi() + } + } + } +} - /* - Native source sets hierarchy: - native - |-> apple - |-> nonApple - |-> mingw - |-> unix - |-> linux - |-> android - */ +// will be available in KGP 2.0 +@OptIn(ExperimentalKotlinGradlePluginApi::class) +fun KotlinHierarchyBuilder.withWasmJs(): Unit = withCompilations { + val target = it.target + target.platformType == KotlinPlatformType.wasm && + target is KotlinJsIrTarget && + target.wasmTargetType == KotlinWasmTargetType.JS +} - sourceSets { - val nativeMain = createSourceSet("nativeMain", parent = commonMain.get()) - val nativeTest = createSourceSet("nativeTest", parent = commonTest.get()) - val nonAppleMain = createSourceSet("nonAppleMain", parent = nativeMain) - val nonAppleTest = createSourceSet("nonAppleTest", parent = nativeTest) - createSourceSet("appleMain", parent = nativeMain, children = appleTargets) - createSourceSet("appleTest", parent = nativeTest, children = appleTargets) - createSourceSet("mingwMain", parent = nonAppleMain, children = mingwTargets) - createSourceSet("mingwTest", parent = nonAppleTest, children = mingwTargets) - val unixMain = createSourceSet("unixMain", parent = nonAppleMain) - val unixTest = createSourceSet("unixTest", parent = nonAppleTest) - createSourceSet("linuxMain", parent = unixMain, children = linuxTargets()) - createSourceSet("linuxTest", parent = unixTest, children = linuxTargets()) - createSourceSet("androidMain", parent = unixMain, children = androidTargets()) - createSourceSet("androidTest", parent = unixTest, children = androidTargets()) - createSourceSet("nodeFilesystemSharedMain", parent = commonMain.get(), children = nodeTargets()) - createSourceSet("nodeFilesystemSharedTest", parent = commonTest.get(), children = nodeTargets()) - createSourceSet("wasmMain", parent = commonMain.get(), children = wasmTargets()) - createSourceSet("wasmTest", parent = commonTest.get(), children = wasmTargets()) - } +@OptIn(ExperimentalKotlinGradlePluginApi::class) +fun KotlinHierarchyBuilder.withWasmWasi(): Unit = withCompilations { + val target = it.target + target.platformType == KotlinPlatformType.wasm && + target is KotlinJsIrTarget && + target.wasmTargetType == KotlinWasmTargetType.WASI } fun KotlinSourceSet.configureSourceSet() { @@ -115,95 +124,35 @@ fun KotlinSourceSet.configureSourceSet() { } } -/** - * Creates a source set for a directory that isn't already a built-in platform. Use this to create - * custom shared directories like `nonJvmMain` or `unixMain`. - */ -fun NamedDomainObjectContainer.createSourceSet( - name: String, - parent: KotlinSourceSet? = null, - children: List = listOf() -): KotlinSourceSet { - val result = create(name) - - if (parent != null) { - result.dependsOn(parent) - } - - val suffix = when { - name.endsWith("Main") -> "Main" - name.endsWith("Test") -> "Test" - else -> error("unexpected source set name: ${name}") - } - - for (childTarget in children) { - val childSourceSet = get("${childTarget}$suffix") - childSourceSet.dependsOn(result) - } - - return result -} - -fun KotlinMultiplatformExtension.configureNativePlatforms() { +private fun KotlinMultiplatformExtension.nativeTargets() { iosX64() iosArm64() iosSimulatorArm64() + tvosX64() tvosArm64() tvosSimulatorArm64() + watchosArm32() watchosArm64() watchosX64() watchosSimulatorArm64() watchosDeviceArm64() - linuxArm64() + androidNativeArm32() androidNativeArm64() androidNativeX64() androidNativeX86() - // Required to generate tests tasks: https://youtrack.jetbrains.com/issue/KT-26547 + linuxX64() + linuxArm64() + macosX64() macosArm64() + mingwX64() } -fun appleTargets() = listOf( - "iosArm64", - "iosX64", - "iosSimulatorArm64", - "macosX64", - "macosArm64", - "tvosArm64", - "tvosX64", - "tvosSimulatorArm64", - "watchosArm32", - "watchosArm64", - "watchosX64", - "watchosSimulatorArm64", - "watchosDeviceArm64" -) - -fun mingwTargets() = listOf( - "mingwX64" -) - -fun linuxTargets() = listOf( - "linuxX64", - "linuxArm64" -) - -fun androidTargets() = listOf( - "androidNativeArm32", - "androidNativeArm64", - "androidNativeX64", - "androidNativeX86" -) - -fun wasmTargets() = listOf("wasmJs", "wasmWasi") - -fun nodeTargets() = listOf("js", "wasmJs") - rootProject.the().apply { nodeVersion = "21.0.0-v8-canary202310177990572111" nodeDownloadBaseUrl = "https://nodejs.org/download/v8-canary" diff --git a/bytestring/build.gradle.kts b/bytestring/build.gradle.kts index d96dd3e70..ad2f3ef49 100644 --- a/bytestring/build.gradle.kts +++ b/bytestring/build.gradle.kts @@ -9,20 +9,20 @@ plugins { } kotlin { - js(IR) { + js { nodejs { - testTask(Action { + testTask { useMocha { timeout = "30s" } - }) + } } browser { - testTask(Action { + testTask { useMocha { timeout = "30s" } - }) + } } } } diff --git a/core/android/src/files/FileSystemAndroid.kt b/core/androidNative/src/files/FileSystemAndroid.kt similarity index 100% rename from core/android/src/files/FileSystemAndroid.kt rename to core/androidNative/src/files/FileSystemAndroid.kt diff --git a/core/build.gradle.kts b/core/build.gradle.kts index f744a80de..49512da53 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -14,33 +14,29 @@ plugins { } kotlin { - js(IR) { + js { nodejs { - testTask(Action { + testTask { useMocha { timeout = "300s" } - }) + } } browser { - testTask(Action { + testTask { useMocha { timeout = "300s" } - }) + } } } sourceSets { - commonMain { - dependencies { - api(project(":kotlinx-io-bytestring")) - } + commonMain.dependencies { + api(project(":kotlinx-io-bytestring")) } - appleTest { - dependencies { - implementation(libs.kotlinx.coroutines.core) - } + appleTest.dependencies { + implementation(libs.kotlinx.coroutines.core) } } }