From 2bc164c1b0f8e7cf9455d38230b4ffd662251ec2 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 11 Jun 2026 20:38:33 +0200 Subject: [PATCH] Extract widener definition into a widener.gradle.kts plugin --- BauSystem/BauSystem_Main/build.gradle.kts | 45 +---------- SpigotCore/SpigotCore_Main/build.gradle.kts | 45 +---------- buildSrc/{build.gradle => build.gradle.kts} | 23 +++--- .../groovy}/steamwar.devserver.gradle | 0 .../{ => main/groovy}/steamwar.java.gradle | 0 .../{ => main/groovy}/steamwar.kotlin.gradle | 0 buildSrc/src/main/kotlin/WidenerExtension.kt | 52 +++++++++++++ buildSrc/src/main/kotlin/widener.gradle.kts | 78 +++++++++++++++++++ 8 files changed, 148 insertions(+), 95 deletions(-) rename buildSrc/{build.gradle => build.gradle.kts} (82%) rename buildSrc/src/{ => main/groovy}/steamwar.devserver.gradle (100%) rename buildSrc/src/{ => main/groovy}/steamwar.java.gradle (100%) rename buildSrc/src/{ => main/groovy}/steamwar.kotlin.gradle (100%) create mode 100644 buildSrc/src/main/kotlin/WidenerExtension.kt create mode 100644 buildSrc/src/main/kotlin/widener.gradle.kts diff --git a/BauSystem/BauSystem_Main/build.gradle.kts b/BauSystem/BauSystem_Main/build.gradle.kts index f81b7614..7f5f9b18 100644 --- a/BauSystem/BauSystem_Main/build.gradle.kts +++ b/BauSystem/BauSystem_Main/build.gradle.kts @@ -19,6 +19,7 @@ plugins { steamwar.java + widener } tasks.compileJava { @@ -30,45 +31,6 @@ java { targetCompatibility = JavaVersion.VERSION_21 } -// ─── Collect all .accesswidener files from this plugin's resources ──────────── -val accessWidenerFiles: FileCollection = fileTree("src/") { - include("**/*.accesswidener") -} - -val paperJarProvider: Provider = provider { - val dep = libs.nms.get() - configurations["compileClasspath"].resolvedConfiguration.resolvedArtifacts.first { artifact -> - artifact.moduleVersion.id.module.group == dep.module.group && artifact.moduleVersion.id.module.name == dep.module.name - }.file -} - -// ─── Widen the Paper dev JAR so the IDE / javac see the patched access ──────── -val widenedJar by tasks.registering(JavaExec::class) { - description = "Produces a widened copy of the Paper dev JAR for compile-time use." - group = "widener" - - // Re-run whenever the .accesswidener files change - inputs.file(paperJarProvider) - inputs.files(accessWidenerFiles) - - val output = layout.buildDirectory.file("widened/paper-widened.jar") - outputs.file(output) - - classpath = project(":AccessWidener").tasks.named("shadowJar").get().outputs.files - - mainClass.set("de.steamwar.Main") - - doFirst { - args = buildList { - add(paperJarProvider.get().absolutePath) - add(output.get().asFile.absolutePath) - addAll(accessWidenerFiles.map { it.absolutePath }) - } - } - - dependsOn(":AccessWidener:shadowJar") -} - dependencies { compileOnly(libs.classindex) annotationProcessor(libs.classindex) @@ -79,7 +41,6 @@ dependencies { compileOnly(libs.paperapi) compileOnly(libs.nms) - compileOnly(files(widenedJar)) compileOnly(libs.fawe) compileOnly(libs.netty) @@ -88,6 +49,6 @@ dependencies { implementation(files("$projectDir/../libs/YAPION-SNAPSHOT.jar")) } -tasks.compileJava { - dependsOn(widenedJar) +widener { + fromCatalog(libs.nms) } diff --git a/SpigotCore/SpigotCore_Main/build.gradle.kts b/SpigotCore/SpigotCore_Main/build.gradle.kts index 34bc1d49..322b1046 100644 --- a/SpigotCore/SpigotCore_Main/build.gradle.kts +++ b/SpigotCore/SpigotCore_Main/build.gradle.kts @@ -19,6 +19,7 @@ plugins { steamwar.java + widener } tasks.compileJava { @@ -42,45 +43,6 @@ tasks.withType().configureEach { jvmArgs("--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED") } -// ─── Collect all .accesswidener files from this plugin's resources ──────────── -val accessWidenerFiles: FileCollection = fileTree("src/") { - include("**/*.accesswidener") -} - -val paperJarProvider: Provider = provider { - val dep = libs.nms.get() - configurations["compileClasspath"].resolvedConfiguration.resolvedArtifacts.first { artifact -> - artifact.moduleVersion.id.module.group == dep.module.group && artifact.moduleVersion.id.module.name == dep.module.name - }.file -} - -// ─── Widen the Paper dev JAR so the IDE / javac see the patched access ──────── -val widenedJar by tasks.registering(JavaExec::class) { - description = "Produces a widened copy of the Paper dev JAR for compile-time use." - group = "widener" - - // Re-run whenever the .accesswidener files change - inputs.file(paperJarProvider) - inputs.files(accessWidenerFiles) - - val output = layout.buildDirectory.file("widened/paper-widened.jar") - outputs.file(output) - - classpath = project(":AccessWidener").tasks.named("shadowJar").get().outputs.files - - mainClass.set("de.steamwar.Main") - - doFirst { - args = buildList { - add(paperJarProvider.get().absolutePath) - add(output.get().asFile.absolutePath) - addAll(accessWidenerFiles.map { it.absolutePath }) - } - } - - dependsOn(":AccessWidener:shadowJar") -} - dependencies { compileOnly(libs.classindex) annotationProcessor(libs.classindex) @@ -92,7 +54,6 @@ dependencies { compileOnly(libs.paperapi) compileOnly(libs.nms) - compileOnly(files(widenedJar)) compileOnly(libs.authlib) compileOnly(libs.datafixer) compileOnly(libs.netty) @@ -102,6 +63,6 @@ dependencies { implementation(libs.anvilgui) } -tasks.compileJava { - dependsOn(widenedJar) +widener { + fromCatalog(libs.nms) } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle.kts similarity index 82% rename from buildSrc/build.gradle rename to buildSrc/build.gradle.kts index e1ee5bb0..3df3ec61 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle.kts @@ -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") -} \ No newline at end of file +} diff --git a/buildSrc/src/steamwar.devserver.gradle b/buildSrc/src/main/groovy/steamwar.devserver.gradle similarity index 100% rename from buildSrc/src/steamwar.devserver.gradle rename to buildSrc/src/main/groovy/steamwar.devserver.gradle diff --git a/buildSrc/src/steamwar.java.gradle b/buildSrc/src/main/groovy/steamwar.java.gradle similarity index 100% rename from buildSrc/src/steamwar.java.gradle rename to buildSrc/src/main/groovy/steamwar.java.gradle diff --git a/buildSrc/src/steamwar.kotlin.gradle b/buildSrc/src/main/groovy/steamwar.kotlin.gradle similarity index 100% rename from buildSrc/src/steamwar.kotlin.gradle rename to buildSrc/src/main/groovy/steamwar.kotlin.gradle diff --git a/buildSrc/src/main/kotlin/WidenerExtension.kt b/buildSrc/src/main/kotlin/WidenerExtension.kt new file mode 100644 index 00000000..d0263567 --- /dev/null +++ b/buildSrc/src/main/kotlin/WidenerExtension.kt @@ -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 . + */ + +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) { + 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) + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/widener.gradle.kts b/buildSrc/src/main/kotlin/widener.gradle.kts new file mode 100644 index 00000000..71da2e8d --- /dev/null +++ b/buildSrc/src/main/kotlin/widener.gradle.kts @@ -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 . + */ + +val widener = extensions.create("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(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")) +}