Files
gitea-docker/desktop/BUILD.md

5.0 KiB

Build & Release Checklist

Quick Start

# Build minimal JREs (run once or when Java version changes)
./build-jres.sh 11

# Build all platforms
./build-all.sh

Build Artifacts

Platform Location Size
Windows x64 target/windows/TicksTales.exe ~121MB
Linux x64 target/linux/amd64/Tick's Tales ~132MB
macOS x64 target/osx/Tick's Tales.app ~121MB
macOS ARM64 target/osx-arm64/Tick's Tales.app ~120MB

Remaining Production Tasks

1. Windows Icon Embedding

The icons.ico file exists but packr doesn't embed it into the .exe. This requires rcedit:

Option A: On Windows

# Install rcedit via chocolatey
choco install rcedit

# Embed icon
rcedit "target/windows/TicksTales.exe" --set-icon "icons.ico"

Option B: On Linux with Wine

# Install wine and rcedit
sudo apt install wine64

# Download rcedit from https://github.com/electron/rcedit/releases
wget https://github.com/electron/rcedit/releases/download/v2.0.0/rcedit-x64.exe

# Embed icon
wine rcedit-x64.exe "target/windows/TicksTales.exe" --set-icon "icons.ico"

2. macOS Code Signing

Required for macOS 10.15+ and notarization:

# Requirements:
# - Apple Developer account
# - Developer ID Application certificate installed in Keychain

# Sign the app bundle
codesign --sign "Developer ID Application: Your Name (TEAMID)" \
  --verbose=10 \
  --timestamp \
  --force \
  --options runtime \
  --entitlements entitlements.plist \
  --deep \
  "target/osx/Tick's Tales.app"

# Verify signature
codesign --verify --deep --strict --verbose=2 "target/osx/Tick's Tales.app"

entitlements.plist (required for Java apps):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.disable-executable-page-protection</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
</dict>
</plist>

3. macOS Notarization

Required for distribution outside Mac App Store:

# Requirements:
# - Apple Developer account with app-specific password
# - Store password in Keychain: xcrun notarytool store-credentials "TICKSTALES"

# Create zip for notarization
ditto -c -k --keepParent "target/osx/Tick's Tales.app" "TicksTales-macos.zip"

# Submit for notarization
xcrun notarytool submit "TicksTales-macos.zip" --keychain-profile "TICKSTALES" --wait

# Staple the ticket
xcrun stapler staple "target/osx/Tick's Tales.app"

# Verify
spctl --assess --verbose=4 --type execute "target/osx/Tick's Tales.app"

4. Steam Distribution

Prepare content for Steam:

# Create Steam build directory structure
mkdir -p steam-build/windows
mkdir -p steam-build/linux
mkdir -p steam-build/osx

# Copy Windows build
cp -r target/windows/* steam-build/windows/

# Copy Linux build
cp -r target/linux/amd64/* steam-build/linux/

# Copy macOS builds (after signing)
cp -r "target/osx/Tick's Tales.app" steam-build/osx/
cp -r "target/osx-arm64/Tick's Tales.app" steam-build/osx-arm64/

Steam depot splits (recommended):

  • Depot 1: Windows x64
  • Depot 2: Linux x64
  • Depot 3: macOS x64
  • Depot 4: macOS ARM64

Users only download the depot for their platform.

Build Configuration Files

File Purpose
build-jres.sh Downloads Corretto JDKs and creates minimal JREs
build-all.sh Main build script for all platforms
build-windows.json Packr config for Windows
build-linux-64.json Packr config for Linux
build-osx.json Packr config for macOS x64
build-osx-arm64.json Packr config for macOS ARM64
*-steam.json Steam-enabled variants
icons.ico Windows icon (needs embedding)
icons.icns macOS icon
tickstales.desktop Linux menu entry

Version Management

Version is read from last-release file:

# Update version
echo "31" > last-release
./build-all.sh  # Will build v2.0.31

JVM Arguments (in packr configs)

Current configuration:

-Duse-repl=false           # Disable REPL
-Dui_scale=1.0             # UI scaling
-Dclojure.compiler.direct-linking=true  # Performance optimization
-Dis-desktop=true          # Platform detection
-Dplatform=desktop         # Platform detection
-XstartOnFirstThread       # macOS only (required for LWJGL)

Consider adding for production:

-Xmx2G                     # Max heap size
-XX:+UseG1GC              # Garbage collector
-Dfile.encoding=UTF-8     # File encoding

Troubleshooting

"GLFW_PLATFORM_UNAVAILABLE" - No display available (headless environment), normal for CI/build servers.

"Unable to initialize GLFW" - Same as above, test on actual desktop.

Windows missing icon - Run rcedit step.

macOS "app is damaged" - App not signed/notarized, run signing steps.