From 03d70388d588055ef00c9f2ad1666b69814efbe1 Mon Sep 17 00:00:00 2001 From: Bryce Date: Sun, 22 Mar 2026 13:11:31 -0700 Subject: [PATCH] Add comprehensive build script and fix quality issues - Add build-all.sh for complete build process - Add icons.ico for Windows (needs rcedit for embedding) - Add tickstales.desktop for Linux menu integration - Configure packr to use icons.icns for macOS - Copy icons and version metadata in build script - Linux build now includes .desktop file and icon --- desktop/build-all.sh | 53 +++++++++++++++++++++++++++++ desktop/build-osx-arm64-steam.json | 1 + desktop/build-osx-arm64.json | 1 + desktop/build-osx-steam.json | 1 + desktop/build-osx.json | 1 + desktop/icons.ico | Bin 0 -> 73070 bytes desktop/tickstales.desktop | 11 ++++++ 7 files changed, 68 insertions(+) create mode 100755 desktop/build-all.sh create mode 100644 desktop/icons.ico create mode 100644 desktop/tickstales.desktop diff --git a/desktop/build-all.sh b/desktop/build-all.sh new file mode 100755 index 00000000..a6dfecbc --- /dev/null +++ b/desktop/build-all.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +VERSION="2.0.$(cat last-release)" +echo "=== Building Tick's Tales v${VERSION} ===" +echo "" + +echo "=== Cleaning ===" +rm -rf target/windows target/linux target/osx target/osx-arm64 2>/dev/null || true + +echo "=== Building uberjar ===" +LEIN_SNAPSHOTS_IN_RELEASE=true lein with-profile steam do clean, compile, uberjar 2>&1 | tail -5 + +echo "" +echo "=== Building Windows x64 ===" +java -jar packr.jar build-windows.json +# Note: Windows icon embedding requires rcedit on Windows or wine +# The icon folder will be present for manual setup + +echo "" +echo "=== Building Linux x64 ===" +java -jar packr.jar build-linux-64.json +cp tickstales.desktop target/linux/amd64/ +mkdir -p target/linux/amd64/icons +cp resources/icon/icon_128x128.png target/linux/amd64/icons/tickstales.png + +echo "" +echo "=== Building macOS x64 ===" +java -jar packr.jar build-osx.json +cp icons.icns "target/osx/Tick's Tales.app/Contents/Resources/" +sed -i "s/1.0/${VERSION}/" "target/osx/Tick's Tales.app/Contents/Info.plist" + +echo "" +echo "=== Building macOS ARM64 ===" +java -jar packr.jar build-osx-arm64.json +cp icons.icns "target/osx-arm64/Tick's Tales.app/Contents/Resources/" +sed -i "s/1.0/${VERSION}/" "target/osx-arm64/Tick's Tales.app/Contents/Info.plist" + +echo "" +echo "=== Build Complete ===" +echo "" +echo "Sizes:" +du -sh target/windows target/linux/amd64 "target/osx/Tick's Tales.app" "target/osx-arm64/Tick's Tales.app" +echo "" +echo "Artifacts:" +echo " Windows: target/windows/TicksTales.exe" +echo " Linux: target/linux/amd64/Tick's Tales" +echo " macOS: target/osx/Tick's Tales.app" +echo " macOS ARM: target/osx-arm64/Tick's Tales.app" diff --git a/desktop/build-osx-arm64-steam.json b/desktop/build-osx-arm64-steam.json index 28db1d60..3311d129 100644 --- a/desktop/build-osx-arm64-steam.json +++ b/desktop/build-osx-arm64-steam.json @@ -6,6 +6,7 @@ "classpath": ["target/advent-standalone.jar"], "mainclass": "advent.core.desktop_launcher", "resources": ["resources/icon", "steam_appid.txt"], + "icon": "icons.icns", "output": "target/osx-arm64/Tick's Tales.app", "bundle": "com.tickstales.upallknight", "verbose": true diff --git a/desktop/build-osx-arm64.json b/desktop/build-osx-arm64.json index 4caebf7e..e74a5373 100644 --- a/desktop/build-osx-arm64.json +++ b/desktop/build-osx-arm64.json @@ -6,6 +6,7 @@ "classpath": ["target/advent-standalone.jar"], "mainclass": "advent.core.desktop_launcher", "resources": ["resources/icon", "steam_appid.txt"], + "icon": "icons.icns", "output": "target/osx-arm64/Tick's Tales.app", "bundle": "com.tickstales.upallknight", "verbose": true diff --git a/desktop/build-osx-steam.json b/desktop/build-osx-steam.json index 1661910d..187ebf15 100644 --- a/desktop/build-osx-steam.json +++ b/desktop/build-osx-steam.json @@ -6,6 +6,7 @@ "classpath": ["target/advent-standalone.jar"], "mainclass": "advent.core.desktop_launcher", "resources": ["resources/icon", "steam_appid.txt"], + "icon": "icons.icns", "output": "target/osx/Tick's Tales.app", "bundle": "com.tickstales.upallknight", "verbose": true diff --git a/desktop/build-osx.json b/desktop/build-osx.json index c68e0013..637baf59 100644 --- a/desktop/build-osx.json +++ b/desktop/build-osx.json @@ -6,6 +6,7 @@ "classpath": ["target/advent-standalone.jar"], "mainclass": "advent.core.desktop_launcher", "resources": ["resources/icon", "steam_appid.txt"], + "icon": "icons.icns", "output": "target/osx/Tick's Tales.app", "bundle": "com.tickstales.upallknight", "verbose": true diff --git a/desktop/icons.ico b/desktop/icons.ico new file mode 100644 index 0000000000000000000000000000000000000000..2a6bcc463e49948ff6fda190b48ff8a1408793ab GIT binary patch literal 73070 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

@&CNrk9il@@r-Bh++zY6~Q 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