diff --git a/build-support/src/main/kotlin/bom.kt b/build-support/src/main/kotlin/bom.kt new file mode 100644 index 0000000000..0918e01c13 --- /dev/null +++ b/build-support/src/main/kotlin/bom.kt @@ -0,0 +1,55 @@ +import java.util.Locale +import org.gradle.api.Project +import org.gradle.api.artifacts.dsl.DependencyConstraintHandler +import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.withType +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPluginWrapper +import org.jetbrains.kotlin.gradle.plugin.KotlinJsPluginWrapper +import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget + +/** + * Collect all the root project's multiplatform targets and add them to the BOM. + * + * Only published subprojects are included. + * + * This supports Kotlin/Multiplatform and Kotlin/JS subprojects. + */ +fun Project.collectBomConstraints() { + val bomConstraints: DependencyConstraintHandler = dependencies.constraints + rootProject.subprojects { + val subproject = this + + subproject.plugins.withId("com.vanniktech.maven.publish.base") { + subproject.plugins.withType { + bomConstraints.api(subproject) + } + + subproject.plugins.withType { + bomConstraints.api(subproject) + } + + subproject.plugins.withType { + subproject.extensions.getByType().targets.all { + bomConstraints.api(dependencyConstraint(this)) + } + } + } + } +} + +/** Returns a string like "com.squareup.okio:okio-iosarm64:3.4.0" for this target. */ +private fun Project.dependencyConstraint(target: KotlinTarget): String { + val artifactId = when (target) { + is KotlinMetadataTarget -> name + is KotlinJsTarget -> "$name-js" + else -> "$name-${target.targetName.toLowerCase(Locale.ROOT)}" + } + return "$group:$artifactId:$version" +} + +private fun DependencyConstraintHandler.api(constraintNotation: Any) = + add("api", constraintNotation) diff --git a/okio-assetfilesystem/build.gradle.kts b/okio-assetfilesystem/build.gradle.kts index a31f9e32f1..3851b47ebe 100644 --- a/okio-assetfilesystem/build.gradle.kts +++ b/okio-assetfilesystem/build.gradle.kts @@ -1,5 +1,4 @@ -import com.vanniktech.maven.publish.JavadocJar.Dokka -import com.vanniktech.maven.publish.KotlinMultiplatform +import com.vanniktech.maven.publish.AndroidSingleVariantLibrary import com.vanniktech.maven.publish.MavenPublishBaseExtension plugins { @@ -31,6 +30,6 @@ dependencies { configure { configure( - KotlinMultiplatform(javadocJar = Dokka("dokkaGfm")) + AndroidSingleVariantLibrary() ) } diff --git a/okio-bom/build.gradle.kts b/okio-bom/build.gradle.kts index cf940b6eb7..8417d7613e 100644 --- a/okio-bom/build.gradle.kts +++ b/okio-bom/build.gradle.kts @@ -3,16 +3,7 @@ plugins { id("java-platform") } -dependencies { - constraints { - api(projects.okio) - api(projects.okioFakefilesystem) - if (kmpJsEnabled) { - // No typesafe project accessor as the accessor won't exist if kmpJs is not enabled. - api(project(":okio-nodefilesystem")) - } - } -} +collectBomConstraints() extensions.configure { publications.create("maven", MavenPublication::class) {