blob: 2c129649761487141cae0a851c5051fd4b76fb90 [file] [log] [blame]
import org.jetbrains.kotlin.gradle.dsl.KotlinCompile
import org.jetbrains.kotlin.gradle.targets.js.d8.D8RootPlugin
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrLink
plugins {
`maven-publish`
kotlin("multiplatform")
}
description = "Kotlin Standard Library for experimental WebAssembly platform"
val unimplementedNativeBuiltIns =
(file("$rootDir/core/builtins/native/kotlin/").list().toSortedSet() - file("$rootDir/libraries/stdlib/wasm/builtins/kotlin/").list())
.map { "core/builtins/native/kotlin/$it" }
val builtInsSources by task<Sync> {
val sources = listOf(
"core/builtins/src/kotlin/"
) + unimplementedNativeBuiltIns
val excluded = listOf(
// JS-specific optimized version of emptyArray() already defined
"ArrayIntrinsics.kt",
// Included with K/N collections
"Collections.kt", "Iterator.kt", "Iterators.kt"
)
sources.forEach { path ->
from("$rootDir/$path") {
into(path.dropLastWhile { it != '/' })
excluded.forEach {
exclude(it)
}
}
}
into("$buildDir/builtInsSources")
}
val commonMainSources by task<Sync> {
val sources = listOf(
"libraries/stdlib/common/src/",
"libraries/stdlib/src/kotlin/",
"libraries/stdlib/unsigned/"
)
sources.forEach { path ->
from("$rootDir/$path") {
into(path.dropLastWhile { it != '/' })
}
}
into("$buildDir/commonMainSources")
dependsOn(":prepare:build.version:writeStdlibVersion")
}
val commonTestSources by task<Sync> {
val sources = listOf(
"libraries/stdlib/test/",
"libraries/stdlib/common/test/"
)
sources.forEach { path ->
from("$rootDir/$path") {
into(path.dropLastWhile { it != '/' })
// exclusions due to KT-51647
exclude("generated/minmax")
exclude("collections/MapTest.kt")
}
}
into("$buildDir/commonTestSources")
}
D8RootPlugin.apply(rootProject).version = v8Version
kotlin {
wasm {
d8()
}
sourceSets {
val wasmMain by getting {
kotlin.srcDirs("builtins", "internal", "runtime", "src", "stubs")
kotlin.srcDirs("$rootDir/libraries/stdlib/native-wasm/src")
kotlin.srcDirs(files(builtInsSources.map { it.destinationDir }))
}
val commonMain by getting {
kotlin.srcDirs(files(commonMainSources.map { it.destinationDir }))
}
val commonTest by getting {
dependencies {
api(project(":kotlin-test:kotlin-test-wasm"))
}
kotlin.srcDir(files(commonTestSources.map { it.destinationDir }))
}
val wasmTest by getting {
dependencies {
api(project(":kotlin-test:kotlin-test-wasm"))
}
kotlin.srcDir("$rootDir/libraries/stdlib/wasm/test/")
kotlin.srcDir("$rootDir/libraries/stdlib/native-wasm/test/")
}
}
}
tasks.named("compileKotlinWasm", KotlinCompile::class) {
// TODO: enable explicit API mode
kotlinOptions.allWarningsAsErrors = true
}
tasks.named("compileTestKotlinWasm", KotlinCompile::class) {
// TODO: fix all warnings, enable and -Werror
kotlinOptions.suppressWarnings = true
}
tasks.withType<KotlinCompile<*>>().configureEach {
kotlinOptions.freeCompilerArgs += listOf(
"-Xallow-kotlin-package",
"-opt-in=kotlin.ExperimentalMultiplatform",
"-opt-in=kotlin.contracts.ExperimentalContracts",
"-opt-in=kotlin.RequiresOptIn",
"-opt-in=kotlin.ExperimentalUnsignedTypes",
"-opt-in=kotlin.ExperimentalStdlibApi",
"-opt-in=kotlin.io.encoding.ExperimentalEncodingApi",
"-XXLanguage:+RangeUntilOperator",
)
}
tasks.named("compileKotlinWasm") {
(this as KotlinCompile<*>).kotlinOptions.freeCompilerArgs += "-Xir-module-name=kotlin"
dependsOn(commonMainSources)
dependsOn(builtInsSources)
}
val compileTestKotlinWasm by tasks.existing(KotlinCompile::class) {
val sources: FileCollection = kotlin.sourceSets["commonTest"].kotlin
doFirst {
// Note: common test sources are copied to the actual source directory by commonMainSources task,
// so can't do this at configuration time:
kotlinOptions.freeCompilerArgs += listOf("-Xcommon-sources=${sources.joinToString(",")}")
}
}
val compileTestDevelopmentExecutableKotlinWasm = tasks.named<KotlinJsIrLink>("compileTestDevelopmentExecutableKotlinWasm") {
(this as KotlinCompile<*>).kotlinOptions.freeCompilerArgs += listOf("-Xwasm-enable-array-range-checks")
}
val runtimeElements by configurations.creating {}
val apiElements by configurations.creating {}
publish {
pom.packaging = "klib"
artifact(tasks.named("wasmJar")) {
extension = "klib"
}
}
afterEvaluate {
// cleanup default publications
// TODO: remove after mpp plugin allows avoiding their creation at all, KT-29273
publishing {
publications.removeAll { it.name != "Main" }
}
tasks.withType<AbstractPublishToMaven> {
if (publication.name != "Main") this.enabled = false
}
tasks.named("publish") {
doFirst {
publishing.publications {
if (singleOrNull()?.name != "Main") {
throw GradleException("kotlin-stdlib-wasm should have only one publication, found $size: ${joinToString { it.name }}")
}
}
}
}
}