From 1b6d7b6621ef2184c9fc72922bab9ad8be66b0d4 Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 15 Dec 2025 08:37:51 +0100 Subject: [PATCH 1/8] Create gradle.properties --- de.peeeq.wurstscript/gradle.properties | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 de.peeeq.wurstscript/gradle.properties diff --git a/de.peeeq.wurstscript/gradle.properties b/de.peeeq.wurstscript/gradle.properties new file mode 100644 index 000000000..1512f4c03 --- /dev/null +++ b/de.peeeq.wurstscript/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.caching=true +org.gradle.configuration-cache=true +org.gradle.parallel=true +org.gradle.daemon=true From 13fc823b6a4c11ed7130f2edb4d03954db616362 Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 15 Dec 2025 08:49:16 +0100 Subject: [PATCH 2/8] cache friendly gradle tasks --- de.peeeq.wurstscript/build.gradle | 94 ++++++++++++++++++------------- 1 file changed, 54 insertions(+), 40 deletions(-) diff --git a/de.peeeq.wurstscript/build.gradle b/de.peeeq.wurstscript/build.gradle index 96f992f7b..47455ffb2 100644 --- a/de.peeeq.wurstscript/build.gradle +++ b/de.peeeq.wurstscript/build.gradle @@ -120,68 +120,82 @@ def parseqFiles = fileTree(dir: 'parserspec', include: '*.parseq') def pkgPattern = Pattern.compile(/package\s+(\S+)\s*;/) -tasks.register('genAst') { - // make it incremental/cacheable - inputs.files(parseqFiles) - outputs.dir(genDir) +// resolve once at configuration time +def genDirFile = file(genDir) +def astgenCp = configurations.astgen +def pkgPatternLocal = pkgPattern + +def perFileTasks = [] + +parseqFiles.files.each { File f -> + // determine package at configuration time (same logic you had) + String contents = f.getText('UTF-8') + def m = pkgPatternLocal.matcher(contents) + String pkg = m.find() ? m.group(1) : "" + File targetDir = new File(genDirFile, pkg.replace('.', '/')) + + def t = tasks.register("genAst_${f.name.replaceAll(/[^A-Za-z0-9_]/, '_')}", JavaExec) { + // incremental + cache correctness for the generator + inputs.file(f) + inputs.files(astgenCp).withPropertyName("astgenClasspath") + outputs.dir(targetDir) + + classpath = astgenCp + mainClass.set("asg.Main") + args(f.absolutePath, targetDir.absolutePath) + + // optional: ensure target dir exists + doFirst { targetDir.mkdirs() } + } - doLast { - // fetch ExecOperations from Gradle services (no @Inject needed) - ExecOperations execOps = project.services.get(ExecOperations) + perFileTasks << t +} - parseqFiles.files.each { File f -> - String contents = f.getText('UTF-8') - def m = pkgPattern.matcher(contents) - String pkg = m.find() ? m.group(1) : "" - File targetDir = file("$genDir/${pkg.replace('.', '/')}") +tasks.register("genAst") { + inputs.files(parseqFiles) + outputs.dir(genDirFile) + dependsOn(perFileTasks) +} - targetDir.mkdirs() - // run: asg.Main using isolated classpath - execOps.javaexec { - classpath = configurations.astgen - mainClass.set('asg.Main') - args(f.absolutePath, targetDir.absolutePath) - } - } - } -} /** -------- Version info file generation -------- */ tasks.register('versionInfoFile') { description "Generates a file CompileTimeInfo.java with version number etc." - // resolve git info at configuration time - Git git = Git.open(new File(rootProject.projectDir, '..')) - ObjectId head = git.getRepository().resolve(Constants.HEAD) - String gitRevision = head.abbreviate(8).name() - String gitRevisionlong = head.getName() - String tag = git.describe().setTarget(head).setAlways(true).setTags(true).call() - String wurstVersion = "${version}-${tag}" - - inputs.property("wurstVersion", wurstVersion) + def repoDir = new File(rootProject.projectDir, '..') def dir = new File("$genDir/de/peeeq/wurstscript/") def out = new File(dir, 'CompileTimeInfo.java') outputs.file(out) + // capture at configuration time (no Task.project usage later) + def versionString = project.version.toString() + doLast { + def rev8 = ["git", "rev-parse", "--short=8", "HEAD"].execute(null, repoDir).text.trim() + def revLong = ["git", "rev-parse", "HEAD"].execute(null, repoDir).text.trim() + def tag = ["git", "describe", "--tags", "--always", "--dirty"].execute(null, repoDir).text.trim() + + def wurstVersion = "${versionString}-${tag}" + def currentTime = new Date().format("yyyy/MM/dd KK:mm:ss") + dir.mkdirs() - String currentTime = new Date().format("yyyy/MM/dd KK:mm:ss") out.text = """ - package de.peeeq.wurstscript; +package de.peeeq.wurstscript; - public class CompileTimeInfo { - public static final String time="${currentTime}"; - public static final String revision="${gitRevision}"; - public static final String revisionLong="${gitRevisionlong}"; - public static final String version="${wurstVersion}"; - } - """ +public class CompileTimeInfo { + public static final String time="${currentTime}"; + public static final String revision="${rev8}"; + public static final String revisionLong="${revLong}"; + public static final String version="${wurstVersion}"; +} +""" } } + /** -------- Aggregate generation + wiring into compile -------- */ tasks.register('gen') { From a4ad554821bdd26c8d00e0f9c211c913eadb8014 Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 15 Dec 2025 09:00:43 +0100 Subject: [PATCH 3/8] cache friendly deploy scripts --- de.peeeq.wurstscript/build.gradle | 1 + de.peeeq.wurstscript/deploy.gradle | 222 ++++++++++++++++------------- 2 files changed, 122 insertions(+), 101 deletions(-) diff --git a/de.peeeq.wurstscript/build.gradle b/de.peeeq.wurstscript/build.gradle index 47455ffb2..e68f8c683 100644 --- a/de.peeeq.wurstscript/build.gradle +++ b/de.peeeq.wurstscript/build.gradle @@ -3,6 +3,7 @@ buildscript { dependencies { // used at configuration-time for version info classpath 'org.eclipse.jgit:org.eclipse.jgit:5.7.+' + classpath "javax.inject:javax.inject:1" } } diff --git a/de.peeeq.wurstscript/deploy.gradle b/de.peeeq.wurstscript/deploy.gradle index 50cf5c831..a10a61bba 100644 --- a/de.peeeq.wurstscript/deploy.gradle +++ b/de.peeeq.wurstscript/deploy.gradle @@ -1,4 +1,5 @@ import org.gradle.internal.os.OperatingSystem +import javax.inject.Inject // ----------------------- Publishing (kept from your original) ----------------------- publishing { @@ -17,147 +18,171 @@ publishing { } } +// ----------------------- Common providers/locations --------------------------------- +def os = OperatingSystem.current() +def arch = System.getProperty("os.arch") // "amd64"/"x86_64"/"aarch64" -def toolJavaHome = { - def svc = project.extensions.getByType(JavaToolchainService) - def launcher = svc.launcherFor(project.java.toolchain) - launcher.get().metadata.installationPath.asFile -} - -def toolExecutable = { String toolName -> - def javaHome = System.getenv('JAVA_HOME') ? new File(System.getenv('JAVA_HOME')) : toolJavaHome() - def ext = OperatingSystem.current().isWindows() ? ".exe" : "" - new File(javaHome, "bin/${toolName}${ext}").absolutePath -} +def plat = os.isWindows() ? "win-x64" + : os.isMacOsX() ? (arch == "aarch64" ? "macos-arm64" : "macos-x64") + : "linux-x64" - -// ----------------------- Common providers/locations --------------------------------- -def fatJar = tasks.named('shadowJar').flatMap { it.archiveFile } +// Capture project version at configuration time (avoid Task.project at execution) +def versionString = project.version.toString() // Allow adding modules if reflection/ServiceLoader pulls them in: // ./gradlew jlinkRuntime25 -PextraJdkModules=java.desktop,jdk.crypto.ec -def extraJdkModules = (project.findProperty("extraJdkModules") ?: "").toString().trim() +def extraJdkModulesProvider = providers.gradleProperty("extraJdkModules").orElse("") -def jlinkWorkDir = layout.buildDirectory.dir("jlink") -def modulesTxt = jlinkWorkDir.map { it.file("modules.txt") } -def jreImageDir = layout.buildDirectory.dir("jre-wurst-25") +def fatJar = tasks.named('shadowJar').flatMap { it.archiveFile } -def os = OperatingSystem.current() -def arch = System.getProperty("os.arch") // "amd64"/"x86_64"/"aarch64" -def plat = os.isWindows() ? "win-x64" - : os.isMacOsX() ? (arch == "aarch64" ? "macos-arm64" : "macos-x64") - : "linux-x64" +def jlinkWorkDir = layout.buildDirectory.dir("jlink") +def modulesRawTxt = jlinkWorkDir.map { it.file("modules.raw.txt") } +def modulesTxt = jlinkWorkDir.map { it.file("modules.txt") } +def jreImageDir = layout.buildDirectory.dir("jre-wurst-25") def distRoot = layout.buildDirectory.dir("dist/slim-${plat}") def releasesDir = layout.buildDirectory.dir("releases") +// ----------------------- Toolchain / tool paths (providers) ------------------------- +def toolchainSvc = extensions.getByType(JavaToolchainService) +def launcherProvider = toolchainSvc.launcherFor(java.toolchain) + +// Prefer JAVA_HOME if set, otherwise toolchain +def javaHomeProvider = + providers.environmentVariable("JAVA_HOME") + .map { new File(it) } // <-- no file() + .orElse(launcherProvider.map { it.metadata.installationPath.asFile }) + +def jdepsPathProvider = javaHomeProvider.map { home -> + new File(home, "bin/jdeps${os.isWindows() ? '.exe' : ''}").absolutePath +} +def jlinkPathProvider = javaHomeProvider.map { home -> + new File(home, "bin/jlink${os.isWindows() ? '.exe' : ''}").absolutePath +} +def jmodsDirProvider = javaHomeProvider.map { home -> + new File(home, "jmods").absolutePath +} + // ----------------------- Tasks: jdeps → jlink → assemble → package ------------------ -// 1) Detect JDK modules via jdeps (from the fat jar) -tasks.register("jdepsModules") { - description = "Detects required JDK modules for the fat compiler.jar via jdeps" - group = "distribution" +// 1) Run jdeps and capture raw module deps - inputs.file(fatJar) - outputs.file(modulesTxt) +abstract class JdepsRawTask extends DefaultTask { + @Inject abstract ExecOperations getExecOps() - doLast { - ExecOperations execOps = project.services.get(ExecOperations) - def jdeps = toolExecutable("jdeps") - def outBuf = new ByteArrayOutputStream() + @InputFile + abstract RegularFileProperty getInputJar() - modulesTxt.get().asFile.parentFile.mkdirs() + @Input + abstract Property getJdepsPath() + + @OutputFile + abstract RegularFileProperty getOutFile() + @TaskAction + void runJdeps() { + outFile.get().asFile.parentFile.mkdirs() + + def outBuf = new ByteArrayOutputStream() execOps.exec { - commandLine jdeps, - "--multi-release", "25", + executable = jdepsPath.get() + args "--multi-release", "25", "--ignore-missing-deps", "--print-module-deps", - fatJar.get().asFile.absolutePath + "--ignore-missing-deps", + inputJar.get().asFile.absolutePath standardOutput = outBuf } + outFile.get().asFile.text = outBuf.toString("UTF-8").trim() + "\n" + } +} + +def fatJarProvider = tasks.named("shadowJar").flatMap { it.archiveFile } // Provider - def detected = outBuf.toString().trim() - if (detected.isEmpty()) detected = "java.base" +tasks.register("jdepsRaw", JdepsRawTask) { + group = "distribution" + description = "Runs jdeps and writes raw module deps to a file." + dependsOn("shadowJar") + + // IMPORTANT: RegularFileProperty expects a Provider + inputJar.set(fatJarProvider) + + jdepsPath.set(jdepsPathProvider) // Provider + outFile.set(modulesRawTxt) // Provider +} + + +// 1b) Normalize jdeps output into modules.txt (add jdwp + extra modules) +tasks.register("jdepsModules") { + description = "Detects required JDK modules for the fat compiler.jar via jdeps" + group = "distribution" + + dependsOn("jdepsRaw") + + inputs.file(modulesRawTxt) + inputs.property("extraJdkModules", extraJdkModulesProvider) + outputs.file(modulesTxt) + + // capture provider values at configuration time (avoid Task.project at execution) + def extraMods = extraJdkModulesProvider.get().toString().trim() + + doLast { + def raw = modulesRawTxt.get().asFile.text.trim() + def detected = raw.isEmpty() ? "java.base" : raw def jdwpModule = "jdk.jdwp.agent" if (!detected.split(",").contains(jdwpModule)) { detected = detected + "," + jdwpModule } + if (!extraMods.isEmpty()) { + detected = detected + "," + extraMods + } - if (!extraJdkModules.isEmpty()) detected = detected + "," + extraJdkModules - + modulesTxt.get().asFile.parentFile.mkdirs() modulesTxt.get().asFile.text = detected logger.lifecycle("[jdeps] Using modules: ${detected}") } } -// 2) Build slim runtime with jlink (overwrite if exists) -// 2) Build slim runtime with jlink (overwrite if exists) -tasks.register("jlinkRuntime25") { +// 2) Build slim runtime with jlink (output dir must not exist) +tasks.register("jlinkRuntime25", Exec) { description = "Builds a slim Java 25 runtime image containing only the needed modules" group = "distribution" - dependsOn("shadowJar", "jdepsModules") + + dependsOn("jdepsModules") inputs.file(modulesTxt) + inputs.property("javaHome", javaHomeProvider) + inputs.property("jmodsDir", jmodsDirProvider) outputs.dir(jreImageDir) - doLast { - ExecOperations execOps = project.services.get(ExecOperations) - - // Resolve Java home from toolchain (fallback to JAVA_HOME if set) - def svc = project.extensions.getByType(JavaToolchainService) - def launcher = svc.launcherFor(project.java.toolchain) - File javaHome = System.getenv('JAVA_HOME') ? new File(System.getenv('JAVA_HOME')) : launcher.get().metadata.installationPath.asFile - - def jlink = new File(javaHome, "bin/${OperatingSystem.current().isWindows() ? 'jlink.exe' : 'jlink'}").absolutePath - def jmodsDir = new File(javaHome, "jmods").absolutePath - def mods = modulesTxt.get().asFile.text.trim() - def outDir = jreImageDir.get().asFile - + doFirst { + def mods = modulesTxt.get().asFile.text.trim() if (!mods) throw new GradleException("No modules detected for jlink.") - // jlink requires the output dir to NOT exist + def outDir = jreImageDir.get().asFile if (outDir.exists()) { - project.delete(outDir) + outDir.deleteDir() // no project access } outDir.parentFile.mkdirs() - logger.lifecycle("[jlink] Using: ${jlink}") - logger.lifecycle("[jlink] JAVA_HOME: ${javaHome}") - logger.lifecycle("[jlink] jmods: ${jmodsDir}") + logger.lifecycle("[jlink] Using: ${jlinkPathProvider.get()}") + logger.lifecycle("[jlink] JAVA_HOME: ${javaHomeProvider.get()}") + logger.lifecycle("[jlink] jmods: ${jmodsDirProvider.get()}") logger.lifecycle("[jlink] Modules: ${mods}") - def errBuf = new ByteArrayOutputStream() - def outBuf = new ByteArrayOutputStream() - - def result = execOps.exec { - commandLine jlink, - "--verbose", - "--module-path", jmodsDir, - "--add-modules", mods, - "--no-header-files", - "--no-man-pages", - "--strip-debug", - "--compress=zip-6", - "--output", outDir.absolutePath - errorOutput = errBuf - standardOutput = outBuf - ignoreExitValue = true - } - - if (result.exitValue != 0) { - logger.lifecycle("[jlink][stdout]\n${outBuf.toString()}") - logger.error("[jlink][stderr]\n${errBuf.toString()}") - throw new GradleException("jlink failed with exit ${result.exitValue}") - } - - logger.lifecycle("[jlink] Runtime created at: ${outDir}") + executable = jlinkPathProvider.get() + args "--verbose", + "--module-path", jmodsDirProvider.get(), + "--add-modules", mods, + "--no-header-files", + "--no-man-pages", + "--strip-debug", + "--compress=zip-6", + "--output", outDir.absolutePath } } - - // 3) Assemble folder layout: jre + compiler.jar (no manifest) tasks.register("assembleSlimCompilerDist", Copy) { description = "Assembles dist folder with slim JRE and compiler.jar (no manifest)." @@ -173,16 +198,15 @@ tasks.register("assembleSlimCompilerDist", Copy) { } } +// Add launch scripts tasks.named("assembleSlimCompilerDist", Copy) { t -> if (os.isWindows()) { from("../Wurstpack/wurstscript/wurstscript.cmd") { into(".") } - from("../Wurstpack/wurstscript/wurstscript") { into(".") } - from("../Wurstpack/wurstscript/grill.cmd") { into(".") } - from("../Wurstpack/wurstscript/grill") { into(".") } + from("../Wurstpack/wurstscript/wurstscript") { into(".") } + from("../Wurstpack/wurstscript/grill.cmd") { into(".") } + from("../Wurstpack/wurstscript/grill") { into(".") } } else { - from("../Wurstpack/wurstscript/wurstscript") { - into(".") - } + from("../Wurstpack/wurstscript/wurstscript") { into(".") } } } @@ -190,12 +214,11 @@ tasks.named("assembleSlimCompilerDist", Copy) { t -> tasks.register("packageSlimCompilerDistZip", Zip) { description = "Packages slim dist as a ZIP archive (all platforms)." group = "distribution" - enabled = true dependsOn("assembleSlimCompilerDist") from(distRoot) destinationDirectory.set(releasesDir) - archiveFileName.set("wurst-compiler-${project.version}-${plat}.zip") + archiveFileName.set("wurst-compiler-${versionString}-${plat}.zip") } // OS-aware convenience wrapper now just points to ZIP @@ -204,6 +227,3 @@ tasks.register("packageSlimCompilerDist") { group = "distribution" dependsOn("packageSlimCompilerDistZip") } - - - From f1ac2a31dc072a8d208135eb3c88b1cf300ad7cf Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 15 Dec 2025 09:30:14 +0100 Subject: [PATCH 4/8] Update build.gradle --- de.peeeq.wurstscript/build.gradle | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/de.peeeq.wurstscript/build.gradle b/de.peeeq.wurstscript/build.gradle index e68f8c683..a00e78602 100644 --- a/de.peeeq.wurstscript/build.gradle +++ b/de.peeeq.wurstscript/build.gradle @@ -43,16 +43,18 @@ jacoco { toolVersion = "0.8.13" } -jacocoTestReport { - dependsOn test +tasks.named("jacocoTestReport", JacocoReport) { + dependsOn(tasks.named("test")) + reports { xml.required.set(true) } - afterEvaluate { - classDirectories.setFrom(files(classDirectories.files.collect { - fileTree(dir: it, exclude: [ - '**/ast/**', '**/jassAst/**', '**/jassIm/**', '**/luaAst/**', '**/antlr/**' - ]) - })) - } + + def excluded = ['**/ast/**', '**/jassAst/**', '**/jassIm/**', '**/luaAst/**', '**/antlr/**'] + + classDirectories.setFrom( + files(classDirectories.files.collect { dir -> + fileTree(dir: dir, exclude: excluded) + }) + ) } def genDir = "$projectDir/src-gen" From 87e9e886f5d64f241fd84374854d0281ff28bf13 Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 15 Dec 2025 09:40:34 +0100 Subject: [PATCH 5/8] Update build.gradle --- de.peeeq.wurstscript/build.gradle | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/de.peeeq.wurstscript/build.gradle b/de.peeeq.wurstscript/build.gradle index a00e78602..912904c50 100644 --- a/de.peeeq.wurstscript/build.gradle +++ b/de.peeeq.wurstscript/build.gradle @@ -21,9 +21,6 @@ plugins { import de.undercouch.gradle.tasks.download.Download -import org.eclipse.jgit.api.Git -import org.eclipse.jgit.lib.Constants -import org.eclipse.jgit.lib.ObjectId import java.util.regex.Pattern @@ -325,5 +322,9 @@ tasks.register('generate_hotdoc') { } } +tasks.named("coveralls") { + notCompatibleWithConfigurationCache("coveralls plugin task uses Project at execution time") +} + /** -------- Apply deployment settings -------- */ apply from: 'deploy.gradle' From 7c7b04a36602909e1b22adbe6ef7a7d8e97330a9 Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 15 Dec 2025 09:53:29 +0100 Subject: [PATCH 6/8] Update build.gradle --- de.peeeq.wurstscript/build.gradle | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/de.peeeq.wurstscript/build.gradle b/de.peeeq.wurstscript/build.gradle index 912904c50..86a8fb6bd 100644 --- a/de.peeeq.wurstscript/build.gradle +++ b/de.peeeq.wurstscript/build.gradle @@ -173,20 +173,32 @@ tasks.register('versionInfoFile') { // capture at configuration time (no Task.project usage later) def versionString = project.version.toString() + // Inputs so the task reruns when metadata changes: + // - project version changes + inputs.property("projectVersion", versionString) + // - HEAD changes (branch updates) + inputs.file(new File(repoDir, ".git/HEAD")).withPropertyName("gitHeadRef") + // - branch ref changes (only for branch-based HEAD; harmless if missing) + inputs.files(fileTree(new File(repoDir, ".git/refs"))).withPropertyName("gitRefs") + // - tags move / new tags (for git describe --tags) + inputs.files(fileTree(new File(repoDir, ".git/refs/tags"))).withPropertyName("gitTags") + // - packed refs can contain tags/refs + inputs.file(new File(repoDir, ".git/packed-refs")).optional().withPropertyName("gitPackedRefs") + // - working tree dirtiness affects "--dirty" + inputs.file(new File(repoDir, ".git/index")).optional().withPropertyName("gitIndex") + doLast { def rev8 = ["git", "rev-parse", "--short=8", "HEAD"].execute(null, repoDir).text.trim() def revLong = ["git", "rev-parse", "HEAD"].execute(null, repoDir).text.trim() def tag = ["git", "describe", "--tags", "--always", "--dirty"].execute(null, repoDir).text.trim() def wurstVersion = "${versionString}-${tag}" - def currentTime = new Date().format("yyyy/MM/dd KK:mm:ss") dir.mkdirs() out.text = """ package de.peeeq.wurstscript; public class CompileTimeInfo { - public static final String time="${currentTime}"; public static final String revision="${rev8}"; public static final String revisionLong="${revLong}"; public static final String version="${wurstVersion}"; @@ -196,6 +208,7 @@ public class CompileTimeInfo { } + /** -------- Aggregate generation + wiring into compile -------- */ tasks.register('gen') { From 006be54063f42904ed029cc1320e51313cc8d483 Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 15 Dec 2025 09:55:03 +0100 Subject: [PATCH 7/8] Update build.gradle --- de.peeeq.wurstscript/build.gradle | 2 -- 1 file changed, 2 deletions(-) diff --git a/de.peeeq.wurstscript/build.gradle b/de.peeeq.wurstscript/build.gradle index 86a8fb6bd..8df64dbbf 100644 --- a/de.peeeq.wurstscript/build.gradle +++ b/de.peeeq.wurstscript/build.gradle @@ -182,8 +182,6 @@ tasks.register('versionInfoFile') { inputs.files(fileTree(new File(repoDir, ".git/refs"))).withPropertyName("gitRefs") // - tags move / new tags (for git describe --tags) inputs.files(fileTree(new File(repoDir, ".git/refs/tags"))).withPropertyName("gitTags") - // - packed refs can contain tags/refs - inputs.file(new File(repoDir, ".git/packed-refs")).optional().withPropertyName("gitPackedRefs") // - working tree dirtiness affects "--dirty" inputs.file(new File(repoDir, ".git/index")).optional().withPropertyName("gitIndex") From 0d54df92c34bf6839da01d0cd411ad9386e100f4 Mon Sep 17 00:00:00 2001 From: Frotty Date: Mon, 15 Dec 2025 10:01:35 +0100 Subject: [PATCH 8/8] auto detect/download toolchain --- de.peeeq.wurstscript/gradle.properties | 2 ++ de.peeeq.wurstscript/settings.gradle | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/de.peeeq.wurstscript/gradle.properties b/de.peeeq.wurstscript/gradle.properties index 1512f4c03..1c50ec12a 100644 --- a/de.peeeq.wurstscript/gradle.properties +++ b/de.peeeq.wurstscript/gradle.properties @@ -2,3 +2,5 @@ org.gradle.caching=true org.gradle.configuration-cache=true org.gradle.parallel=true org.gradle.daemon=true +org.gradle.java.installations.auto-download=true +org.gradle.java.installations.auto-detect=true \ No newline at end of file diff --git a/de.peeeq.wurstscript/settings.gradle b/de.peeeq.wurstscript/settings.gradle index 5ec2363ae..5bf5e24e2 100644 --- a/de.peeeq.wurstscript/settings.gradle +++ b/de.peeeq.wurstscript/settings.gradle @@ -6,6 +6,10 @@ pluginManagement { } } +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.9.0' +} + dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) repositories {