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 { 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 { 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 { 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 { 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>().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" ) } val compileKotlinJs by tasks.existing(KotlinCompile::class) { kotlinOptions.freeCompilerArgs += "-Xir-module-name=kotlin" if (!kotlinBuildProperties.disableWerror) { kotlinOptions.allWarningsAsErrors = true } } 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") }