summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'desktop')
-rw-r--r--desktop/build.gradle.kts26
1 files changed, 26 insertions, 0 deletions
diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts
index 2705014..d72a319 100644
--- a/desktop/build.gradle.kts
+++ b/desktop/build.gradle.kts
@@ -41,3 +41,29 @@ tasks.withType<JavaExec>().configureEach {
environment.putAll(System.getenv().filterKeys { it.startsWith("XDG_") || it.startsWith("ROOKERY_") })
standardInput = System.`in` // so `--cube monitor` can take commands
}
+
+// One jar that runs anywhere: the app plus the native graphics libraries for every desktop platform.
+// (Compose's own uber jar only carries the natives of the machine that built it.)
+val universal: Configuration by configurations.creating { extendsFrom(configurations.runtimeClasspath.get()) }
+dependencies {
+ universal(compose.desktop.linux_x64)
+ universal(compose.desktop.linux_arm64)
+ universal(compose.desktop.macos_x64)
+ universal(compose.desktop.macos_arm64)
+ universal(compose.desktop.windows_x64)
+}
+
+interface ArchiveServices { @get:javax.inject.Inject val archives: ArchiveOperations }
+val archives = objects.newInstance<ArchiveServices>().archives // an injected service, so the configuration cache can store it
+
+tasks.register<Jar>("universalJar") {
+ group = "distribution"
+ archiveBaseName = "rookery"
+ archiveClassifier = "universal"
+ manifest { attributes["Main-Class"] = "coffee.liz.rookery.desktop.MainKt" }
+ duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+ from(sourceSets.main.get().output)
+ val unzip = archives // a local, so the closure below captures the service and not the whole build script
+ from(universal.elements.map { files -> files.filter { it.asFile.name.endsWith(".jar") }.map { unzip.zipTree(it.asFile) } })
+ exclude("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA", "META-INF/INDEX.LIST")
+}