Quake를 1997년처럼 컴파일하기: 레트로 개발 여정

현대 개발자에게 “컴파일”이라는 행위는 보통 정교한 IDE에서 몇 번 클릭하거나 터미널에서 한 줄 명령으로 이루어지며, 의존성은 패키지 매니저가 자동으로 처리합니다. 그러나 1997년에는 Quake와 같은 최첨단 타이틀을 만드는 것이 특정 하드웨어, 불안정한 툴체인, 그리고 수동 설정을 요구하는 위험한 춤과도 같았습니다.

이 환경을 재현하는 것은 단순한 향수 여행을 넘어, 소프트웨어 엔지니어링의 진화와 초기 3D 시대를 정의한 실용적 변화를 연구하는 일입니다. 이 가이드는 당시의 도구와 운영 체제를 사용해 Quake의 Win32 바이너리를 재구축하는 과정을 탐구합니다.

Quake 스택의 진화

Quake의 개발은 하나의 환경에서 이루어지지 않았습니다. 초기 실행 파일인 quake.exevquake.exe는 NeXT를 실행하는 HP 712-60 워크스테이션에서 프로그래밍되고, DEC Alpha 서버 2100A에서 DJGPP를 사용해 크로스 컴파일되었습니다. 그러나 NeXT가 정체되자, id Software는 1996년 6월에 중대한 전환을 이루었습니다.

John Carmack가 언급했듯이, 팀은 Quake를 출시한 직후 Windows NT를 실행하는 Intergraph 하드웨어로 이동했습니다. 이 전환은 winquake.exe, glquake.exe, 그리고 QuakeWorld(qwcl.exeqwsv.exe)의 기반을 마련했으며, 이들 모두는 Visual C++ 4.X를 사용해 Windows NT에서 개발 및 컴파일되었습니다.

1997년 환경 재현

역사적 정확성을 위해서는 목표 환경을 선택해야 합니다. “순수주의자” 경로는 Intergraph RealizM Dual P6-200MHz 워크스테이션이나 듀얼 Pentium Pro 머신을 찾는 것을 의미하지만, 보다 접근하기 쉬운 방법은 90년대 후반 PC나 Windows 98SE 또는 Windows NT 4.0을 실행하는 VirtualBox VM을 사용하는 것입니다.

Windows NT 4 설정

Windows NT 4 설치는 간단한 과정이지만, 그 시대의 미니멀리즘을 드러냅니다. Windows 95/98와 달리 NT 4는 불필요한 애니메이션 없이 부팅 시 감지된 CPU와 RAM을 자랑스럽게 표시했습니다. 당시의 주요 기술적 특이점은 두 번째 CPU를 추가해도 자동으로 감지되지 않았으며, OS를 완전히 재설치해야 SMP(대칭 다중 처리) 시스템에 필요한 하드웨어 추상화 계층(HAL)을 구현할 수 있었다는 점입니다.

툴체인: Visual C++ 6

Quake는 원래 VC++ 4.X로 코딩되었지만, 프로젝트는 1999년까지 Visual C++ 6으로 이전되었습니다. 오늘날 VC++ 6을 설정하려면 Internet Archive나 winworldpc.com과 같은 아카이브에서 설치 프로그램을 찾아야 합니다.

현대 고해상도 모니터(예: 1280x1024)에 VC++ 6을 설치하면 즉시 눈에 띄는 점은 어색한 레이아웃입니다. 설치 프로그램은 640x480 또는 800x600 해상도를 위해 설계되었으며, 넓은 빈 공간이 남아 중 90년대의 디스플레이 표준을 떠올리게 합니다.

빌드 과정과 함정

Quake를 컴파일하는 것은 프로젝트를 열고 “Build”를 클릭하는 것만큼 간단하지 않습니다. 부주의한 사람들을 위한 몇 가지 중요한 함정이 있습니다:

  1. 소스 무결성: 소스 코드는 특정 아카이브(예: Quake Official Archive)에서 받아야 합니다. GitHub에서 다운로드하거나 FTP를 ASCII 모드로 전송하면 .dsw(워크스페이스) 파일이 손상되어 IDE가 프로젝트를 파싱하지 못하고 오류 메시지를 제공하지 않을 수 있습니다.
  2. 어셈블리 장벽: 일반적인 “Rebuild All”은 처음에 실패합니다. 이는 Quake가 Michael Abrash가 손수 최적화한 .s 파일에 저장된 어셈블리 코드에 의존하기 때문이며, 이 코드는 기본 VC++ 6 설치에 포함되지 않은 ml.exe 어셈블러가 필요합니다.
  3. 의존성 체인: ml.exe를 얻으려면 VC++ 6 Processor Pack을 설치해야 합니다. 그러나 Service Pack 5(setupsp5.exe)를 설치하려면 먼저 MDAC 2.5가 설치되어 있어야 합니다. 해결책은 종종 압축 해제 폴더에 mdac_typ.exe로 숨겨져 있습니다.

이러한 의존성을 해결하면 프로젝트가 최종적으로 컴파일됩니다. 필요한 DLL(PmProXX.dll, WdirXX.dll)과 id1 폴더를 복사하면 게임을 플레이할 수 있게 됩니다.

레트로 엔지니어링에 대한 고찰

돌이켜보면 Visual C++ 6은 당시 강력한 도구였습니다. “Go to definition”, 브레이크포인트, 스택 트레이스, 변수 검사와 같은 기능은 1998년에 마법처럼 느껴졌으며, 현대의 IntelliSense 자동 완성은 없었지만 말이죠.

커뮤니티 토론은 Quake 코드베이스의 뛰어난 품질을 강조합니다. 일부 개발자는 프로젝트가 단 두 개의 경고만으로 컴파일된다고 언급하는데, 이는 John Carmack와 그의 팀이 유지한 엄격한 엔지니어링 표준을 증명합니다. 디버그 빌드에서 assert를 자유롭게 사용하고 경고 제로를 목표로 하는 이러한 수준의 규율은 오늘날 일반 게임 개발에서는 드뭅니다.

철학적 전환: 왜 Win32인가?

Win32로의 전환에 대한 John Carmack의 역사적 관점은 업계의 흐름을 이해하는 데 도움을 줍니다. 그는 TCP/IP 지원, 동적 링크, 강력한 가상 메모리 등 DOS의 한계를 뛰어넘는 장점을 들어 Win32를 불가피한 승자로 보았습니다. NeXTSTEP의 UI와 Unix 파워에 대한 깊은 애정은 유지했지만, 시장의 실용적 현실과 하드웨어 가속(OpenGL) 때문에 Windows NT가 id Software의 미래에 유일한 실현 가능한 선택이 되었습니다.

궁극적으로, 시대에 맞는 환경에서 Quake를 컴파일하는 것은 단순한 기술 연습을 넘어, 개발자들이 CPU 사이클 하나하나와 메모리 바이트 하나하나를 놓고 싸우며 현대 3D 엔진의 기반을 구축했던 시기를 들여다보는 창입니다.

Sources