Windows Native Development를 고쳤다
I’m happy to translate the article for you, but I don’t have access to the content at the URL you provided. Could you please paste the text you’d like translated (excluding any code blocks or URLs you want to keep unchanged)? Once I have the material, I’ll translate it into Korean while preserving the original formatting and markdown.
빌드 요구 사항: Visual Studio 설치
아직 이 사실을 모를 정도로 운이 좋다면, 부러워요. 안타깝게도 지금은 보로미어조차도 알고 있죠…
잘 말했어요, 보로미어.
“Visual Studio 설치”의 숨은 비용
Visual Studio 를 의존성으로 명시하면 Microsoft의 Visual Studio Installer 에 대한 무보수 기술 지원 담당자가 됩니다.
코드 작성에 집중하는 대신 다음과 같은 일을 하게 됩니다:
- 기여자에게 “Desktop development with C++” 워크로드, v143 빌드 도구, 그리고 10.0.22621.0 SDK (다른 SDK가 아님)를 설치해야 한다고 설명하기.
- 누락되거나 버전이 맞지 않는 구성 요소 때문에 발생하는 빌드 오류를 해결하느라 몇 시간을 소비하기.
- 하나의 잘못된 체크박스로 전체 설정이 망가질 수 있어 OS를 여러 번 재설치하기.
“Visual Studio 설치”라고 말하는 것은 사실 죽음의 골목이 가득한 선택형 모험 책을 기여자에게 건네는 것과 같습니다—그 중 일부는 처음부터 다시 시작하도록 강요합니다.
왜 이 비극이 Windows에만 국한될까?
| 플랫폼 | 일반적인 경험 |
|---|---|
| Linux | apt, yum, pacman 중 하나의 명령만으로 전체 툴체인을 보통 한 번에 설치합니다. |
| Windows | Visual Studio는 수천 개의 구성 요소를 포함한 거대한 모놀리식이며 GUI 설치 프로그램을 통해 제공됩니다. 올바른 Workloads 혹은 Individual Components 를 선택하려면 체크박스 미로를 헤매야 합니다. 잘못된 항목을 선택하면 불필요한 파일이 기가바이트 단위로 추가되고, 하나의 구성 요소(예: Windows 10 SDK (10.0.17763.0) 혹은 Spectre‑mitigated libs)를 놓치면 몇 시간 뒤에 MSB8101 같은 난해한 오류가 발생합니다. |
생태계는 편집기, 컴파일러, SDK 를 하나의 얽힌 웹으로 혼합합니다. “Visual Studio”를 의존성으로 나열하면 다음을 구분하지 못합니다:
- 코드를 작성하는 IDE.
- 빌드에 필요한 컴파일러/툴셋.
- 링크와 패키징에 필요한 런타임 SDK.
빠르게 복합되는 고통 포인트
- 수시간 대기 – 50 MB 컴파일러를 위해 15 GB를 다운로드해야 함.
- 투명성 부족 – 어떤 파일이 설치됐는지, 어디에 있는지 명확히 알 수 없으며 레지스트리가 잡동사니로 가득 차고 백그라운드 업데이트 서비스가 작업 관리자를 영구 점유함.
- 버전 관리 불가 – 컴파일러를 Git에 체크인할 수 없음. 팀원 간 미세한 버전 차이가 조용히 빌드 차이를 만들음.
- ‘유령’ 환경 – 제거해도 완전히 정리되지 않음. 새 머신으로 옮기면 동일한 체크박스를 다시 선택해야 하는 GUI 작업을 반복해야 함.
- 취약한 명령줄 사용 – 단일 C 파일을 컴파일하려면 Developer Command Prompt 를 실행해야 하는데, 이는
vcvarsall.bat를 호출합니다. 이 배치 스크립트는 매번 전역 환경 변수를 변경해 설정을 쉽게 부서뜨립니다.
결과적인 빌드 지침
“내 머신에서는 VS 17.4.2 (Build 33027.167)와 SDK 10.0.22621.0으로 동작합니다.
17.5를 사용 중이라면 Issue #412를 참고하세요.
ARM64라면 행운을 빕니다.”
Windows에서는 이것이 사업을 영위하는 데 드는 비용이 되었습니다—5 MB 실행 파일을 만들기 위해 20 GB를 설치해야 하며, 사실상 네이티브 개발을 억제합니다.
핵심 요약: “Visual Studio”를 하나의 의존성으로 나열하면 거대하고 불투명하며 깨지기 쉬운 툴체인이 가려집니다. 구성 요소별로 명시하거나 가볍고 재현 가능한 빌드 환경을 제공하면 기여자들이 겪는 수많은 트러블슈팅 시간을 크게 절감할 수 있습니다.
Source: …
MSVC 툴체인을 새로운 방식으로 사용하기
다른 사람의 설치 프로그램을 “인간 디버거”처럼 고치는 데 지쳤습니다. MSVC 툴체인이 버전 관리되고, 격리되며, 선언형인 현대적인 의존성처럼 동작했으면 합니다.
몇 주간의 작업 끝에 바로 그 기능을 구현한 오픈‑소스 CLI 도구 msvcup 를 만들었습니다.
- 몇 분 안에 MSVC 툴체인과 Windows SDK를 설치합니다(네트워크·하드웨어가 괜찮다면).
- 각 버전은 자체 격리 디렉터리에 존재합니다.
- 멱등성 보장 – 매 빌드마다 실행해도 비용이 없습니다.
아래는 Visual Studio를 전혀 설치하지 않고 간단한 프로그램을 컴파일하는 최소 예시입니다.
1. 소스 파일 hello.c 만들기
#include <stdio.h>
int main() {
printf("Hello, World\n");
}
2. 빌드 스크립트 build.bat 만들기
@setlocal
rem -------------------------------------------------
rem msvcup이 아직 없으면 다운로드
rem -------------------------------------------------
@if not exist msvcup.exe (
echo msvcup.exe: installing...
curl -L -o msvcup.zip ^
https://github.com/marler8997/msvcup/releases/download/v2026_02_07/msvcup-x86_64-windows.zip
tar xf msvcup.zip
del msvcup.zip
) else (
echo msvcup.exe: already installed
)
@if not exist msvcup.exe exit /b 1
rem -------------------------------------------------
rem 원하는 버전 선택
rem -------------------------------------------------
set MSVC=msvc-14.44.17.14
set SDK=sdk-10.0.22621.7
rem 선택한 툴체인/SDK 설치 (멱등)
msvcup install --lock-file msvcup.lock --manifest-update-off %MSVC% %SDK%
@if %errorlevel% neq 0 (exit /b %errorlevel%)
rem cl.exe를 올바른 도구에 연결하는 “자동 환경” 생성
msvcup autoenv --target-cpu x64 --out-dir autoenv %MSVC% %SDK%
@if %errorlevel% neq 0 (exit /b %errorlevel%)
rem 생성된 환경을 이용해 프로그램 컴파일
.\autoenv\cl hello.c
3. 스크립트 실행
> build.bat
- 첫 실행에서는 msvcup을 다운로드하고, 요청한 MSVC 버전과 Windows SDK를 설치한 뒤
hello.c를 빌드합니다. - 이후 실행은 즉시 완료됩니다 –
msvcup install과autoenv단계가 이미 캐시되어 몇 밀리초 안에 끝납니다.
왜 이것이 중요한가
- Visual Studio 설치 프로그램 없음 – 이 스크립트는
curl/tar(2018년부터 제공) 가 설치된 Windows 10 이상 머신에서 작동합니다. - 재현 가능한 빌드 – 정확한 툴체인 버전이 스크립트에 (
MSVC및SDK변수) 선언되어 있습니다. - 격리 – 각 버전은 자체 디렉터리에 존재하며 레지스트리나 전역 환경을 오염시키지 않습니다.
- 속도 – 첫 실행 이후 오버헤드가 거의 없으므로 CI 파이프라인이나 개발자별 스크립트에 명령을 안전하게 유지할 수 있습니다.
잠시 시간을 내어 시도해 보고, 거대한 Visual Studio 설치 프로그램에서 독립 선언을 즐기세요. 이제 빌드는 완전히 자체 포함되고 최신 Windows 머신 어디서든 포터블합니다.
How?
msvcup은 Mārtiņš Možeiko가 만든 작은 Python 스크립트에서 영감을 받았습니다.
핵심 아이디어는 Microsoft가 JSON 매니페스트를 공개한다는 점인데, 이 매니페스트는 Visual Studio의 모든 구성 요소를 설명합니다—공식 설치 프로그램이 바로 이 매니페스트를 사용합니다.
msvcup은 이러한 매니페스트를 파싱하고, 컴파일에 필요한 패키지(컴파일러, 링커, 헤더, 라이브러리)만 선택하여 Microsoft CDN에서 직접 다운로드합니다. 모든 파일은 C:\msvcup\ 아래 버전별 디렉터리에 배치됩니다.
잠금 파일, 교차 컴파일 및 기타 기능에 대한 자세한 내용은 msvcup README.md를 참고하세요.
Automatic environment
우리의 build.bat 스크립트는 일반적인 Developer Environment 배치 파일을 전혀 호출하지 않습니다.
스크립트에는 두 개의 msvcup 명령이 들어 있습니다:
- 툴체인/SDK 설치 – 이 과정에서 표준
vcvars스크립트도 함께 설치됩니다. - “Automatic Environment” 생성 –
msvcup autoenv는 래퍼 실행 파일이 들어 있는 디렉터리를 만들고, 이 래퍼가 필요한 환경 변수를 설정한 뒤 실제 도구를 호출하도록 합니다.
생성된 디렉터리에는 toolchain.cmake 파일도 포함되어 있어, CMake 프로젝트가 설치된 도구를 찾을 수 있게 합니다. 이를 통해 특별한 환경 없이도 CMake 프로젝트를 외부에서 빌드할 수 있습니다.
Real‑world usage
Tuple(페어 프로그래밍 앱)에서는 msvcup을 빌드 시스템과 CI 파이프라인에 통합했습니다. 이를 통해 사용자나 CI 에이전트가 Visual Studio를 미리 설치할 필요가 없어졌습니다. Tuple은 수백 개의 C/C++ 프로젝트(예: WebRTC)를 x86_64와 ARM 타깃 모두에서 컴파일하며, CI와 모든 개발자가 동일한 툴체인/SDK를 사용하도록 유지합니다.
Benefits
- 버전별 설치 – 각 버전이 별도 디렉터리에 존재하므로, 나란히 설치하거나 제거·재설치가 매우 간단합니다.
- 교차 컴파일 즉시 사용 –
msvcup은 지원되는 모든 교차 타깃용 도구를 자동으로 다운로드하므로, 추가 구성 요소를 찾아다닐 필요가 없습니다. - 잠금 파일 지원 – 모든 페이로드 URL을 포함한 자체 포함 리스트가 있어, 모든 사용자가 동일한 패키지를 사용함을 보장합니다. 업스트림 변경 사항도 즉시 드러납니다.
- 엄청나게 빠름 –
install과autoenv는 멱등적이며, 할 일이 없을 때는 몇 밀리초 안에 완료됩니다.
더 이상 “내 머신에서는 2019 Build Tools가 설치돼 있어서 동작한다”는 변명이 없습니다.
더 이상 레지스트리에서cl.exe위치를 찾아 헤맬 필요도 없습니다.
msvcup을 사용하면 환경이 코드로 정의되고, 머신 간에 이식 가능하며, 몇 밀리초 만에 컴파일 준비가 됩니다.
Limitations
msvcup은 핵심 컴파일 툴체인에 초점을 맞춥니다. 다음이 필요하다면:
- 전체 Visual Studio IDE,
- MSBuild 기반 프로젝트 시스템,
- C++/CLI 컴파일러와 같은 구성 요소,
여전히 공식 설치 프로그램을 사용해야 합니다. 하지만 대부분의 네이티브 개발 워크플로에서는 msvcup이 실제로 필요한 모든 것을 제공합니다.
Source: …
실제 예시: raylib 빌드
아래는 깨끗한 Windows 시스템에서 소스 코드로부터 raylib를 빌드하는 자체 포함 배치 스크립트입니다.
이 스크립트는 msvcup을 사용해 필요한 MSVC와 Windows SDK 툴체인을 설치한 뒤, Visual Studio 설치, GUI, 수동 단계 없이 라이브러리를 컴파일합니다.
@setlocal
rem -------------------------------------------------
rem Configuration
rem -------------------------------------------------
set TARGET_CPU=x64
set MSVC=msvc-14.44.17.14
set SDK=sdk-10.0.22621.7
rem -------------------------------------------------
rem Install msvcup (if not already present)
rem -------------------------------------------------
if not exist msvcup.exe (
echo msvcup.exe: installing...
curl -L -o msvcup.zip ^
https://github.com/marler8997/msvcup/releases/download/v2026_02_07/msvcup-x86_64-windows.zip
tar xf msvcup.zip
del msvcup.zip
)
rem -------------------------------------------------
rem Install the selected toolchains
rem -------------------------------------------------
msvcup.exe install --lock-file msvcup.lock --manifest-update-off %MSVC% %SDK%
if %errorlevel% neq 0 exit /b %errorlevel%
rem -------------------------------------------------
rem Clone raylib (if not already present)
rem -------------------------------------------------
if not exist raylib (
git clone https://github.com/raysan5/raylib -b 5.5
)
rem -------------------------------------------------
rem Load the toolchain environment
rem -------------------------------------------------
call C:\msvcup\%MSVC%\vcvars-%TARGET_CPU%.bat
call C:\msvcup\%SDK%\vcvars-%TARGET_CPU%.bat
rem -------------------------------------------------
rem Build raylib for Windows
rem -------------------------------------------------
cmd /c "cd raylib\projects\scripts && build-windows"
if %errorlevel% neq 0 exit /b %errorlevel%
rem -------------------------------------------------
rem Success message
rem -------------------------------------------------
echo Build succeeded! Executable located at:
echo .\raylib\projects\scripts\builds\windows-msvc\game.exe
이 스크립트가 하는 일
msvcup설치 (MSVC/SDK용 작은 다운로더) – 아직 머신에 없으면 설치합니다.MSVC와SDK변수에 지정된 정확한 버전의 MSVC와 Windows SDK를 설치합니다.raylib저장소(브랜치 5.5)를 폴더가 없을 때만 클론합니다.- 새로 설치된 툴체인의
vcvars‑*.bat스크립트를 호출해 컴파일러 환경을 설정합니다. raylib\projects\scripts에 있는 공식build-windows스크립트를 실행합니다.- 빌드가 성공하면 생성된
game.exe의 경로를 출력합니다.
Visual Studio 없이, GUI 없이, 수동 설정 없이—스크립트만으로 재현 가능한 빌드입니다.
추가 읽을거리:
Windows에서 msvcup을 사용해 LLVM 및 Zig를 처음부터 빌드하는 자세한 과정은 여기에서 확인할 수 있습니다.