Windows Native Build Targets

June 6, 2026 · View on GitHub

The Visual Studio solution under src/code/quakelive.sln now ships with dedicated native builds for the Quake Live gameplay modules plus the reconstructed awesomium_process.exe helper. The native module projects are copies of their VM counterparts, but the output is redirected to build/win32/<Config>/modules/<ProjectName>/, while the helper executable lands in build/win32/<Config>/bin/. The Visual Studio 2010 (v100) toolset is enforced so the produced binaries stay aligned with the shipping runtime.【F:src/code/game/qagamex86.vcxproj†L2-L135】【F:src/code/cgame/cgamex86.vcxproj†L2-L110】【F:src/code/awesomium_process.vcxproj†L1-L177】

The checked-in project defaults stay on v100 for parity, but the build scripts also support a v141 override for contributors on modern Windows hosts who do not have a working VS2010-compatible toolchain installed. Local build and launch helpers default to Debug|x86 so runtime debugging, PDB loading, crash logs, and dump capture remain available during reconstruction.

For runtime prerequisites and validation steps on WOW64 hosts, see the Windows 32-bit Runtime Guide. For the exact retail dependency matrix and a Steam-install verifier, see Retail Windows Dependency Audit. For the retail compiler/linker configuration evidence, see Retail Windows Toolchain Audit. For the retail font-system evidence and remaining source gaps, see Retail Font Stack Audit.

Available targets

Target nameProject fileOutput artifact
qagamex86src/code/game/qagamex86.vcxprojbuild/win32/<Config>/modules/qagamex86/qagamex86.dll
cgamex86src/code/cgame/cgamex86.vcxprojbuild/win32/<Config>/modules/cgamex86/cgamex86.dll
awesomium_processsrc/code/awesomium_process.vcxprojbuild/win32/<Config>/bin/awesomium_process.exe
qzerodedemitted by .vscode/build.ps1 after quakelive_steam.vcxproj completesbuild/win32/<Config>/bin/qzeroded.exe

The dedicated server alias intentionally follows the retail Quake Live dedicated tool basename qzeroded, which is preserved in the shipped Linux dedicated binary name qzeroded.x86. The repository’s Windows build emits qzeroded.exe as the matching host-side adaptation so server scripts and runtime probes can target the retail-aligned dedicated name even though no retail Windows dedicated executable has been recovered in the local corpus.

Building from the command line

Use the new project names as MSBuild targets when producing the native DLL set. These /t: selectors are the switches that route MSBuild toward the corresponding pipeline:

msbuild src\code\quakelive.sln /t:qagamex86;cgamex86;awesomium_process /p:Configuration=Debug /p:Platform=x86 /p:PlatformToolset=v100

The default VS Code build wrapper emits build/win32/Debug/bin/qzeroded.exe after a successful solution build by copying the reconstructed host binary and its matching debug artifacts (.pdb, .map) to the retail-aligned dedicated name. VS Code launches set QLR_DUMP_PATH=build\win32\Debug\dumps and QLR_FULL_DUMP=1; debug-build unhandled crashes show a confirmation dialog before writing a timestamped .dmp plus a matching .log file with the exception, register snapshot, dump type, and loaded module list.

The original VM builds remain available under the historical target names. For example, the following command rebuilds the interpreted modules while leaving the native DLLs untouched:

msbuild src\code\quakelive.sln /t:game;cgame /p:Configuration=Debug /p:Platform=x86

Modern compatibility override

If you want to keep the checked-in v100 project defaults but build the native targets with the Visual Studio 2017 compiler on a newer host, install the optional v141 toolset and pass it on the command line:

pwsh tools\ci\install-vs-toolset.ps1 -PlatformToolset v141
pwsh tools\ci\verify-vs-toolchain.ps1 -PlatformToolset v141 -RequireToolset
msbuild src\code\quakelive.sln /t:qagamex86;cgamex86;awesomium_process /p:Configuration=Debug /p:Platform=x86 /p:PlatformToolset=v141

This path is a deliberate compatibility exception. It improves buildability on modern systems, but it no longer reproduces the retail VC10 compiler/linker or CRT import surface.

awesomium_process.exe respects the same online-services policy as the rest of the launcher stack. Debug and ad hoc source builds still default QLBuildOnlineServices to 0, producing an offline-safe stub that exits cleanly without loading awesomium.dll. Windows Release-family configurations now default the helper to QLBuildOnlineServices=1, so release packages carry a WebUI-capable child-process launcher that resolves the retail Awesomium::ChildProcessMain entry point dynamically from an external awesomium.dll at runtime.

For strict SDK/import-table parity of the helper, set /p:QLBuildOnlineServices=1 /p:QLUseAwesomiumSdk=1 and point AwesomiumSdkDir or AWESOMIUM_SDK_DIR at an external Awesomium SDK:

