Native Toolchain Support Matrix
May 27, 2026 · View on GitHub
This matrix tracks the host expectations for rebuilding Quake Live’s native gameplay modules and highlights the 32-bit runtime payloads required to exercise those binaries on each platform.
| Platform | Preferred toolchain | Build status | 32-bit runtime dependencies | Notes |
|---|---|---|---|---|
| Windows 10/11 (Win32) | Visual Studio 2010 SP1 or a newer release with the optional v100 component | Validate locally with tools/ci/validate-windows-native.ps1, building Release|Win32, asserting the export manifest, and staging build\win32\<Config>\retail-runtime\ for a strict retail DLL audit after confirming the v100 toolset is installed | Visual C++ 2010 CRT (MSVCR100.dll, MSVCP100.dll)Launcher payload: Awesomium ( awesomium.dll, awesomium_process.exe), Chromium/FFmpeg helpers (libEGL.dll, libGLESv2.dll, avcodec-53.dll, avformat-53.dll, avutil-51.dll), Steamworks loader (steam_api.dll), ICU data (icudt.dll), XInput shim (xinput9_1_0.dll) | The retail-facing project files now default to the recovered VC10/MSBuild 4.0 shape: ToolsVersion=4.0, PlatformToolset=v100, XP (5.1) subsystem targeting, retail CRT linkage, retail DLL base addresses, and the matching ASLR/NX/SafeSEH flags. Verify that with tools/ci/audit-retail-toolchain.ps1, and confirm both the local Steam payload and the staged strict runtime root with tools/ci/audit-retail-dependencies.ps1.【F:docs/platform/retail-toolchain.md†L1-L72】【F:docs/platform/retail-dependencies.md†L1-L84】 |
| Windows 7 (WOW64) | Visual Studio 2010 SP1 targeting Win32 | Local scripted smoke revalidated on 2026-04-21; still not covered by CI | Visual C++ 2010 CRT (MSVCR100.dll, MSVCP100.dll)Same launcher payload as modern Windows | The retained WOW64 harness now prefers the retail DLLs from assets\quakelive\baseq3\ when present and otherwise falls back to the current Win32 build outputs under build\win32\Debug\bin\baseq3\. A 2026-04-21 local run from 32-bit PowerShell loaded qagamex86.dll, cgamex86.dll, and uix86.dll successfully and resolved both dllEntry and vmMain; the current log is artifacts\wow64-smoketest\wow64-smoketest.log.【F:docs/testing/wow64-smoketest.md†L1-L51】【F:docs/build-pipeline.md†L18-L34】【F:docs/platform/retail-dependencies.md†L1-L79】 |
| Linux (native POSIX) | Hosted GCC/Clang through tools/ci/build-posix-native.sh | CI builds the current baseq3 source-module lists and dedicated-host makefile target on push and nightly, publishing the package under build/posix/linux/dist/ | Hosted glibc userland for the build; runtime still needs suitable data roots and platform libraries before client probes | This is the continuous Linux source-build lane, separate from the reverse clean-room prototypes. The older 32-bit glibc preset still emits qagamei386.so and diffs it against the archived shared object; treat that preset as server-module-only evidence rather than Linux client/runtime parity proof.【F:tools/ci/build-posix-native.sh†L1-L150】【F:docs/build/linux-glibc-32bit.md†L1-L41】【F:tools/build/linux32_qagame.sh†L1-L36】 |
| macOS (native POSIX) | Hosted Apple Clang through tools/ci/build-posix-native.sh | CI builds the current baseq3 .dylib source-module lists and dedicated-host makefile target on push and nightly, publishing the package under build/posix/macos/dist/ | macOS host toolchain; runtime validation still needs modernized renderer/input/audio follow-up before client probes | The hosted lane sets MACOS_X, uses Darwin shared-library flags, disables Quake Live online-service adapters by default, and publishes a manifest/tarball rather than a clean-room harness artifact.【F:tools/ci/build-posix-native.sh†L1-L150】【F:src/code/macosx/Quake3.pbproj/project.pbxproj†L5131-L5144】 |
Windows requirements
- Install Visual Studio 2010 SP1 or a modern release that bundles the optional “Visual Studio 2010 (v100) toolset,” then build the checked-in retail-facing projects with
/p:PlatformToolset=v100.【F:docs/windows-native-pipeline.md†L1-L24】 - Keep the
/MDruntime library selection so the DLLs continue to importMSVCR100.dllandMSVCP100.dll, matching the reference binaries analysed in the migration notes.【F:docs/windows-native-pipeline.md†L17-L24】【F:docs/hlil_comparison.md†L8-L15】 - Stage the Visual C++ 2010 CRT next to the launcher payload (
awesomium.dll, Chromium/FFmpeg helpers,steam_api.dll,icudt.dll,xinput9_1_0.dll) so runtime imports resolve exactly as observed in the reference dump.【F:docs/quakelive_asset_audit.md†L17-L25】 - Use
dumpbin /exportsanddumpbin /imports(or the CI helpers) to verify the rebuilt DLLs expose onlydllEntryandvmMainwhile depending solely on the Visual C++ 2010 CRT plus the Steam/Awesomium launcher payload recorded in the asset audit.【F:docs/windows-native-pipeline.md†L22-L24】【F:docs/toolchain-ci.md†L11-L18】 - Run
pwsh tools\ci\audit-retail-dependencies.ps1 -Strictto confirm a local Steam install still matches the committed retail payload, and usepwsh tools\ci\audit-retail-dependencies.ps1 -RuntimeRoot build\win32\Release\retail-runtime -SkipSteamInstall -Strictwhen you want to re-check the staged strict runtime root directly.【F:docs/platform/retail-dependencies.md†L80-L84】 - Run
pwsh tools\ci\audit-retail-toolchain.ps1 -Strictto confirm the project files still encode the recovered retail compiler/linker settings and that av100toolset is actually installed on the machine.【F:docs/platform/retail-toolchain.md†L66-L72】
Linux requirements
- Target a glibc-based distribution capable of producing 32-bit binaries; the archived guidance calls for GCC along with the original OpenGL/X11 development headers used by the Quake III Unix port.【F:src/code/unix/README.Linux†L68-L155】【F:src/README.txt†L180-L188】
- Ensure runtime hosts provide X11 with DGA and VidMode extensions, plus vendor-specific OpenGL drivers (or Mesa/Glide for 3dfx hardware) so the 32-bit
qagamei386.soand other shared objects can load as they did in Quake Live.【F:src/code/unix/README.Linux†L84-L155】 - Reference
qagamei386.sofromassets/quakelive/baseq3/when validating the rebuilt library to confirm symbol parity with the original Quake Live server module.【F:docs/reference-mapping.md†L18-L24】
32-bit runtime payload reference
- Windows hosts: Visual C++ 2010 CRT (
MSVCR100.dll,MSVCP100.dll), launcher binaries (quakelive_steam.exe,awesomium_process.exe), and supporting DLLs for Awesomium, Chromium/FFmpeg, Steamworks, ICU, and XInput as catalogued in the asset audit.【F:docs/quakelive_asset_audit.md†L17-L25】 - Linux hosts: glibc-based userland (
libc6), X11 stack with DGA and VidMode extensions, and vendor OpenGL drivers (Mesa/Glide for 3dfx hardware) per the historical Linux README.【F:src/code/unix/README.Linux†L68-L155】
Outstanding follow-ups
- Publish the retained WOW64 smoke harness in a self-hosted or other 32-bit-capable validation lane if we want the current local 2026-04-21 log to become continuously enforced evidence instead of a manual refresh point.【F:docs/testing/wow64-smoketest.md†L1-L51】
- Capture additional automated or scripted coverage for the 32-bit glibc preset if we want parity checks beyond the manual helper script.【F:docs/build/linux-glibc-32bit.md†L1-L39】【F:tools/build/linux32_qagame.sh†L1-L36】
Non-Windows native status
For the remaining engine host/support audit, the Unix and null trees are
compatibility-only ports rather than part of the retail replacement target.
That means the strict retail Windows engine-host/support score tracks them as documented divergences,
not as missing Windows parity. They stay visible in the ledger so portability
work is not forgotten, but they are excluded from the strict-retail parity score and the final EH-P5 gate result.
- Hosted Linux/macOS native builds are source-tree builds. Push and nightly workflows now drive
tools/ci/build-posix-native.shon hosted Linux and macOS, producing package manifests/tarballs for the baseq3 native modules plus the dedicated host fromsrc/code. The documented glibc preset and helper script still exclusively target the 32-bitqagamei386.soserver module and explicitly disable Vorbis while diffing exports against the archived server binary, so that specific preset remains server-module-only evidence rather than Linux client/runtime parity proof.【F:tools/ci/build-posix-native.sh†L1-L150】【F:docs/build/linux-glibc-32bit.md†L1-L36】 - Legacy rendering/input stack is unported. The Unix makefile still advertises X11/GLX/DGA-era client builds tied to
/usr/X11R6headers and Glide-era Mesa copies, while the legacy README calls for XFree86 with DGA/VidMode mouse paths and Glide-specific OpenGL drivers—none of which are wired into current automated validation or available on modern distributions. Linux GLX shutdown now detaches any current context, destroys partial contexts/windows only when present, restores VidMode/gamma state, closes the QGL log, and guards the end-frame swap after shutdown or partial init failure. Linux joystick probing now prefers/dev/input/js*before the historical/dev/js*nodes, caps retained button/axis translation to the exposed Quake key ranges, updatesui_joyavail, and closes the joystick descriptor on shutdown or cvar restart; Linux input shutdown now also releases the retained X mouse grab before clearing mouse availability and activity state, but that is still retained Linux rendering/input compatibility rather than a modern input stack.【F:src/code/unix/Makefile†L4-L198】【F:src/code/unix/README.Linux†L68-L177】 - Audio path is still OSS-first, with a bounded silent sink. The shipped Linux instructions require mmap’ing
/dev/dspwith permissive device permissions, so there is still no ALSA/PulseAudio shim or SDL abstraction to satisfy a real modern sound backend on contemporary systems. The Linux OSS sound backend can now opt into a silent DMA sink withsnddevice null,none, orsilent, and the OSS path now closes its file descriptor and unmaps the mmap DMA buffer on shutdown; this is useful for headless/client smoke work but is not full audio parity.【F:src/code/unix/README.Linux†L161-L177】 - Platform syscall coverage remains partial, but the old Unix profiling, clipboard, unconditional data-root, module-root, event-packet, and Linux sound-lifecycle stubs are now bounded.
Sys_LowPhysicalMemory()now queries physical page counts throughsysconf(), andSys_FunctionCmp()/Sys_FunctionCheckSum()now use Linux/glibc symbol metadata (dladdr1(..., RTLD_DL_SYMENT)) plusCom_BlockChecksum()to compare and checksum function bodies when symbol sizes are available.Sys_MonkeyShouldBeSpanked()now reconstructs the retainedq3monkeyidrelease-marker probe from the historical Unix build lane,Sys_BeginProfiling()/Sys_EndProfiling()now pause or resumemoncontrol()and flush_mcleanup()when the Unix engine is built withQL_ENABLE_GPROF=1,Sys_GetClipboardData()now exposes a bounded clipboard retrieval path throughwl-paste,xclip, orxselwhen the surrounding Wayland/X11 environment is present,Sys_CheckCD()now probes configuredbaseq3roots fordefault.cfg,pak00.pk3, orpak0.pk3instead of unconditionally succeeding, UnixSys_LoadDll()now clears failed-load outputs, validates module exports, and closes incompatible candidates while probing cwd,fs_homepath,fs_basepath, andfs_cdpathfor native modules, and UnixSys_GetEvent()now queues only unread packet bytes afternetmsg.readcount. The null host/runtime now carries current executable-name, path, timer, and loopback-network scaffolding plus browser/advert/input shim entry points, input bootstrap cvars and a no-device key-event pump, a renderer GL init refusal, and an explicit null silent DMA sink plus sound/device activation/voice stubs instead of the old staleFILE *,NET_StringToAdr,Com_Init( argc, argv ), and missing web-host/audio/input entry points.【F:src/code/unix/unix_main.c†L102-L208】
Blockers and next steps
- Modernise the Unix client toolchain by replacing the XFree86/GLX/DGA assumptions with SDL2 or a contemporary GL loader, then gate Linux client builds in a reproducible validation lane once the dependency chain works on current distros.【F:src/code/unix/Makefile†L4-L198】【F:src/code/unix/README.Linux†L68-L155】 Document interim skips for any renderer/input tests that assume GLX or DGA until the migration lands.
- Add a real audio shim layer that can select ALSA/PulseAudio/SDL-style backends so
/dev/dspis no longer required for audible Linux client runs; the current silentsnddevice nullsink is only a bounded headless bridge, so skip Linux sound validation tests until a real adapter exists.【F:src/code/unix/README.Linux†L161-L177】 - Decide whether BSD/macOS-style Unix ports need equivalents of the current Linux/glibc compare/checksum and
gprof-control helper paths before broadening non-Windows validation claims. The retainedq3monkeyidmarker detection is now reconstructed, but the externalspank.shchecksuming script itself remains historical release tooling rather than a checked-in runtime dependency.【F:src/code/unix/unix_main.c†L102-L208】