From 9640e32483421d07649e8fc56da070fcf7292dfe Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Sat, 5 Aug 2023 08:55:51 +0200 Subject: [PATCH] [stdlib-mpp] Publish wasm artifacts through variants of stdlib KT-60909 --- build.gradle.kts | 2 - libraries/stdlib/build.gradle.kts | 107 ++++++++++++++---- .../kotlin-project-structure-metadata.json | 24 ++++ libraries/stdlib/wasm/js/build.gradle.kts | 22 ---- libraries/stdlib/wasm/wasi/build.gradle.kts | 22 ---- .../kotlin-stdlib-wasm-js.pom | 5 + .../kotlin-stdlib-wasm-wasi.pom | 5 + .../buildsrc-compat/src/main/kotlin/tasks.kt | 2 - .../src/main/kotlin/wasm/wasmStdLib.kt | 15 --- 9 files changed, 119 insertions(+), 85 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2014145b874..0a9d5a9bcf9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -325,8 +325,6 @@ extra["compilerArtifactsForIde"] = listOfNotNull( ":plugins:parcelize:parcelize-runtime", ":kotlin-stdlib-common", ":kotlin-stdlib", - ":kotlin-stdlib-wasm-js", - ":kotlin-stdlib-wasm-wasi", ":kotlin-test", ":kotlin-daemon", ":kotlin-compiler", diff --git a/libraries/stdlib/build.gradle.kts b/libraries/stdlib/build.gradle.kts index b9dc2985f96..47c513563f6 100644 --- a/libraries/stdlib/build.gradle.kts +++ b/libraries/stdlib/build.gradle.kts @@ -5,6 +5,7 @@ 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.tasks.UsesKotlinJavaToolchain import plugins.configureDefaultPublishing import plugins.configureKotlinPomAttributes @@ -23,9 +24,20 @@ description = "Kotlin Standard Library" configureJvmToolchain(JdkMajorVersion.JDK_1_8) -val configurationBuiltins = configurations.create("builtins") { - isCanBeResolved = true - isCanBeConsumed = false +fun resolvingConfiguration(name: String, configure: Action = Action {}) = + configurations.create(name) { + isCanBeResolved = true + isCanBeConsumed = false + configure(this) + } +fun outgoingConfiguration(name: String, configure: Action = Action {}) = + configurations.create(name) { + isCanBeResolved = false + isCanBeConsumed = true + configure(this) + } + +val configurationBuiltins = resolvingConfiguration("builtins") { attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR)) } dependencies { @@ -776,6 +788,49 @@ 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 ==== @@ -845,24 +900,6 @@ publishing { attribute(KotlinPlatformType.attribute, KotlinPlatformType.native) } } - // empty variant for wasm - // TODO: replace with wasm target - variant("wasmApiElements") { - 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(KotlinUsages.KOTLIN_API)) - attribute(KotlinPlatformType.attribute, KotlinPlatformType.wasm) - } - } - variant("wasmRuntimeElements") { - 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(KotlinUsages.KOTLIN_RUNTIME)) - attribute(KotlinPlatformType.attribute, KotlinPlatformType.wasm) - } - } } // we cannot publish legacy common artifact with metadata in kotlin-stdlib-common @@ -888,8 +925,27 @@ publishing { variant("jsSourcesElements") } + val wasmJs = module("wasmJsModule") { + mavenPublication { + artifactId = "$artifactBaseName-wasm-js" + configureKotlinPomAttributes(project, "Kotlin Standard Library for experimental WebAssembly JS platform", packaging = "klib") + } + variant("wasmJsApiElements") + variant("wasmJsRuntimeElements") + variant("wasmJsSourcesElements") + } + val wasmWasi = module("wasmWasiModule") { + mavenPublication { + artifactId = "$artifactBaseName-wasm-wasi" + configureKotlinPomAttributes(project, "Kotlin Standard Library for experimental WebAssembly WASI platform", packaging = "klib") + } + variant("wasmWasiApiElements") + variant("wasmWasiRuntimeElements") + variant("wasmWasiSourcesElements") + } + // Makes all variants from accompanying artifacts visible through `available-at` - rootModule.include(js) + rootModule.include(js, wasmJs, wasmWasi) } publications { @@ -897,6 +953,13 @@ publishing { val jsModule by existing(MavenPublication::class) configureSbom("Main", "kotlin-stdlib", setOf("jvmRuntimeClasspath"), rootModule) configureSbom("Js", "kotlin-stdlib-js", setOf("jsRuntimeClasspath"), jsModule) + + 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) } } diff --git a/libraries/stdlib/kotlin-project-structure-metadata.json b/libraries/stdlib/kotlin-project-structure-metadata.json index 446a7367558..c296890f46d 100644 --- a/libraries/stdlib/kotlin-project-structure-metadata.json +++ b/libraries/stdlib/kotlin-project-structure-metadata.json @@ -44,6 +44,30 @@ "sourceSet": [ "commonMain" ] + }, + { + "name": "wasmJsApiElements", + "sourceSet": [ + "commonMain" + ] + }, + { + "name": "wasmJsRuntimeElements", + "sourceSet": [ + "commonMain" + ] + }, + { + "name": "wasmWasiApiElements", + "sourceSet": [ + "commonMain" + ] + }, + { + "name": "wasmWasiRuntimeElements", + "sourceSet": [ + "commonMain" + ] } ], "sourceSets": [ diff --git a/libraries/stdlib/wasm/js/build.gradle.kts b/libraries/stdlib/wasm/js/build.gradle.kts index 370e4df9d03..b4694cace8c 100644 --- a/libraries/stdlib/wasm/js/build.gradle.kts +++ b/libraries/stdlib/wasm/js/build.gradle.kts @@ -23,25 +23,3 @@ configureWasmStdLib( ) { extensionBody -> kotlin(extensionBody) } - -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 { - 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 }}") - } - } - } - } -} \ No newline at end of file diff --git a/libraries/stdlib/wasm/wasi/build.gradle.kts b/libraries/stdlib/wasm/wasi/build.gradle.kts index 28aaab76131..4c6d6897e4d 100644 --- a/libraries/stdlib/wasm/wasi/build.gradle.kts +++ b/libraries/stdlib/wasm/wasi/build.gradle.kts @@ -21,25 +21,3 @@ configureWasmStdLib( ) { extensionBody -> kotlin(extensionBody) } - -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 { - 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 }}") - } - } - } - } -} \ No newline at end of file diff --git a/repo/artifacts-tests/src/test/resources/org/jetbrains/kotlin/kotlin-stdlib-wasm-js/kotlin-stdlib-wasm-js.pom b/repo/artifacts-tests/src/test/resources/org/jetbrains/kotlin/kotlin-stdlib-wasm-js/kotlin-stdlib-wasm-js.pom index 96692bef0ed..2bb650ec51d 100644 --- a/repo/artifacts-tests/src/test/resources/org/jetbrains/kotlin/kotlin-stdlib-wasm-js/kotlin-stdlib-wasm-js.pom +++ b/repo/artifacts-tests/src/test/resources/org/jetbrains/kotlin/kotlin-stdlib-wasm-js/kotlin-stdlib-wasm-js.pom @@ -1,6 +1,11 @@ + + + + + 4.0.0 org.jetbrains.kotlin kotlin-stdlib-wasm-js diff --git a/repo/artifacts-tests/src/test/resources/org/jetbrains/kotlin/kotlin-stdlib-wasm-wasi/kotlin-stdlib-wasm-wasi.pom b/repo/artifacts-tests/src/test/resources/org/jetbrains/kotlin/kotlin-stdlib-wasm-wasi/kotlin-stdlib-wasm-wasi.pom index 2bff4ba58fa..8f637b950ac 100644 --- a/repo/artifacts-tests/src/test/resources/org/jetbrains/kotlin/kotlin-stdlib-wasm-wasi/kotlin-stdlib-wasm-wasi.pom +++ b/repo/artifacts-tests/src/test/resources/org/jetbrains/kotlin/kotlin-stdlib-wasm-wasi/kotlin-stdlib-wasm-wasi.pom @@ -1,6 +1,11 @@ + + + + + 4.0.0 org.jetbrains.kotlin kotlin-stdlib-wasm-wasi diff --git a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt index 1515d566e07..88fc350ac41 100644 --- a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt +++ b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt @@ -64,8 +64,6 @@ val kotlinGradlePluginAndItsRequired = arrayOf( ":kotlin-stdlib", ":kotlin-stdlib-jdk7", ":kotlin-stdlib-jdk8", - ":kotlin-stdlib-wasm-js", - ":kotlin-stdlib-wasm-wasi", ":kotlin-dom-api-compat", ":examples:annotation-processor-example", ":kotlin-assignment-compiler-plugin.embeddable", diff --git a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/wasm/wasmStdLib.kt b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/wasm/wasmStdLib.kt index 4bb6fa1454f..86a5ed20a38 100644 --- a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/wasm/wasmStdLib.kt +++ b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/wasm/wasmStdLib.kt @@ -160,19 +160,4 @@ fun Project.configureWasmStdLib( tasks.named("compileTestDevelopmentExecutableKotlinWasm", KotlinJsIrLink::class.java) { kotlinOptions.freeCompilerArgs += listOf("-Xwasm-enable-array-range-checks") } - - val runtimeElements = configurations.create("runtimeElements") { } - - configurations.create("apiElements") { } - - publish(sbom = false) { - pom.packaging = "klib" - artifact(tasks.named("wasmJar")) { - extension = "klib" - } - } - - configureSbom( - gradleConfigurations = setOf(runtimeElements.name) - ) } \ No newline at end of file