Quakespasm Spiked · Multiplayer
Build QSS-M
from source.
Copy-paste, caveman-proof instructions for every platform — Linux (all the popular distros), macOS, and Windows. These are the exact same recipes our GitHub Actions CI runs, so if it builds here, it builds for you.
You need the retail Quake data first
QSS-M is the engine only. It cannot run without pak0.pak and pak1.pak from a registered copy of Quake, placed in an id1 folder next to the binary. Buy Quake on Steam (files live in steamapps/common/Quake/Id1) or dig out the original CD.
Get the code
Every platform below starts the same way. Clone once, then jump to your OS.
git clone https://github.com/timbergeron/QSS-M.git cd QSS-M
Linux
Install the dev libraries for your distro, then run the one build script. Pick your family:
sudo apt-get update sudo apt-get install -y build-essential pkg-config libsdl2-dev \ libgnutls28-dev libmad0-dev libopus-dev libopusfile-dev \ libvorbis-dev zlib1g-dev libcurl4-openssl-dev zip
sudo dnf install -y gcc make pkgconf-pkg-config SDL2-devel gnutls-devel \
libmad-devel opus-devel opusfile-devel libvorbis-devel zlib-devel \
libcurl-devel zip# If dnf can't find libmad/opusfile, enable RPM Fusion (free) first:
sudo dnf install -y \
https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpmsudo pacman -S --needed base-devel sdl2 gnutls libmad \
opus opusfile libvorbis zlib curl zipsudo zypper install -y gcc make pkgconf-pkg-config libSDL2-devel \
gnutls-devel libmad-devel libopus-devel opusfile-devel \
libvorbis-devel zlib-devel libcurl-devel zip./build-linux.shDone. You get the QSS-M-l64 binary and a ready-to-ship Quake/QSS-M-l64.zip. Drop your id1 folder beside the binary and run it.
Skip the script and compile directly — handy for quick dev iteration. The QSS_LDFLAGS below is required on GCC 10+ (Ubuntu 22.04+, current Fedora/Arch); without it the link fails with “multiple definition” errors:
cd Quake make USE_SDL2=1 QSS_LDFLAGS="-Wl,--allow-multiple-definition" -j8
macOS
Builds a Universal app (Intel + Apple Silicon) via Xcode. Audio and TLS libraries are compiled statically with vcpkg on the first run.
Install Xcode from the App Store (the full IDE, not just the command-line tools), then the Homebrew helpers the crypto libraries need:
brew install autoconf automake libtool pkg-config autoconf-archiveOne command does everything — it runs setup-vcpkg.sh to fetch and compile the static deps, then builds and zips the app. Run it as your normal user, never with sudo.
cd macOS ./build-macos.sh
# The first run pulls a pinned vcpkg checkout and builds every static dep
# (GnuTLS, Nettle, Opus, Vorbis, FLAC, ...) for both x86_64 and arm64 — go get a coffee.
# Later builds reuse the vcpkg cache and are much faster.
Done. Your universal QSS-M.app and QSS-M-macOS.zip land in macOS/build/Release/.
If you skip the script and build the target yourself, run the dependency setup once first — otherwise the static libraries won't exist:
cd macOS ./setup-vcpkg.sh # builds libs_universal/ for both arches xcodebuild -project QuakeSpasm.xcodeproj -target QSS-M -configuration Release
Windows
Three proven paths. MSYS2 is the easiest if you're on Windows. You can also cross-compile the .exe from Linux — that's what our CI does. Visual Studio is there if you'd rather stay in the IDE.
Grab the installer from msys2.org. From the Start menu open the “MSYS2 MINGW64” shell (the blue one — not the plain UCRT/MSYS shell).
pacman -S --needed git make zip \
mingw-w64-x86_64-gcc mingw-w64-x86_64-pkgconf mingw-w64-x86_64-gnutls \
mingw-w64-x86_64-SDL2 mingw-w64-x86_64-opus mingw-w64-x86_64-libvorbis \
mingw-w64-x86_64-zlib mingw-w64-x86_64-curlgit clone https://github.com/timbergeron/QSS-M.git cd QSS-M/Quake make -f Makefile.w64 USE_SDL2=1 SDL_CONFIG=sdl2-config -j8
Done. Out comes Quake/quakespasm.exe. Keep the SDL2/codec DLLs from the Windows/ folder beside it (the CI build scripts do this for you when packaging).
Open the MSYS2 MINGW32 shell instead, install the matching mingw-w64-i686-* packages, and build with Makefile.w32.
Alternative · Cross-compile from Linux (MinGW-w64)
No Windows machine needed — these commands use the same cross-build scripts and targets as the windows.yml workflow. SDL2, curl, zlib and the audio codec import libraries are already vendored in the repo's Windows/ folder, so a normal local build only needs the cross toolchain and basic build utilities. CI additionally bootstraps GnuTLS for TLS-enabled artifacts.
# Debian / Ubuntu / Mint — one package covers both 64- and 32-bit targets sudo apt-get install -y build-essential git zip mingw-w64
On Fedora/RHEL that's mingw64-gcc mingw32-gcc; on Arch it's mingw-w64-gcc.
sh ./build-w64.sh # 64-bit sh ./build-w32.sh # 32-bit
Done. The 64-bit command produces Quake/QSS-M-w64.exe and Quake/QSS-M-w64.zip; the 32-bit command produces the matching QSS-M-w32.exe and QSS-M-w32.zip. Each ZIP includes the required runtime DLLs.
# These scripts are checked in without the executable bit, so run them via sh
# (or chmod +x build-w64.sh first). Override the defaults with environment
# variables: MAKEARGS=-j16, TARGET_TRIPLET=, CROSS_PREFIX=, PKG_CONFIG=.
Debian and friends ship no MinGW GnuTLS package. If pkg-config can't find a cross GnuTLS, the makefile prints building without USE_GNUTLS and carries on — you still get a perfectly good .exe, just without TLS support. To get a TLS-enabled build you have to cross-compile GnuTLS and its dependencies (GMP, Nettle, libtasn1) as static libraries first; the windows.yml workflow does this step by step and is the recipe to copy.
Open Windows/VisualStudio/quakespasm.sln, select Release / x64, and hit Build. Or from a Developer prompt:
msbuild Windows\VisualStudio\quakespasm-sdl2.vcxproj ^
-p:Configuration=Release -p:Platform=x64Stuck? Read the CI
Every command on this page comes straight from the automated build recipes. If something drifts, the workflows are the source of truth: