Build wasm stdlib artifacts in kotlin-stdlib project

This commit is contained in:
Ilya Gorbunov
2023-08-22 02:06:09 +02:00
committed by Space Team
parent 53681a33d9
commit d4b245615a
7 changed files with 180 additions and 54 deletions
+2 -2
View File
@@ -341,8 +341,8 @@ val (wasmWasiApi, wasmWasiRuntime) = listOf("api", "runtime").map { usage ->
wasmWasiRuntime.extendsFrom(wasmWasiApi)
dependencies {
wasmJsApi(project(":kotlin-stdlib-wasm-js"))
wasmWasiApi(project(":kotlin-stdlib-wasm-wasi"))
wasmJsApi(project(":kotlin-stdlib"))
wasmWasiApi(project(":kotlin-stdlib"))
}
artifacts {
@@ -8,7 +8,7 @@ configureWasmKotlinTest(
wasmTargetParameter = "wasm-js",
wasmTargetAttribute = KotlinWasmTargetAttribute.js,
targetSourceDir = "$rootDir/libraries/kotlin.test/wasm/js/src/main/kotlin",
stdDependencyName = ":kotlin-stdlib-wasm-js"
stdDependencyName = ":kotlin-stdlib"
) { extensionBody ->
kotlin(extensionBody)
}
@@ -8,7 +8,7 @@ configureWasmKotlinTest(
wasmTargetParameter = "wasm-wasi",
wasmTargetAttribute = KotlinWasmTargetAttribute.wasi,
targetSourceDir = "$rootDir/libraries/kotlin.test/wasm/wasi/src/main/kotlin",
stdDependencyName = ":kotlin-stdlib-wasm-wasi"
stdDependencyName = ":kotlin-stdlib"
) { extensionBody ->
kotlin(extensionBody)
}
+150 -48
View File
@@ -5,7 +5,12 @@ import org.gradle.jvm.tasks.Jar
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetAttribute
import org.jetbrains.kotlin.gradle.targets.js.d8.D8RootPlugin
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinTargetWithNodeJsDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinWasmTargetDsl
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrLink
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.UsesKotlinJavaToolchain
import plugins.configureDefaultPublishing
import plugins.configureKotlinPomAttributes
@@ -212,6 +217,30 @@ kotlin {
}
}
D8RootPlugin.apply(rootProject).version = v8Version
fun KotlinWasmTargetDsl.commonWasmTargetConfiguration() {
(this as KotlinTargetWithNodeJsDsl).nodejs()
compilations {
all {
kotlinOptions.freeCompilerArgs += listOf("-Xallow-kotlin-package", "-Xexpect-actual-classes")
}
val main by getting
main.apply {
kotlinOptions.freeCompilerArgs += "-Xir-module-name=kotlin"
kotlinOptions.allWarningsAsErrors = true
}
}
}
@OptIn(ExperimentalWasmDsl::class)
wasmJs {
commonWasmTargetConfiguration()
}
@OptIn(ExperimentalWasmDsl::class)
wasmWasi {
commonWasmTargetConfiguration()
}
sourceSets {
all {
kotlin.setSrcDirs(emptyList<File>())
@@ -361,6 +390,104 @@ kotlin {
kotlin.srcDir(jsCommonTestSrcDir)
}
val nativeWasmMain by creating {
dependsOn(commonMain.get())
kotlin.srcDir("native-wasm/src")
}
val nativeWasmTest by creating {
dependsOn(commonTest.get())
kotlin.srcDir("native-wasm/test")
}
val wasmCommonMain by creating {
dependsOn(nativeWasmMain)
val prepareWasmBuiltinSources by tasks.registering(Sync::class)
kotlin {
srcDir(prepareWasmBuiltinSources)
srcDir("wasm/builtins")
srcDir("wasm/internal")
srcDir("wasm/runtime")
srcDir("wasm/src")
srcDir("wasm/stubs")
}
prepareWasmBuiltinSources.configure {
val unimplementedNativeBuiltIns =
(file("$rootDir/core/builtins/native/kotlin/").list().toSortedSet() - file("wasm/builtins/kotlin/").list())
.map { "core/builtins/native/kotlin/$it" }
val sources = listOf(
"core/builtins/src/kotlin/"
) + unimplementedNativeBuiltIns
val excluded = listOf(
// included in commonMain
"internal/InternalAnnotations.kt",
// 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/src/wasm-builtin-sources")
}
}
val wasmCommonTest by creating {
dependsOn(nativeWasmTest)
kotlin {
srcDir("wasm/test")
}
}
val wasmJsMain by getting {
dependsOn(wasmCommonMain)
kotlin {
srcDir("wasm/js/builtins")
srcDir("wasm/js/internal")
srcDir("wasm/js/src")
}
}
val wasmJsTest by getting {
dependsOn(wasmCommonTest)
dependencies {
api(project(":kotlin-test:kotlin-test-wasm-js"))
}
kotlin {
srcDir("wasm/js/test")
}
}
val wasmWasiMain by getting {
dependsOn(wasmCommonMain)
kotlin {
srcDir("wasm/wasi/builtins")
srcDir("wasm/wasi/src")
}
languageSettings {
optIn("kotlin.wasm.unsafe.UnsafeWasmMemoryApi")
}
}
val wasmWasiTest by getting {
dependsOn(wasmCommonTest)
dependencies {
api(project(":kotlin-test:kotlin-test-wasm-wasi"))
}
kotlin {
srcDir("wasm/wasi/test")
}
}
all sourceSet@ {
languageSettings {
// TODO: progressiveMode = use build property 'test.progressive.mode'
@@ -491,6 +618,13 @@ tasks {
}
}
val wasmJsJar by existing(Jar::class) {
manifestAttributes(manifest, "Main")
}
val wasmWasiJar by existing(Jar::class) {
manifestAttributes(manifest, "Main")
}
artifacts {
val distJsJar = configurations.create("distJsJar")
val distJsSourcesJar = configurations.create("distJsSourcesJar")
@@ -526,6 +660,19 @@ tasks {
check.configure { dependsOn(jvmLongRunningTest) }
}
listOf("Js", "Wasi").forEach { wasmTarget ->
named("compileTestKotlinWasm$wasmTarget", AbstractKotlinCompile::class) {
// TODO: fix all warnings, enable -Werror
compilerOptions.suppressWarnings = true
// exclusions due to KT-51647
exclude("generated/minmax/*")
exclude("collections/MapTest.kt")
}
named("compileTestDevelopmentExecutableKotlinWasm$wasmTarget", KotlinJsIrLink::class) {
kotlinOptions.freeCompilerArgs += listOf("-Xwasm-enable-array-range-checks")
}
}
/*
We are using a custom 'kotlin-project-structure-metadata' to ensure 'nativeApiElements' lists 'commonMain' as source set
*/
@@ -558,49 +705,6 @@ tasks {
}
// republishing artifacts from kotlin-stdlib-wasm-* projects
// TODO: replace with wasm targets compilation in this project
fun wasmOutgoingConfigurations(target: KotlinWasmTargetAttribute) {
val targetName = target.toString().replaceFirstChar { it.uppercase() }
val klib = resolvingConfiguration("wasm${targetName}Klib")
val sources = resolvingConfiguration("wasm${targetName}Sources")
dependencies {
klib(project(":kotlin-stdlib-wasm-$target", configuration = "wasmRuntimeElements"))
sources(project(":kotlin-stdlib-wasm-$target", configuration = "wasmSourcesElements"))
}
listOf(KotlinUsages.KOTLIN_API, KotlinUsages.KOTLIN_RUNTIME).map { usage ->
val name = usage.substringAfter("kotlin-")
val configuration = outgoingConfiguration("wasm${targetName}${name.replaceFirstChar { it.uppercase() }}Elements") {
attributes {
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY))
attribute(TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, objects.named("non-jvm"))
attribute(Usage.USAGE_ATTRIBUTE, objects.named(usage))
attribute(KotlinPlatformType.attribute, KotlinPlatformType.wasm)
attribute(KotlinWasmTargetAttribute.wasmTargetAttribute, target)
}
}
artifacts.add(configuration.name, provider { klib.singleFile }) {
builtBy(klib)
}
}
val outSources = outgoingConfiguration("wasm${targetName}SourcesElements") {
attributes {
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION))
attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType.SOURCES))
attribute(TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, objects.named("non-jvm"))
attribute(Usage.USAGE_ATTRIBUTE, objects.named(KotlinUsages.KOTLIN_RUNTIME))
attribute(KotlinPlatformType.attribute, KotlinPlatformType.wasm)
attribute(KotlinWasmTargetAttribute.wasmTargetAttribute, target)
}
}
artifacts.add(outSources.name, provider { sources.singleFile }) {
builtBy(sources)
}
}
wasmOutgoingConfigurations(KotlinWasmTargetAttribute.js)
wasmOutgoingConfigurations(KotlinWasmTargetAttribute.wasi)
// region ==== Publishing ====
@@ -718,10 +822,8 @@ publishing {
val wasmJsModule by existing(MavenPublication::class)
val wasmWasiModule by existing(MavenPublication::class)
// an arbitrary empty classpath configuration is used for the following sboms
// TODO: replace with classpath configurations of the corresponding target compilations when they are migrated here (though empty as well)
configureSbom("Wasm-Js", "kotlin-stdlib-wasm-js", setOf("metadataCompileClasspath"), wasmJsModule)
configureSbom("Wasm-Wasi", "kotlin-stdlib-wasm-wasi", setOf("metadataCompileClasspath"), wasmWasiModule)
configureSbom("Wasm-Js", "kotlin-stdlib-wasm-js", setOf("wasmJsRuntimeClasspath"), wasmJsModule)
configureSbom("Wasm-Wasi", "kotlin-stdlib-wasm-wasi", setOf("wasmWasiRuntimeClasspath"), wasmWasiModule)
}
}
@@ -26,6 +26,30 @@
"sourceSet": [
"commonMain"
]
},
{
"name": "wasmJsApiElements",
"sourceSet": [
"commonMain"
]
},
{
"name": "wasmJsRuntimeElements",
"sourceSet": [
"commonMain"
]
},
{
"name": "wasmWasiApiElements",
"sourceSet": [
"commonMain"
]
},
{
"name": "wasmWasiRuntimeElements",
"sourceSet": [
"commonMain"
]
}
],
"sourceSets": [
@@ -35,7 +35,7 @@
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-wasm-js</artifactId>
<artifactId>kotlin-stdlib</artifactId>
<version>ArtifactsTest.version</version>
<scope>compile</scope>
</dependency>
@@ -35,7 +35,7 @@
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-wasm-wasi</artifactId>
<artifactId>kotlin-stdlib</artifactId>
<version>ArtifactsTest.version</version>
<scope>compile</scope>
</dependency>