Compiling Quake With 1997 Tools Is a Trip
Fabien Sanglard’s guide reads like a point-and-click adventure game, and that’s kind of the point
Fabien Sanglard wrote a guide to compiling Quake using the exact tools from 1997, and honestly? Reading it feels less like a tutorial and more like solving Monkey Island puzzles. Nothing makes sense until suddenly it does.
But that’s the authentic 90s development experience, apparently.
The Setup
When Quake shipped in ’96, id Software was using this weird mix of HP workstations running NeXT, cross-compiling with DJGPP on DEC Alpha servers. After shipping, Carmack switched the team to Windows NT and Visual C++ 4.x. That’s where winquake.exe and glquake.exe came from.
Sanglard wanted to recreate that exact environment. You know, for fun.
How Authentic Do You Want to Get?
He offers a spectrum:
- Find an actual Intergraph RealizM Dual P6-200MHz workstation — the exact hardware id used. Good luck with that.
- Find any dual Pentium Pro machine — still hard, but technically possible
- Use a “period-appropriate” PC — Sanglard’s approach
- Just use a VM — what most sane people will do
The wild part is that option 4 actually works. A virtual machine running Windows NT 4.0 from 1996 can compile code from that era and produce working binaries. Try doing that with a web framework from 2021.
Installation Is Where Things Get Weird
Installing Windows NT 4.0 takes about 30 minutes. The boot screen is almost zen—just reports how many CPUs and how much RAM you have. No fancy animations. No logo. Just facts.
One fun detail: NT 4.0 supported multiple processors, but if you wanted to add a second CPU, you had to reinstall the whole OS to get the right HAL (Hardware Abstraction Layer). And on dual-socket boards, you’d need an extra voltage regulator. The 90s, man.
Visual C++ 6.0 (slightly newer than period-accurate, but close) looks hilarious at modern resolutions. Everything’s cramped and off-center at 1280×1024 because Microsoft expected 640×480. They really didn’t see the future coming.
The File Format Trap
Here’s where it gets adventure-game-puzzle levels of frustrating. The .dsw workspace files are incredibly fragile.
Sanglard’s warning: “DO NOT get the source from github or transfer the files via FTP. This will mess up the workspace .dsw file. Then VC++6 will be unable to parse it. And it won’t even give you an error message, it will just open and show no file / project associated.”
No error. No warning. Just… nothing. Classic 90s software behavior.
You have to download the original q1source.zip from a curated archive with the exact file format and line endings intact. Any modernization breaks everything silently.
Your First Build Will Fail
Michael Abrash’s hand-optimized assembly code needs the VC++ Processor Pack. So you run vcpp5.exe. It fails. You need MDAC 2.5 first. So you download MDAC. Wrong—you need to run a specific setup.exe from a subfolder that gets created during the processor pack’s failed extraction.
Sanglard: “By now it should feel like you are following the solution of Monkey Island. Nothing makes sense.”
This was normal. Installation was a skill. You learned which order to do things through trial and error and passing knowledge around forums. The idea that software should “just work” is weirdly recent.
VC++ 6.0 Was Actually Pretty Good
Despite all this, once you got it working, Visual C++ 6.0 was impressive for its time:
- Click a function, jump to its definition
- Set breakpoints with conditions
- Actual stack traces when things crash
- Inspect variables while debugging
No autocomplete yet, but for devs coming from command-line compilers and printf debugging, this was space-age stuff.
Why Bother?
A few reasons:
Preservation. As tools get easier, we lose understanding of what’s underneath. Building Quake this way forces you to think about compiler flags, assembler integration, how linkers actually work.
Old software was built different. A VM can run a development environment from 1996 and produce working binaries. The fundamentals haven’t changed that much in 30 years—new tools add convenience, but the core workflow is recognizable.
Constraints bred creativity. Quake’s performance came from developers who knew their tools cold, right down to hand-optimized assembly. Modern abstractions trade that intimacy for productivity. Fair trade, usually. But something’s lost.
It’s fun. Vintage computing people get this. It’s not just nostalgia—it’s understanding where everything came from.
Source: Fabien Sanglard – Let’s compile Quake like it’s 1997!