msbuild src\code\awesomium_process.vcxproj /p:Configuration=Release /p:Platform=Win32 /p:PlatformToolset=v100 /p:QLBuildOnlineServices=1 /p:QLUseAwesomiumSdk=1 /p:AwesomiumSdkDir=C:\SDKs\Awesomium

For a parity-oriented rebuild of the helper, keep QLBuildOnlineServices=1 and run the dedicated verifier after the build. This checks the import surface and linker/header profile for the executable while keeping the proprietary SDK outside the repository:

pwsh tools\ci\verify-awesomium-process-parity.ps1

The VS Code default Build task and the Launch Debug Awesomium task both use the local online-services launch lane. That build enables the client's dynamic Awesomium loader with QLRequireAwesomiumSdk=0, writes build\win32\<Configuration>\bin\ql_build_settings.txt, and stages the retail Awesomium runtime payload from the Steam install root. The C/MSBuild project properties still default Debug builds to QLBuildOnlineServices=0; the VS Code task is an explicit local opt-in, while Release builds opt in by default. The Launch Quake Live debugger profile does not use a preLaunchTask, so run the build task explicitly before launching. The standalone launch.ps1 -EnableAwesomium path also refuses to start if the stamp reports QLBuildOnlineServices=0, because that offline build will always fall back to the menu path instead of showing the WebUI.

Repo-Managed Codec Bootstrap

The Windows MSBuild projects no longer probe Vcpkg or arbitrary system SDK locations for the non-retail codec stack. Instead, they bootstrap the repo-managed libogg, libvorbis, zlib, and libpng trees through tools/build_internal_deps.ps1, staging the resulting headers and import libraries under src/libs/vorbis/ and src/libs/libpng/.

That bootstrap expects the corresponding source trees to exist under src/libs/_deps/ and expects cmake to be available on PATH. Once those repo-managed sources are present, solution or project builds can invoke MSBuild directly and the codec prerequisites will be prepared automatically before the normal validation steps run.

These staged codec trees are still build-time conveniences, not part of the retail runtime surface: the Steam install does not ship vorbisfile.dll, ogg.dll, libpng16.dll, or zlib1.dll. Use pwsh tools/ci/validate-windows-native.ps1 -PlatformToolset v100 -RuntimeProfile retail to assemble and audit build\win32\<Config>\retail-runtime\, or rerun pwsh tools/ci/audit-retail-dependencies.ps1 -RuntimeRoot build\win32\Release\retail-runtime -SkipSteamInstall -Strict to re-check an existing staged runtime root directly. The mixed build\win32\<Config>\bin\ output can still carry those build-time codec DLLs, so the strict retail payload boundary now lives in the dedicated retail-runtime stage instead of the raw build directory.

Run pwsh tools/ci/audit-retail-toolchain.ps1 -Strict to verify that the retail-facing project files still match the recovered VC10-era build settings and that the local machine actually has the v100 toolset installed. Run pwsh tools/ci/audit-retail-metadata.ps1 to verify that the launcher version resources and embedded manifests still match the retail executables.

For a modern-host build verification pass that keeps the checked-in v100 defaults intact but compiles with v141, run:

pwsh tools\ci\validate-windows-native.ps1 -PlatformToolset v141 -RuntimeProfile modern

For the strict retail validation lane, run:

pwsh tools\ci\validate-windows-native.ps1 -PlatformToolset v100 -RuntimeProfile retail

That lane now stages build\win32\<Config>\retail-runtime\ from the rebuilt executables and gameplay/UI DLLs plus the exact retail launcher DLL payload in assets\quakelive\, then fails fast if an extra non-retail DLL appears in that staged runtime root.

When you target a .vcxproj directly, keep using /p:Platform=Win32. The solution-level builds use x86 because that is the platform name advertised by src/code/quakelive.sln.

Verifying incremental builds

To confirm that MSBuild’s tracking stays intact for both pipelines, run each set of switches twice in a row. The second invocation should report that every project is already up to date (look for "Project is up-to-date" or "Skipping project" in the output):

msbuild src\code\quakelive.sln /t:qagamex86;cgamex86;awesomium_process /p:Configuration=Debug /p:Platform=x86
msbuild src\code\quakelive.sln /t:qagamex86;cgamex86;awesomium_process /p:Configuration=Debug /p:Platform=x86
msbuild src\code\quakelive.sln /t:game;cgame /p:Configuration=Debug /p:Platform=x86
msbuild src\code\quakelive.sln /t:game;cgame /p:Configuration=Debug /p:Platform=x86

Successful “up-to-date” messages on the second pass confirm incremental builds are working for both the native DLLs and the legacy VMs.【F:src/code/game/qagamex86.vcxproj†L88-L135】【F:src/code/cgame/cgamex86.vcxproj†L67-L104】