Skip to content

Commit

Permalink
Sweet BOM collections
Browse files Browse the repository at this point in the history
  • Loading branch information
oldergod committed Jul 7, 2023
1 parent 5b80838 commit b572868
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 22 deletions.
24 changes: 24 additions & 0 deletions build-logic/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,30 @@ buildscript {
}
}

plugins {
`kotlin-dsl`
`java-gradle-plugin`
}

repositories {
mavenCentral()
}

dependencies {
add("compileOnly", kotlin("gradle-plugin"))
add("compileOnly", kotlin("gradle-plugin-api"))
implementation(libs.pluginz.kotlin)
}

gradlePlugin {
plugins {
create("com.squareup.wire.build.logic") {
id = "build-logic"
implementationClass = "BuildLogic"
}
}
}

rootProject.plugins.withType(NodeJsRootPlugin::class) {
// 16+ required for Apple Silicon support
// https://youtrack.jetbrains.com/issue/KT-49109#focus=Comments-27-5259190.0-0
Expand Down
23 changes: 23 additions & 0 deletions build-logic/src/main/kotlin/BuildLogic.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* Copyright (C) 2023 Square, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.gradle.api.Plugin
import org.gradle.api.Project

class BuildLogic : Plugin<Project> {
override fun apply(project: Project) {
// Do nothing.
}
}
70 changes: 70 additions & 0 deletions build-logic/src/main/kotlin/bom.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Copyright (C) 2023 Square, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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<KotlinAndroidPluginWrapper> {
bomConstraints.api(subproject)
}

subproject.plugins.withType<KotlinJsPluginWrapper> {
bomConstraints.api(subproject)
}

subproject.plugins.withType<KotlinMultiplatformPluginWrapper> {
subproject.extensions.getByType<KotlinMultiplatformExtension>().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)
24 changes: 2 additions & 22 deletions wire-bom/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,30 +1,10 @@
plugins {
id("com.vanniktech.maven.publish.base")
id("java-platform")
id("com.squareup.wire.build.logic")
}

dependencies {
constraints {
api(projects.wireCompiler)
api(projects.wireGradlePlugin)
api(projects.wireGrpcClient)
api(projects.wireGrpcClient.group + ":wire-grpc-client-jvm:" + projects.wireGrpcClient.version)
api(projects.wireGrpcServer)
api(projects.wireGrpcServerGenerator)
api(projects.wireGrpcMockwebserver)
api(projects.wireGsonSupport)
api(projects.wireJavaGenerator)
api(projects.wireKotlinGenerator)
api(projects.wireMoshiAdapter)
api(projects.wireReflector)
api(projects.wireRuntime)
api(projects.wireRuntime.group + ":wire-runtime-jvm:" + projects.wireRuntime.version)
api(projects.wireSchema)
api(projects.wireSchema.group + ":wire-schema-jvm:" + projects.wireSchema.version)
api(projects.wireSchemaTests)
api(projects.wireSwiftGenerator)
}
}
collectBomConstraints()

extensions.configure<PublishingExtension> {
publications.create("maven", MavenPublication::class) {
Expand Down

0 comments on commit b572868

Please sign in to comment.