Skip to content

v1.4 — Self-contained .app bundle (per-machine configs in Resources/)

Choose a tag to compare

@matthewdeaves matthewdeaves released this 11 May 21:26
· 55 commits to master since this release

One fat universal binary, six retro Macs spanning 23 years (1999 G3 → 2019 i5 iMac).

This release is a packaging improvement, not a perf round — same Round v11.1 binary as v1.3-round-v11, but the per-machine autoexec configs that were previously shipped in id1/ alongside your game data now ship inside Quakespasm.app/Contents/Resources/. The .app is now a self-contained distribution unit.

Drop-in install

  1. Download quakespasm-fat-app-v0.97.0.zip
  2. Unzip → you get Quakespasm.app + quakespasm.pak
  3. Put both in any folder (e.g. ~/Desktop/quake/, ~/Applications/, or wherever)
  4. Create an id1/ folder next to Quakespasm.app and drop your registered pak0.pak + pak1.pak from a paid Quake install (Steam / GOG / original CD) into it
  5. Double-click Quakespasm.app

That's it. No autoexec cfg shuffle. The fat binary still holds three slices (ppc_750 G3, ppc_7400 G4 + AltiVec, x86_64 Lion+) — dyld picks the right one at launch, then host.c reads sysctl hw.model and loads the right per-machine autoexec from Contents/Resources/ via CFBundle. Hand-tuned visual stack on each machine, zero per-target setup.

Modern macOS (Big Sur+) will quarantine the unsigned bundle — either right-click → Open, or xattr -dr com.apple.quarantine Quakespasm.app.

What's new vs v1.3

No binary perf change — same Round v11.1 engine, same bench numbers. The change is in how the per-machine config layer is delivered:

  • Old: deploy script copied autoexec-yosemite.cfg, autoexec-sawtooth.cfg, etc. into id1/ alongside your pak0.pak. The engine used Quake's exec FILE.cfg command to load them from the gamedir filesystem. Users had to keep both the .app and the bundled cfg files together for the per-machine dispatch to work.
  • New: cfgs ship inside Quakespasm.app/Contents/Resources/. The engine loads them via CoreFoundation's CFBundle API (QS_ExecConfigFromBundle in host.c). The .app is now self-contained — you only need to provide id1/pak0.pak (your own game data) alongside it.

Per-arch baseline (autoexec-ppc750.cfg / autoexec-ppc7400.cfg / autoexec-x86_64.cfg) picked at compile time via __VEC__ / __ppc__ / __x86_64__. Per-machine overlay (autoexec-<machine>.cfg) picked at runtime via sysctlbyname("hw.model", ...). Both layers travel inside the .app bundle.

Bench reference (carried forward from v1.3, no change)

Machine OS GPU demo1 1024 demo3 1024
yosemite (PowerMac1,1, 1999, G3 449 MHz) Panther 10.3.9 Rage 128 16 MB 16.95 19.90
sawtooth (PowerMac3,1, 1999, G4 500 MHz) Tiger 10.4.11 GeForce2 MX 32 MB 40.25 46.90
quicksilver (PowerMac3,5, 2001, G4 733 MHz) Tiger 10.4.11 Radeon 9000 Pro 64 MB 62.75 84.05
mini-g4 (PowerMac10,1, 2005, G4 1.25 GHz) Tiger 10.4.11 Radeon 9200 32 MB 48.45 65.60
mini-intel (Macmini2,1, 2007, C2D 2.33 GHz) Lion 10.7.5 GMA 950 64 MB 72.85 44.60
imac-2019 (iMac19,1, 2019, i5-9600K) Sequoia 15.7.5 Radeon Pro 580X 8 GB 1610.95 1575.15

Full breakdown: see v1.3 release notes.