Files
pkl/pkl-config-kotlin/pkl-config-kotlin.gradle.kts
odenix 4faf35a66a Gradle: Replace legacy buildSrc mechanism with included build (#1524)
Motivation:
buildSrc is a special-case legacy mechanism.
Gradle recommends using an included build named build-logic instead:

https://docs.gradle.org/current/userguide/best_practices_structuring_builds.html#favor_composite_builds

Changes:
- Rename buildSrc/ to build-logic/
  - triggers reformatting
- Replace occurrences of "buildSrc" with "build-logic"
- Include the build-logic build in the main build (via
settings.gradle.kts)
- Apply convention plugins via plugin IDs instead of type-safe accessors
  - small tradeoff compared to buildSrc

Result:
- Faster and more isolated builds
- Build logic behaves like a normal build, making it easier to evolve
and reason about

---------

Co-authored-by: Daniel Chao <dan.chao@apple.com>
2026-04-15 21:37:10 -07:00

111 lines
3.9 KiB
Kotlin

/*
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* 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
*
* https://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.
*/
plugins {
id("pklAllProjects")
id("pklKotlinLibrary")
id("pklPublishLibrary")
}
val pklConfigJava: Configuration by configurations.creating
val pklConfigJavaAll: Configuration by configurations.creating
val pklCodegenKotlin: Configuration by configurations.creating
val buildInfo = project.extensions.getByType<BuildInfo>()
dependencies {
pklCodegenKotlin(projects.pklCodegenKotlin)
implementation(libs.kotlinReflect)
implementation(libs.msgpack)
// Don't declare a runtime dependency to pkl-config-java because Gradle cannot resolve
// the correct publication (library vs fatJar) when generating the POM.
// We add the dependency manually to the POM later.
//
// Avoids this error during publish:
//
// > Failed to query the value of property 'dependencies'.
// > Publishing is not able to resolve a dependency on a project with multiple publications that
// have different coordinates.
// Found the following publications in project ':pkl-config-java':
// - Maven publication 'fatJar' with coordinates org.pkl-lang:pkl-config-java-all:0.30.0-SNAPSHOT
// - Maven publication 'library' with coordinates org.pkl-lang:pkl-config-java:0.30.0-SNAPSHOT
compileOnly(projects.pklConfigJava)
testImplementation(projects.pklConfigJava)
testImplementation(libs.geantyref)
}
val generateTestConfigClasses by
tasks.registering(JavaExec::class) {
val outputDir = layout.buildDirectory.dir("testConfigClasses")
outputs.dir(outputDir)
inputs.dir("src/test/resources/codegenPkl")
classpath = pklCodegenKotlin
mainClass.set("org.pkl.codegen.kotlin.Main")
argumentProviders.add(
CommandLineArgumentProvider {
listOf("--output-dir", outputDir.get().asFile.absolutePath) +
fileTree("src/test/resources/codegenPkl").map { it.absolutePath }
}
)
}
sourceSets.getByName("test") {
java.srcDir(layout.buildDirectory.dir("testConfigClasses/kotlin"))
resources.srcDir(layout.buildDirectory.dir("testConfigClasses/resources"))
}
tasks.processTestResources { dependsOn(generateTestConfigClasses) }
tasks.compileTestKotlin { dependsOn(generateTestConfigClasses) }
// disable publishing of .module until we find a way to manipulate it like POM (or ideally both
// together)
tasks.withType<GenerateModuleMetadata> { enabled = false }
publishing {
publications {
named<MavenPublication>("library") {
pom {
url.set("https://github.com/apple/pkl/tree/main/pkl-config-kotlin")
description.set(
"Kotlin extensions for pkl-config-java, a Java config library based on the Pkl config language."
)
// Modify POM and add pkl-config-java-all dependency
withXml {
val dependenciesNode = asNode().get("dependencies") as groovy.util.NodeList
val dependencies =
if (dependenciesNode.isNotEmpty()) {
dependenciesNode[0] as groovy.util.Node
} else {
asNode().appendNode("dependencies")
}
dependencies.appendNode("dependency").apply {
appendNode("groupId", "org.pkl-lang")
appendNode("artifactId", "pkl-config-java-all")
appendNode("version", project.version)
appendNode("scope", "runtime")
}
}
}
}
}
}