blob: 2e9046e35000c82ef98dba3bd4ca1b6447211fe9 [file] [log] [blame]
import org.jetbrains.kotlin.gradle.dsl.KotlinCompile
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.IR
plugins {
kotlin("multiplatform")
}
kotlin {
js(IR) {
nodejs {
testTask {
useMocha {
timeout = "10s"
}
}
}
}
}
val unimplementedNativeBuiltIns =
(file("$rootDir/core/builtins/native/kotlin/").list().toSortedSet() - file("$rootDir/libraries/stdlib/js-ir/builtins/").list())
.map { "core/builtins/native/kotlin/$it" }
// Required to compile native builtins with the rest of runtime
val builtInsHeader = """@file:Suppress(
"NON_ABSTRACT_FUNCTION_WITH_NO_BODY",
"MUST_BE_INITIALIZED_OR_BE_ABSTRACT",
"EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE",
"PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED",
"WRONG_MODIFIER_TARGET",
"UNUSED_PARAMETER"
)
"""
val commonMainSources by task<Sync> {
dependsOn(":prepare:build.version:writeStdlibVersion")
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")
}
val jsMainSources by task<Sync> {
val sources = listOf(
"core/builtins/src/kotlin/",
"libraries/stdlib/js/src/",
"libraries/stdlib/js/runtime/"
) + unimplementedNativeBuiltIns
val excluded = listOf(
// stdlib/js/src/generated is used exclusively for current `js-v1` backend.
"libraries/stdlib/js/src/generated/**",
// JS-specific optimized version of emptyArray() already defined
"core/builtins/src/kotlin/ArrayIntrinsics.kt"
)
sources.forEach { path ->
from("$rootDir/$path") {
into(path.dropLastWhile { it != '/' })
excluded.filter { it.startsWith(path) }.forEach {
exclude(it.substring(path.length))
}
}
}
into("$buildDir/jsMainSources")
val unimplementedNativeBuiltIns = unimplementedNativeBuiltIns
val buildDir = buildDir
val builtInsHeader = builtInsHeader
doLast {
unimplementedNativeBuiltIns.forEach { path ->
val file = File("$buildDir/jsMainSources/$path")
val sourceCode = builtInsHeader + file.readText()
file.writeText(sourceCode)
}
}
}
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 != '/' })
}
}
into("$buildDir/commonTestSources")
}
val jsTestSources by task<Sync> {
from("$rootDir/libraries/stdlib/js/test/")
into("$buildDir/jsTestSources")
}
kotlin {
sourceSets {
val commonMain by getting {
kotlin.srcDir(files(commonMainSources.map { it.destinationDir }))
}
val jsMain by getting {
kotlin.srcDir(files(jsMainSources.map { it.destinationDir }))
kotlin.srcDir("builtins")
kotlin.srcDir("runtime")
kotlin.srcDir("src")
}
val commonTest by getting {
dependencies {
api(project(":kotlin-test:kotlin-test-js-ir"))
}
kotlin.srcDir(files(commonTestSources.map { it.destinationDir }))
}
val jsTest by getting {
dependencies {
api(project(":kotlin-test:kotlin-test-js-ir"))
}
kotlin.srcDir(files(jsTestSources.map { it.destinationDir }))
}
}
}
tasks.withType<KotlinCompile<*>>().configureEach {
kotlinOptions.freeCompilerArgs += listOf(
"-Xallow-kotlin-package",
"-Xallow-result-return-type",
"-Xuse-experimental=kotlin.Experimental",
"-Xuse-experimental=kotlin.ExperimentalMultiplatform",
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
"-Xinline-classes",
"-Xopt-in=kotlin.RequiresOptIn",
"-Xopt-in=kotlin.ExperimentalUnsignedTypes",
"-Xopt-in=kotlin.ExperimentalStdlibApi"
)
}
val compileKotlinJs by tasks.existing(KotlinCompile::class) {
kotlinOptions.freeCompilerArgs += "-Xir-module-name=kotlin"
}
val compileTestKotlinJs 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 += "-Xcommon-sources=${sources.joinToString(",")}"
}
}
val packFullRuntimeKLib by tasks.registering(Jar::class) {
dependsOn(compileKotlinJs)
from(buildDir.resolve("classes/kotlin/js/main"))
destinationDirectory.set(rootProject.buildDir.resolve("js-ir-runtime"))
archiveFileName.set("full-runtime.klib")
}