diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4f91e6d98c..d2e51c666d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -543,7 +543,7 @@ tasks.register("signResources"){ exclude("*.so") exclude("*.dll") }.forEach{ file -> - exec { + providers.exec { commandLine("codesign", "--timestamp", "--force", "--deep","--options=runtime", "--sign", "Developer ID Application", file) } } diff --git a/app/utils/build.gradle.kts b/app/utils/build.gradle.kts index 1618e1706b..debde2ae57 100644 --- a/app/utils/build.gradle.kts +++ b/app/utils/build.gradle.kts @@ -8,6 +8,7 @@ repositories { } dependencies { + testRuntimeOnly("org.junit.platform:junit-platform-launcher") testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd49177..a4b76b9530 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 94113f200e..2a84e188b8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a4269..f5feea6d6b 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f13..9d21a21834 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/java/gradle/build.gradle.kts b/java/gradle/build.gradle.kts index 8680c0a851..87c93acb75 100644 --- a/java/gradle/build.gradle.kts +++ b/java/gradle/build.gradle.kts @@ -51,11 +51,11 @@ tasks.withType().configureEach { } tasks.register("writeVersion") { - // make the version available to the plugin at runtime by writing it to a properties file in the resources directory doLast { + val version = project.version.toString().takeIf { it != "unspecified" } ?: return@doLast val file = layout.buildDirectory.file("resources/main/version.properties").get().asFile file.parentFile.mkdirs() - file.writeText("version=${project.version}") + file.writeText("version=$version") } } diff --git a/java/gradle/src/main/kotlin/DependenciesTask.kt b/java/gradle/src/main/kotlin/DependenciesTask.kt index 8e2cb9bca3..c36877d046 100644 --- a/java/gradle/src/main/kotlin/DependenciesTask.kt +++ b/java/gradle/src/main/kotlin/DependenciesTask.kt @@ -1,9 +1,11 @@ package org.processing.java.gradle import org.gradle.api.DefaultTask -import org.gradle.api.GradleException +import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.RegularFileProperty import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction import java.io.File import java.io.ObjectInputStream @@ -15,12 +17,16 @@ abstract class DependenciesTask: DefaultTask() { @InputFile val librariesMetaData: RegularFileProperty = project.objects.fileProperty() + @get:OutputDirectory + val outputJarsDirectory: DirectoryProperty = project.objects.directoryProperty() + @InputFile val sketchMetaData: RegularFileProperty = project.objects.fileProperty() init{ librariesMetaData.convention(project.layout.buildDirectory.file("processing/libraries")) sketchMetaData.convention(project.layout.buildDirectory.file("processing/sketch")) + outputJarsDirectory.convention(project.layout.buildDirectory.dir("processing/libs")) } @TaskAction @@ -44,36 +50,21 @@ abstract class DependenciesTask: DefaultTask() { library.jars.forEach { jar -> jar.classes.forEach { className -> if (className.startsWith(statement)) { - dependencies.addAll(library.jars.map { it.path } ) + dependencies.addAll(library.jars.map { it.path }) return@import } } } } } - project.dependencies.add("implementation", project.files(dependencies) ) - - // TODO: Mutating the dependencies of configuration ':implementation' after it has been resolved or consumed. This - - // TODO: Add only if user is compiling for P2D or P3D - // Add JOGL and Gluegen dependencies - project.dependencies.add("runtimeOnly", "org.jogamp.jogl:jogl-all-main:2.5.0") - project.dependencies.add("runtimeOnly", "org.jogamp.gluegen:gluegen-rt:2.5.0") - - val os = System.getProperty("os.name").lowercase() - val arch = System.getProperty("os.arch").lowercase() - - val variant = when { - os.contains("mac") -> "macosx-universal" - os.contains("win") && arch.contains("64") -> "windows-amd64" - os.contains("linux") && arch.contains("aarch64") -> "linux-aarch64" - os.contains("linux") && arch.contains("arm") -> "linux-arm" - os.contains("linux") && arch.contains("amd64") -> "linux-amd64" - else -> throw GradleException("Unsupported OS/architecture: $os / $arch") + // Copy discovered jars to the output directory so they can be wired into the + // compilation classpath at configuration time (Gradle 9 forbids mutating + // configurations after they have been observed/resolved). + val outputDir = outputJarsDirectory.get().asFile + outputDir.deleteRecursively() + outputDir.mkdirs() + dependencies.forEach { jar -> + jar.copyTo(outputDir.resolve(jar.name), overwrite = true) } - - project.dependencies.add("runtimeOnly", "org.jogamp.gluegen:gluegen-rt:2.5.0:natives-$variant") - project.dependencies.add("runtimeOnly", "org.jogamp.jogl:nativewindow:2.5.0:natives-$variant") - project.dependencies.add("runtimeOnly", "org.jogamp.jogl:newt:2.5.0:natives-$variant") } } \ No newline at end of file diff --git a/java/gradle/src/main/kotlin/ProcessingPlugin.kt b/java/gradle/src/main/kotlin/ProcessingPlugin.kt index 375b17549a..d084496f6f 100644 --- a/java/gradle/src/main/kotlin/ProcessingPlugin.kt +++ b/java/gradle/src/main/kotlin/ProcessingPlugin.kt @@ -2,6 +2,7 @@ package org.processing.java.gradle import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.GradleException import org.gradle.api.file.SourceDirectorySet import org.gradle.api.internal.file.DefaultSourceDirectorySet import org.gradle.api.internal.tasks.TaskDependencyFactory @@ -199,16 +200,38 @@ class ProcessingPlugin @Inject constructor(private val objectFactory: ObjectFact } val depsTaskName = sourceSet.getTaskName("addLegacyDependencies", "PDE") - project.tasks.register(depsTaskName, DependenciesTask::class.java){ task -> + val depsTask = project.tasks.register(depsTaskName, DependenciesTask::class.java){ task -> // Link the output of the libraries task to the dependencies task task.librariesMetaData.set(librariesScan.get().librariesMetaData) task.dependsOn(pdeTask, librariesScan) } + project.dependencies.add("implementation", + project.fileTree(depsTask.flatMap { it.outputJarsDirectory }).builtBy(depsTask)) + + val os = System.getProperty("os.name").lowercase() + val arch = System.getProperty("os.arch").lowercase() + val variant = when { + os.contains("mac") -> "macosx-universal" + os.contains("win") && arch.contains("64") -> "windows-amd64" + os.contains("linux") && arch.contains("aarch64") -> "linux-aarch64" + os.contains("linux") && arch.contains("arm") -> "linux-arm" + os.contains("linux") && arch.contains("amd64") -> "linux-amd64" + else -> throw GradleException("Unsupported OS/architecture: $os / $arch") + } + project.dependencies.add("runtimeOnly", "org.jogamp.jogl:jogl-all-main:2.5.0") + project.dependencies.add("runtimeOnly", "org.jogamp.gluegen:gluegen-rt:2.5.0") + project.dependencies.add("runtimeOnly", "org.jogamp.gluegen:gluegen-rt:2.5.0:natives-$variant") + project.dependencies.add("runtimeOnly", "org.jogamp.jogl:nativewindow:2.5.0:natives-$variant") + project.dependencies.add("runtimeOnly", "org.jogamp.jogl:newt:2.5.0:natives-$variant") + + // Make sure that the PDE tasks runs before the java compilation task project.tasks.named(sourceSet.compileJavaTaskName) { task -> task.dependsOn(pdeTaskName, depsTaskName) } + + } } abstract class DefaultPDESourceDirectorySet @Inject constructor(