Extract widener definition into a widener.gradle.kts plugin

This commit is contained in:
2026-06-11 20:38:33 +02:00
parent aa66b3dc83
commit 2bc164c1b0
8 changed files with 148 additions and 95 deletions
@@ -1,7 +1,7 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2025 SteamWar.de-Serverteam
* Copyright (C) 2026 SteamWar.de-Serverteam
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
@@ -18,21 +18,22 @@
*/
plugins {
id 'groovy-gradle-plugin'
}
sourceSets {
main {
groovy {
srcDirs("src/")
}
}
`kotlin-dsl`
`groovy-gradle-plugin`
}
repositories {
mavenCentral()
gradlePluginPortal()
}
sourceSets {
main {
groovy.srcDirs("src/main/groovy")
kotlin.srcDirs("src/main/kotlin")
}
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.21")
}
}
@@ -0,0 +1,52 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 SteamWar.de-Serverteam
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import org.gradle.api.Project
import org.gradle.api.artifacts.MinimalExternalModuleDependency
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.provider.Provider
import javax.inject.Inject
abstract class WidenerExtension {
@get:Inject
abstract val project: Project
abstract val inputJars: ConfigurableFileCollection
abstract val accessWidenerFiles: ConfigurableFileCollection
fun fromCatalog(vararg dependencies: Provider<MinimalExternalModuleDependency>) {
val files = dependencies.map { dependency ->
project.provider {
val dep = dependency.get()
project.configurations.getByName("compileClasspath")
.resolvedConfiguration
.resolvedArtifacts
.first {
it.moduleVersion.id.module.group == dep.module.group &&
it.moduleVersion.id.module.name == dep.module.name
}
.file
}
}
inputJars.from(files)
}
}
@@ -0,0 +1,78 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 SteamWar.de-Serverteam
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
val widener = extensions.create<WidenerExtension>("widener")
widener.accessWidenerFiles.setFrom(
fileTree("src/") { include("**/*.accesswidener") }
)
// ─── Tasks (unchanged from before) ───────────────────────────────────────────
val jarWidenerClasspath = rootProject.project(":AccessWidener")
.tasks.named("shadowJar")
.get().outputs.files
val allWidenedJars = objects.fileCollection()
project.gradle.projectsEvaluated {
if (widener.inputJars.isEmpty) {
logger.warn("[widener] No input JARs configured for ${project.name} — widenedJar tasks will not be registered.")
return@projectsEvaluated
}
widener.inputJars.forEachIndexed { index, inputJar ->
val taskName = if (index == 0) "widenedJar" else "widenedJar$index"
val outputFile = layout.buildDirectory
.file("widened/${inputJar.nameWithoutExtension}-widened.jar")
val task = tasks.register<JavaExec>(taskName) {
description = "Produces a widened copy of ${inputJar.name} for compile-time use."
group = "widener"
inputs.file(inputJar)
inputs.files(widener.accessWidenerFiles)
outputs.file(outputFile)
classpath = jarWidenerClasspath
mainClass.set("de.steamwar.Main")
dependsOn(rootProject.project(":AccessWidener").tasks.named("shadowJar"))
doFirst {
args = buildList {
add(inputJar.absolutePath)
add(outputFile.get().asFile.absolutePath)
addAll(widener.accessWidenerFiles.map { it.absolutePath })
}
}
}
allWidenedJars.from(task)
}
tasks.named("compileJava") {
// dependsOn(allWidenedJars.buildDependencies)
dependsOn(allWidenedJars)
}
}
project.dependencies {
add("compileOnly", project.fileTree("build/widened"))
}