Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -30,31 +36,31 @@ kotlin {
}
}

js(IR) {
js {
browser {
testTask(Action {
filter.setExcludePatterns("*SmokeFileTest*")
})
}
}

@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"))
}
}

Expand All @@ -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() {
Expand All @@ -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<KotlinSourceSet>.createSourceSet(
name: String,
parent: KotlinSourceSet? = null,
children: List<String> = 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<NodeJsRootExtension>().apply {
nodeVersion = "21.0.0-v8-canary202310177990572111"
nodeDownloadBaseUrl = "https://nodejs.org/download/v8-canary"
Expand Down
10 changes: 5 additions & 5 deletions bytestring/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,20 @@ plugins {
}

kotlin {
js(IR) {
js {
nodejs {
testTask(Action {
testTask {
useMocha {
timeout = "30s"
}
})
}
}
browser {
testTask(Action {
testTask {
useMocha {
timeout = "30s"
}
})
}
}
}
}
Expand Down
22 changes: 9 additions & 13 deletions core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
}
Expand Down