From 4bdb7f95d7a3f7742fc6861a598a0495d7dcbca2 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Wed, 17 Sep 2025 01:36:48 -0700 Subject: [PATCH] Refactor template using buildSrc, feature variants and published version catalogs (#56) Co-authored-by: Abe Pazos --- README.md | 9 +- build.gradle.kts | 375 +----------------- buildSrc/build.gradle.kts | 12 + buildSrc/settings.gradle.kts | 39 ++ .../distribute-application.gradle.kts | 73 ++++ .../kotlin/conventions/kotlin-jvm.gradle.kts | 71 ++++ .../conventions/openrndr-tasks.gradle.kts | 42 ++ .../conventions/publish-library.gradle.kts | 37 ++ gradle.properties | 4 + gradle/libs.versions.toml | 29 +- settings.gradle.kts | 29 +- 11 files changed, 347 insertions(+), 373 deletions(-) create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/settings.gradle.kts create mode 100644 buildSrc/src/main/kotlin/conventions/distribute-application.gradle.kts create mode 100644 buildSrc/src/main/kotlin/conventions/kotlin-jvm.gradle.kts create mode 100644 buildSrc/src/main/kotlin/conventions/openrndr-tasks.gradle.kts create mode 100644 buildSrc/src/main/kotlin/conventions/publish-library.gradle.kts diff --git a/README.md b/README.md index ed79682..7c0d73d 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ See the [wiki](https://github.com/openrndr/openrndr-template/wiki) ## Cross builds -To create a runnable jar for a platform different from your current platform, use `./gradlew jar -PtargetPlatform=`, where `` is either `windows`, `macos`, `linux-x64`, or `linux-arm64`. +See the [wiki](https://github.com/openrndr/openrndr-template/wiki) ## Updating OPENRNDR, ORX and other dependencies @@ -64,3 +64,10 @@ any time a commit is tagged with a version number like `v1.*`. For example, we c ``` You can follow the progress of the action under the Actions tab in GitHub. Once complete, the executables will appear under the Releases section. + +## Building libraries + +This template can be used to create a library with your classes and extensions and reuse them across projects or share them with other people. +To publish the project as a library, open [build.gradle.kts](build.gradle.kts) and replace the `conventions.distribute-application` plugin with `conventions.publish-library`. +This automatically sets up the `maven-publish` plugin, which adds the `publishToMavenLocal` task. +The plugin also adds a `demo` sourceSet with runtime dependencies set to go. Demos can be placed in `src/demo/kotlin` and started right away. diff --git a/build.gradle.kts b/build.gradle.kts index a154806..0470c85 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,374 +1,31 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import org.gradle.internal.os.OperatingSystem -import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.dsl.KotlinVersion +group = property("project.group") ?: error("project.group not set") +version = property("project.version") ?: error("project.version not set") -group = "org.openrndr.template" -version = "1.0.0" - -val applicationMainClass = "TemplateProgramKt" - -/** ## additional ORX features to be added to this project */ -val orxFeatures = setOf( -// "orx-axidraw", -// "orx-boofcv", - "orx-camera", -// "orx-chataigne", - "orx-color", - "orx-composition", - "orx-compositor", -// "orx-compute-graph", -// "orx-compute-graph-nodes", - "orx-delegate-magic", -// "orx-dnk3", -// "orx-easing", - "orx-envelopes", -// "orx-expression-evaluator", -// "orx-fcurve", -// "orx-fft", -// "orx-file-watcher", - "orx-fx", -// "orx-git-archiver", -// "orx-gradient-descent", - "orx-gui", -// "orx-hash-grid", - "orx-image-fit", -// "orx-integral-image", -// "orx-interval-tree", -// "orx-jumpflood", -// "orx-kdtree", -// "orx-keyframer", -// "orx-kinect-v1", -// "orx-kotlin-parser", -// "orx-marching-squares", -// "orx-math", -// "orx-mesh-generators", -// "orx-midi", -// "orx-minim", - "orx-no-clear", - "orx-noise", -// "orx-obj-loader", - "orx-olive", -// "orx-osc", -// "orx-palette", - "orx-panel", -// "orx-parameters", -// "orx-poisson-fill", -// "orx-property-watchers", -// "orx-quadtree", -// "orx-rabbit-control", -// "orx-realsense2", -// "orx-runway", - "orx-shade-styles", -// "orx-shader-phrases", - "orx-shapes", - "orx-svg", -// "orx-syphon", -// "orx-temporal-blur", -// "orx-tensorflow", - "orx-text-writer", -// "orx-time-operators", -// "orx-timer", -// "orx-triangulation", -// "orx-turtle", - "orx-video-profiles", - "orx-view-box", -) - -/** ## additional ORML features to be added to this project */ -val ormlFeatures = setOf( -// "orml-blazepose", -// "orml-dbface", -// "orml-facemesh", -// "orml-image-classifier", -// "orml-psenet", -// "orml-ssd", -// "orml-style-transfer", -// "orml-super-resolution", -// "orml-u2net", -) - -/** ## additional OPENRNDR features to be added to this project */ -val openrndrFeatures = setOfNotNull( - if (DefaultNativePlatform("current").architecture.name != "arm-v8") "video" else null -) - -/** ## configure the type of logging this project uses */ -enum class Logging { NONE, SIMPLE, FULL } - -val applicationLogging = Logging.FULL - -// ------------------------------------------------------------------------------------------------------------------ // - -@Suppress("DSL_SCOPE_VIOLATION") plugins { - java - alias(libs.plugins.kotlin.jvm) - alias(libs.plugins.shadow) - alias(libs.plugins.runtime) - alias(libs.plugins.gitarchive.tomarkdown).apply(false) - alias(libs.plugins.versions) alias(libs.plugins.kotlin.serialization) -} - -repositories { - mavenCentral() - mavenLocal() + id("conventions.kotlin-jvm") + id("conventions.openrndr-tasks") + id("conventions.distribute-application") } dependencies { + implementation(openrndr.application) + implementation(openrndr.draw) + runtimeOnly(openrndr.gl3) -// implementation(libs.jsoup) -// implementation(libs.csv) - - /* ORSL dependencies */ - -// implementation(libs.orsl.shader.generator) -// implementation(libs.orsl.extension.color) -// implementation(libs.orsl.extension.easing) -// implementation(libs.orsl.extension.gradient) -// implementation(libs.orsl.extension.noise) -// implementation(libs.orsl.extension.pbr) -// implementation(libs.orsl.extension.raymarching) -// implementation(libs.orsl.extension.sdf) + implementation(openrndr.dialogs) + implementation(openrndr.orextensions) + implementation(openrndr.ffmpeg) + implementation(orx.bundles.basic) + implementation(orx.olive) implementation(libs.kotlinx.coroutines.core) implementation(libs.kotlinx.serialization.core) implementation(libs.kotlinx.serialization.json) implementation(libs.slf4j.api) implementation(libs.kotlin.logging) - when (applicationLogging) { - Logging.NONE -> runtimeOnly(libs.slf4j.nop) - Logging.SIMPLE -> runtimeOnly(libs.slf4j.simple) - Logging.FULL -> { - runtimeOnly(libs.log4j.slf4j2) - runtimeOnly(libs.log4j.core) - runtimeOnly(libs.jackson.databind) - runtimeOnly(libs.jackson.json) - } - } - implementation(kotlin("stdlib-jdk8")) + runtimeOnly(libs.bundles.logging.simple) + testImplementation(libs.junit) -} - -// ------------------------------------------------------------------------------------------------------------------ // - -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 -} -kotlin { - compilerOptions { - languageVersion = KotlinVersion.KOTLIN_2_0 - apiVersion = KotlinVersion.KOTLIN_2_0 - jvmTarget = JvmTarget.JVM_17 - } -} - -// ------------------------------------------------------------------------------------------------------------------ // - -application { - mainClass = if (hasProperty("openrndr.application")) - "${property("openrndr.application")}" - else - applicationMainClass -} - -tasks { - named("shadowJar") { - manifest { - attributes["Main-Class"] = applicationMainClass - attributes["Implementation-Version"] = project.version - } - minimize { - exclude(dependency("org.openrndr:openrndr-gl3:.*")) - exclude(dependency("org.jetbrains.kotlin:kotlin-reflect:.*")) - exclude(dependency("org.slf4j:slf4j-simple:.*")) - exclude(dependency("org.apache.logging.log4j:log4j-slf4j2-impl:.*")) - exclude(dependency("com.fasterxml.jackson.core:jackson-databind:.*")) - exclude(dependency("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:.*")) - exclude(dependency("org.bytedeco:.*")) - } - } -} - -// ------------------------------------------------------------------------------------------------------------------ // - -tasks { - named("jpackage") { - doLast { - val destPath = if (OperatingSystem.current().isMacOsX) - "build/jpackage/openrndr-application.app/Contents/Resources/data" - else - "build/jpackage/openrndr-application/data" - - copy { - from("data") { include("**/*") } - into(destPath) - } - } - } - - register("jpackageZip") { - archiveFileName = "openrndr-application.zip" - from("${layout.buildDirectory.get()}/jpackage") { - include("**/*") - } - dependsOn("jpackage") - } -} - -runtime { - jpackage { - imageName = "openrndr-application" - skipInstaller = true - if (OperatingSystem.current().isMacOsX) { - jvmArgs.add("-XstartOnFirstThread") - jvmArgs.add("-Duser.dir=${"$"}APPDIR/../Resources") - } - } - options = listOf("--strip-debug", "--compress", "1", "--no-header-files", "--no-man-pages") - modules = listOf("jdk.unsupported", "java.management", "java.desktop") -} - -// ------------------------------------------------------------------------------------------------------------------ // - -tasks { - register("gitArchiveToMarkDown") { - historySize = 20 - } -} - -// ------------------------------------------------------------------------------------------------------------------ // - -tasks { - dependencyUpdates { - gradleReleaseChannel = "current" - - val nonStableKeywords = listOf("alpha", "beta", "rc") - - fun isNonStable(version: String) = nonStableKeywords.any { - version.lowercase().contains(it) - } - - rejectVersionIf { - isNonStable(candidate.version) && !isNonStable(currentVersion) - } - } -} - -// ------------------------------------------------------------------------------------------------------------------ // - -class Openrndr { - val openrndrVersion = libs.versions.openrndr.get() - val orxVersion = libs.versions.orx.get() - val ormlVersion = libs.versions.orml.get() - - // choices are "orx-tensorflow-gpu", "orx-tensorflow" - val orxTensorflowBackend = "orx-tensorflow" - - val currArch = DefaultNativePlatform("current").architecture.name - val currOs = OperatingSystem.current() - val os = if (project.hasProperty("targetPlatform")) { - val supportedPlatforms = setOf("windows", "macos", "linux-x64", "linux-arm64") - val platform: String = project.property("targetPlatform") as String - if (platform !in supportedPlatforms) { - throw IllegalArgumentException("target platform not supported: $platform") - } else { - platform - } - } else when { - currOs.isWindows -> "windows" - currOs.isMacOsX -> when (currArch) { - "aarch64", "arm-v8" -> "macos-arm64" - else -> "macos" - } - - currOs.isLinux -> when (currArch) { - "x86-64" -> "linux-x64" - "aarch64" -> "linux-arm64" - else -> throw IllegalArgumentException("architecture not supported: $currArch") - } - - else -> throw IllegalArgumentException("os not supported: ${currOs.name}") - } - - fun orx(module: String) = "org.openrndr.extra:$module:$orxVersion" - fun orml(module: String) = "org.openrndr.orml:$module:$ormlVersion" - fun openrndr(module: String) = "org.openrndr:openrndr-$module:$openrndrVersion" - fun openrndrNatives(module: String) = "org.openrndr:openrndr-$module-natives-$os:$openrndrVersion" - fun orxNatives(module: String) = "org.openrndr.extra:$module-natives-$os:$orxVersion" - - init { - dependencies { - runtimeOnly(openrndr("gl3")) - runtimeOnly(openrndrNatives("gl3")) - implementation(openrndr("openal")) - runtimeOnly(openrndrNatives("openal")) - implementation(openrndr("application")) - implementation(openrndr("animatable")) - implementation(openrndr("extensions")) - implementation(openrndr("filter")) - implementation(openrndr("dialogs")) - if ("video" in openrndrFeatures) { - implementation(openrndr("ffmpeg")) - runtimeOnly(openrndrNatives("ffmpeg")) - } - for (feature in orxFeatures) { - implementation(orx(feature)) - } - for (feature in ormlFeatures) { - implementation(orml(feature)) - } - if ("orx-tensorflow" in orxFeatures) runtimeOnly("org.openrndr.extra:$orxTensorflowBackend-natives-$os:$orxVersion") - if ("orx-kinect-v1" in orxFeatures) runtimeOnly(orxNatives("orx-kinect-v1")) - if ("orx-olive" in orxFeatures) implementation(libs.kotlin.script.runtime) - } - } -} - -val openrndr = Openrndr() - -if (properties["openrndr.tasks"] == "true") { - tasks.register("create executable jar for $applicationMainClass") { - group = " \uD83E\uDD8C OPENRNDR" - dependsOn("shadowJar") - } - - tasks.register("run $applicationMainClass") { - group = " \uD83E\uDD8C OPENRNDR" - dependsOn("run") - } - - tasks.register("create standalone executable for $applicationMainClass") { - group = " \uD83E\uDD8C OPENRNDR" - dependsOn("jpackageZip") - } - - tasks.register("add IDE file scopes") { - group = " \uD83E\uDD8C OPENRNDR" - val scopesFolder = File("${project.projectDir}/.idea/scopes") - scopesFolder.mkdirs() - - val files = listOf( - "Code" to "file:*.kt||file:*.frag||file:*.vert||file:*.glsl", - "Text" to "file:*.txt||file:*.md||file:*.xml||file:*.json", - "Gradle" to "file[*buildSrc*]:*/||file:*gradle.*||file:*.gradle||file:*/gradle-wrapper.properties||file:*.toml", - "Media" to "file:*.png||file:*.jpg||file:*.dds||file:*.exr||file:*.mp3||file:*.wav||file:*.mp4||file:*.mov||file:*.svg" - ) - files.forEach { (name, pattern) -> - val file = File(scopesFolder, "__$name.xml") - if (!file.exists()) { - file.writeText( - """ - - - - """.trimIndent() - ) - } - } - } -} +} \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..e872214 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + `kotlin-dsl` +} + +val libs = extensions.getByType().named("libs") + +dependencies { + implementation(libs.findLibrary("shadow-gradle-plugin").get()) + implementation(libs.findLibrary("runtime-gradle-plugin").get()) + implementation(libs.findLibrary("kotlin-gradle-plugin").get()) + implementation(libs.findLibrary("xversions-gradle-plugin").get()) +} \ No newline at end of file diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts new file mode 100644 index 0000000..8dcea68 --- /dev/null +++ b/buildSrc/settings.gradle.kts @@ -0,0 +1,39 @@ +rootProject.name = "buildSrc" + +dependencyResolutionManagement { + repositories { + mavenCentral() + gradlePluginPortal() + mavenLocal { + content { + includeGroup("org.openrndr") + includeGroup("org.openrndr.extra") + } + } + } + + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + // We use a regex to get the openrndr/orx versions from the primary catalog as there is no public Gradle API to parse catalogs. + val orRegEx = Regex("^openrndr[ ]*=[ ]*(?:\\{[ ]*require[ ]*=[ ]*)?\"(.*)\"[ ]*(?:\\})?", RegexOption.MULTILINE) + val orxRegEx = Regex("^orx[ ]*=[ ]*(?:\\{[ ]*require[ ]*=[ ]*)?\"(.*)\"[ ]*(?:\\})?", RegexOption.MULTILINE) + val openrndrVersion = orRegEx.find(File(rootDir,"../gradle/libs.versions.toml").readText())?.groupValues?.get(1) ?: error("can't find openrndr version") + val orxVersion = orxRegEx.find(File(rootDir,"../gradle/libs.versions.toml").readText())?.groupValues?.get(1) ?: error("can't find orx version") + + create("orx") { + from("org.openrndr.extra:orx-module-catalog:$orxVersion") + } + create("openrndr") { + from("org.openrndr:openrndr-module-catalog:$openrndrVersion") + } + } +} + +pluginManagement { + repositories { + gradlePluginPortal() + + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/conventions/distribute-application.gradle.kts b/buildSrc/src/main/kotlin/conventions/distribute-application.gradle.kts new file mode 100644 index 0000000..fe779b4 --- /dev/null +++ b/buildSrc/src/main/kotlin/conventions/distribute-application.gradle.kts @@ -0,0 +1,73 @@ +package conventions +import org.gradle.internal.os.OperatingSystem +import kotlin.collections.set +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + id("com.gradleup.shadow") + id("org.beryx.runtime") +} + +val applicationMainClass: String by properties + +application { + mainClass = if (hasProperty("openrndr.application")) + "${property("openrndr.application")}" + else + applicationMainClass +} + +tasks { + named("shadowJar") { + manifest { + attributes["Main-Class"] = applicationMainClass + attributes["Implementation-Version"] = project.version + } + minimize { + exclude(dependency("org.openrndr:openrndr-gl3:.*")) + exclude(dependency("org.jetbrains.kotlin:kotlin-reflect:.*")) + exclude(dependency("org.slf4j:slf4j-simple:.*")) + exclude(dependency("org.apache.logging.log4j:log4j-slf4j2-impl:.*")) + exclude(dependency("com.fasterxml.jackson.core:jackson-databind:.*")) + exclude(dependency("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:.*")) + exclude(dependency("org.bytedeco:.*")) + } + } +} + +tasks { + named("jpackage") { + doLast { + val destPath = if (OperatingSystem.current().isMacOsX) + "build/jpackage/openrndr-application.app/Contents/Resources/data" + else + "build/jpackage/openrndr-application/data" + + copy { + from("data") { include("**/*") } + into(destPath) + } + } + } + + register("jpackageZip") { + archiveFileName = "openrndr-application.zip" + from("${layout.buildDirectory.get()}/jpackage") { + include("**/*") + } + dependsOn("jpackage") + } +} + +runtime { + jpackage { + imageName = "openrndr-application" + skipInstaller = true + if (OperatingSystem.current().isMacOsX) { + jvmArgs.add("-XstartOnFirstThread") + jvmArgs.add("-Duser.dir=${"$"}APPDIR/../Resources") + } + } + options = listOf("--strip-debug", "--compress", "1", "--no-header-files", "--no-man-pages") + modules = listOf("jdk.unsupported", "java.management", "java.desktop") +} diff --git a/buildSrc/src/main/kotlin/conventions/kotlin-jvm.gradle.kts b/buildSrc/src/main/kotlin/conventions/kotlin-jvm.gradle.kts new file mode 100644 index 0000000..657c25e --- /dev/null +++ b/buildSrc/src/main/kotlin/conventions/kotlin-jvm.gradle.kts @@ -0,0 +1,71 @@ +package conventions +import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion + +val libs = extensions.getByType().named("libs") + +plugins { + java + kotlin("jvm") + id("com.github.ben-manes.versions") +} + +repositories { + mavenCentral() + mavenLocal() +} + +java { + targetCompatibility = JavaVersion.valueOf("VERSION_${libs.findVersion("jvmTarget").get().displayName}") + sourceCompatibility = JavaVersion.valueOf("VERSION_${libs.findVersion("jvmTarget").get().displayName}") +} + +kotlin { + compilerOptions { + apiVersion.set(KotlinVersion.valueOf("KOTLIN_${libs.findVersion("kotlinApi").get().displayName.replace(".", "_")}")) + languageVersion.set(KotlinVersion.valueOf("KOTLIN_${libs.findVersion("kotlinLanguage").get().displayName.replace(".", "_")}")) + jvmTarget.set(JvmTarget.valueOf("JVM_${libs.findVersion("jvmTarget").get().displayName}")) + } +} + +fun arch(arch: String = System.getProperty("os.arch")): String { + return when (arch) { + "x86-64", "x86_64", "amd64" -> "x86-64" + "arm64", "aarch64" -> "aarch64" + else -> error("unsupported arch $arch") + } +} + +fun Project.addHostMachineAttributesToRuntimeConfigurations() { + val currentOperatingSystemName: String = DefaultNativePlatform.getCurrentOperatingSystem().toFamilyName() + val currentArchitectureName: String = arch() + + configurations.matching { + it.name.endsWith("runtimeClasspath", ignoreCase = true) + }.configureEach { + attributes { + attribute(OperatingSystemFamily.OPERATING_SYSTEM_ATTRIBUTE, objects.named(currentOperatingSystemName)) + attribute(MachineArchitecture.ARCHITECTURE_ATTRIBUTE, objects.named(currentArchitectureName)) + } + } +} + +addHostMachineAttributesToRuntimeConfigurations() + + +tasks { + dependencyUpdates { + gradleReleaseChannel = "current" + + val nonStableKeywords = listOf("alpha", "beta", "rc") + + fun isNonStable(version: String) = nonStableKeywords.any { + version.lowercase().contains(it) + } + + rejectVersionIf { + isNonStable(candidate.version) && !isNonStable(currentVersion) + } + } +} diff --git a/buildSrc/src/main/kotlin/conventions/openrndr-tasks.gradle.kts b/buildSrc/src/main/kotlin/conventions/openrndr-tasks.gradle.kts new file mode 100644 index 0000000..7743346 --- /dev/null +++ b/buildSrc/src/main/kotlin/conventions/openrndr-tasks.gradle.kts @@ -0,0 +1,42 @@ +package conventions + +val applicationMainClass by properties +tasks.register("create executable jar for $applicationMainClass") { + group = " \uD83E\uDD8C OPENRNDR" + dependsOn("shadowJar") +} + +tasks.register("run $applicationMainClass") { + group = " \uD83E\uDD8C OPENRNDR" + dependsOn("run") +} + +tasks.register("create standalone executable for $applicationMainClass") { + group = " \uD83E\uDD8C OPENRNDR" + dependsOn("jpackageZip") +} + +tasks.register("add IDE file scopes") { + group = " \uD83E\uDD8C OPENRNDR" + val scopesFolder = File("${project.projectDir}/.idea/scopes") + scopesFolder.mkdirs() + + val files = listOf( + "Code" to "file:*.kt||file:*.frag||file:*.vert||file:*.glsl", + "Text" to "file:*.txt||file:*.md||file:*.xml||file:*.json", + "Gradle" to "file[*buildSrc*]:*/||file:*gradle.*||file:*.gradle||file:*/gradle-wrapper.properties||file:*.toml", + "Media" to "file:*.png||file:*.jpg||file:*.dds||file:*.exr||file:*.mp3||file:*.wav||file:*.mp4||file:*.mov||file:*.svg" + ) + files.forEach { (name, pattern) -> + val file = File(scopesFolder, "__$name.xml") + if (!file.exists()) { + file.writeText( + """ + + + + """.trimIndent() + ) + } + } +} diff --git a/buildSrc/src/main/kotlin/conventions/publish-library.gradle.kts b/buildSrc/src/main/kotlin/conventions/publish-library.gradle.kts new file mode 100644 index 0000000..347ff0a --- /dev/null +++ b/buildSrc/src/main/kotlin/conventions/publish-library.gradle.kts @@ -0,0 +1,37 @@ +package conventions + +import org.gradle.kotlin.dsl.java +import org.gradle.kotlin.dsl.kotlin + +plugins { + java + kotlin("jvm") + `maven-publish` +} + +val libs = extensions.getByType().named("libs") +val openrndr = extensions.getByType().named("openrndr") + +val demo = sourceSets.create("demo") +val main = sourceSets.getByName("main") + +demo.compileClasspath += main.compileClasspath +demo.runtimeClasspath += main.runtimeClasspath +demo.compileClasspath += main.output +demo.runtimeClasspath += main.output + +dependencies { + "demoRuntimeOnly"(openrndr.findLibrary("gl3").get()) +} + +publishing { + publications { + create("maven") { + from(components["java"]) + groupId = property("project.group")?.toString() ?: error("project.group not set") + artifactId = property("project.name")?.toString() ?: error("project.name not set") + description = property("project.name")?.toString() ?: error("project.name not set") + version = property("project.version")?.toString() ?: error("project.version not set") + } + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index f565d97..3ed8ea9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,7 @@ +project.name=openrndr-template +project.group=org.openrndr +project.version=1.0.0 +applicationMainClass=TemplateProgramKt openrndr.tasks=true kotlin.code.style=official #org.gradle.configuration-cache=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3cbcd3e..02e4840 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,14 @@ [versions] -kotlin = "2.2.20" -openrndr = "0.4.5" -orx = "0.4.5" +jvmTarget = "17" +kotlin = "2.2.10" +kotlinApi = "2.2" +kotlinLanguage = "2.2" + +openrndr = "0.5.0-SNAPSHOT" +orx = "0.5.0-SNAPSHOT" orsl = "0.4.5-alpha5" orml = "0.4.1" + slf4j = "2.0.17" log4j = "2.23.1" jackson = "2.17.2" @@ -28,15 +33,10 @@ log4j-core = { group = "org.apache.logging.log4j", name = "log4j-core", version. jackson-databind = { group = "com.fasterxml.jackson.core", name = "jackson-databind", version.ref = "jackson" } jackson-json = { group = "com.fasterxml.jackson.dataformat", name = "jackson-dataformat-yaml", version.ref = "jackson" } -orsl-shader-generator = { group = "org.openrndr.extra", name = "orsl-shader-generator", version.ref = "orsl" } -orsl-extension-color = { group = "org.openrndr.extra", name = "orsl-extension-color", version.ref = "orsl" } -orsl-extension-easing = { group = "org.openrndr.extra", name = "orsl-extension-easing", version.ref = "orsl" } -orsl-extension-gradient = { group = "org.openrndr.extra", name = "orsl-extension-gradient", version.ref = "orsl" } -orsl-extension-noise = { group = "org.openrndr.extra", name = "orsl-extension-noise", version.ref = "orsl" } -orsl-extension-pbr = { group = "org.openrndr.extra", name = "orsl-extension-pbr", version.ref = "orsl" } -orsl-extension-raymarching = { group = "org.openrndr.extra", name = "orsl-extension-raymarching", version.ref = "orsl" } -orsl-extension-sdf = { group = "org.openrndr.extra", name = "orsl-extension-sdf", version.ref = "orsl" } - +shadow-gradle-plugin = { group = "com.gradleup.shadow", name = "com.gradleup.shadow.gradle.plugin", version.ref = "shadow" } +runtime-gradle-plugin = { group = "org.beryx.runtime", name = "org.beryx.runtime.gradle.plugin", version.ref = "runtime" } +kotlin-gradle-plugin = { group = "org.jetbrains.kotlin.jvm", name = "org.jetbrains.kotlin.jvm.gradle.plugin", version.ref = "kotlin" } +xversions-gradle-plugin = { group = "com.github.ben-manes.versions", name = "com.github.ben-manes.versions.gradle.plugin", version.ref = "versions" } kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" } kotlinx-serialization-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-core", version.ref = "kotlinxSerialization" } @@ -52,3 +52,8 @@ shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } runtime = { id = "org.beryx.runtime", version.ref = "runtime" } gitarchive-tomarkdown = { id = "org.openrndr.extra.gitarchiver.tomarkdown", version.ref = "orx" } versions = { id = "com.github.ben-manes.versions", version.ref = "versions" } + +[bundles] +logging-none = ["slf4j-nop"] +logging-simple = ["slf4j-simple"] +loggin-full = ["log4j-slf4j2", "log4j-core", "jackson-databind", "jackson-json"] \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 31a934b..ee51656 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,4 @@ -rootProject.name = "openrndr-template" +rootProject.name = extra["project.name"]?.toString() ?: error("project.name not set") pluginManagement { repositories { @@ -6,3 +6,30 @@ pluginManagement { mavenLocal() } } + +dependencyResolutionManagement { + repositories { + mavenCentral() + mavenLocal { + content { + includeGroup("org.openrndr") + includeGroup("org.openrndr.extra") + } + } + } + + versionCatalogs { + // We use a regex to get the openrndr/orx versions from the primary catalog as there is no public Gradle API to parse catalogs. + val orRegEx = Regex("^openrndr[ ]*=[ ]*(?:\\{[ ]*require[ ]*=[ ]*)?\"(.*)\"[ ]*(?:\\})?", RegexOption.MULTILINE) + val orxRegEx = Regex("^orx[ ]*=[ ]*(?:\\{[ ]*require[ ]*=[ ]*)?\"(.*)\"[ ]*(?:\\})?", RegexOption.MULTILINE) + val openrndrVersion = orRegEx.find(File(rootDir,"gradle/libs.versions.toml").readText())?.groupValues?.get(1) ?: error("can't find openrndr version") + val orxVersion = orxRegEx.find(File(rootDir,"gradle/libs.versions.toml").readText())?.groupValues?.get(1) ?: error("can't find orx version") + + create("orx") { + from("org.openrndr.extra:orx-module-catalog:$orxVersion") + } + create("openrndr") { + from("org.openrndr:openrndr-module-catalog:$openrndrVersion") + } + } +}