From efea162372be99beb4de90929629c7ebccdb8d84 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Fri, 7 May 2021 13:34:51 +0200 Subject: build: Access version catalog from buildSrc This change adds a workaround to the build configuration so that we can access the version catalog from pre-compiled scripts in buildSrc. In this way, we can use the version catalog everywhere. This workaround is necessary until https://github.com/gradle/gradle/issues/15383 is fixed. --- buildSrc/src/main/kotlin/Libs.kt | 63 ++++++++++++++++++++ buildSrc/src/main/kotlin/ProjectExtensions.kt | 34 ----------- buildSrc/src/main/kotlin/Versions.kt | 69 ---------------------- .../main/kotlin/benchmark-conventions.gradle.kts | 9 +-- .../src/main/kotlin/kotlin-conventions.gradle.kts | 4 +- .../src/main/kotlin/testing-conventions.gradle.kts | 10 ++-- 6 files changed, 76 insertions(+), 113 deletions(-) create mode 100644 buildSrc/src/main/kotlin/Libs.kt delete mode 100644 buildSrc/src/main/kotlin/ProjectExtensions.kt delete mode 100644 buildSrc/src/main/kotlin/Versions.kt (limited to 'buildSrc/src/main') diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt new file mode 100644 index 00000000..9567845a --- /dev/null +++ b/buildSrc/src/main/kotlin/Libs.kt @@ -0,0 +1,63 @@ +/* + * MIT License + * + * Copyright (c) 2019 atlarge-research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import org.gradle.api.JavaVersion +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.kotlin.dsl.getByType +import kotlin.properties.ReadOnlyProperty + +/** + * This class makes the version catalog accessible for the build scripts until Gradle adds support for it. + * + * See https://github.com/gradle/gradle/issues/15383 + */ +@Suppress("UnstableApiUsage") +public class Libs(project: Project) { + /** + * The version catalog of the project. + */ + private val versionCatalog = project.extensions.getByType(VersionCatalogsExtension::class).named("libs") + + /** + * A delegate for obtaining configuration values from a [Project] instance. + */ + private fun lib(name: String? = null): ReadOnlyProperty = + ReadOnlyProperty { _, property -> get(name ?: property.name) } + + /** + * Obtain the version for the specified [dependency][name]. + */ + operator fun get(name: String): String { + val dep = versionCatalog.findDependency(name).get().get() + return "${dep.module.group}:${dep.module.name}:${dep.versionConstraint.displayName}" + } + + companion object { + /** + * The JVM version to target. + */ + val jvmTarget = JavaVersion.VERSION_1_8 + } +} diff --git a/buildSrc/src/main/kotlin/ProjectExtensions.kt b/buildSrc/src/main/kotlin/ProjectExtensions.kt deleted file mode 100644 index ddf643f6..00000000 --- a/buildSrc/src/main/kotlin/ProjectExtensions.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2021 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import org.gradle.api.Project -import org.gradle.kotlin.dsl.extra -import org.gradle.kotlin.dsl.provideDelegate - -/** - * Obtain the [Versions] object for the specified [Project] instance. - */ -val Project.versions: Versions - get() { - var versions: Versions? by rootProject.extra - return versions ?: Versions(rootProject).also { versions = it } - } diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt deleted file mode 100644 index bb187a40..00000000 --- a/buildSrc/src/main/kotlin/Versions.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2019 atlarge-research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import org.gradle.api.JavaVersion -import org.gradle.api.Project -import org.gradle.kotlin.dsl.extra -import kotlin.properties.ReadOnlyProperty - -/** - * This class contains the versions of the dependencies shared by the different - * subprojects. - */ -public class Versions(private val project: Project) { - /** - * A delegate for obtaining configuration values from a [Project] instance. - */ - private fun version(name: String? = null): ReadOnlyProperty = - ReadOnlyProperty { _, property -> get(name ?: property.name) } - - val junitJupiter by version(name = "junit-jupiter") - val junitPlatform by version(name = "junit-platform") - val mockk by version() - - val slf4j by version() - val kotlinLogging by version(name = "kotlin-logging") - val log4j by version() - val config by version() - - val kotlinxCoroutines by version(name = "kotlinx-coroutines") - - val otelApi by version(name = "opentelemetry-api") - val otelApiMetrics by version(name = "opentelemetry-api-metrics") - val otelSdk by version(name = "opentelemetry-sdk") - val otelSdkMetrics by version(name = "opentelemetry-sdk-metrics") - - - /** - * Obtain the version for the specified [dependency][name]. - */ - operator fun get(name: String) = project.extra.get("$name.version") as String - - companion object { - /** - * The JVM version to target. - */ - val jvmTarget = JavaVersion.VERSION_1_8 - } -} diff --git a/buildSrc/src/main/kotlin/benchmark-conventions.gradle.kts b/buildSrc/src/main/kotlin/benchmark-conventions.gradle.kts index 8623e8da..4e73d4d3 100644 --- a/buildSrc/src/main/kotlin/benchmark-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/benchmark-conventions.gradle.kts @@ -55,13 +55,14 @@ benchmark { } } +dependencies { + val libs = Libs(project) + implementation(libs["kotlinx-benchmark-runtime-jvm"]) +} + // Workaround for https://github.com/Kotlin/kotlinx-benchmark/issues/39 afterEvaluate { tasks.named("jmhBenchmarkJar") { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } } - -dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-benchmark-runtime-jvm:0.3.0") -} diff --git a/buildSrc/src/main/kotlin/kotlin-conventions.gradle.kts b/buildSrc/src/main/kotlin/kotlin-conventions.gradle.kts index 7bab52fc..703e9938 100644 --- a/buildSrc/src/main/kotlin/kotlin-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/kotlin-conventions.gradle.kts @@ -34,11 +34,11 @@ repositories { } java { - sourceCompatibility = Versions.jvmTarget + sourceCompatibility = Libs.jvmTarget } tasks.withType().configureEach { - kotlinOptions.jvmTarget = Versions.jvmTarget.toString() + kotlinOptions.jvmTarget = Libs.jvmTarget.toString() kotlinOptions.useIR = true kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn" } diff --git a/buildSrc/src/main/kotlin/testing-conventions.gradle.kts b/buildSrc/src/main/kotlin/testing-conventions.gradle.kts index f129c282..7d344500 100644 --- a/buildSrc/src/main/kotlin/testing-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/testing-conventions.gradle.kts @@ -34,8 +34,10 @@ tasks.test { } dependencies { - testImplementation("org.junit.jupiter:junit-jupiter-api:${versions.junitJupiter}") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${versions.junitJupiter}") - testImplementation("org.junit.jupiter:junit-jupiter-params:${versions.junitJupiter}") - testImplementation("io.mockk:mockk:${versions.mockk}") + val libs = Libs(project) + + testImplementation(libs["junit-jupiter-api"]) + testImplementation(libs["junit-jupiter-params"]) + testImplementation(libs["mockk"]) + testRuntimeOnly(libs["junit-jupiter-engine"]) } -- cgit v1.2.3