빌더 시스템이란?
빌더 시스템은 소스 코드들을 실행 파일 또는 라이브러리로 만들어주는 자동화된 처리 과정을 담당하는 도구를 가리킴.
- 소스 코드를 실행 가능한 프로그램 또는 라이브러리 (or 패키지)으로 자동으로 변환하는 도구 및 프로세스 집합임.
- 컴파일, 링킹, 의존성 추적, 리소스 복사, 테스트 실행까지 포함될 수 있음.
추상화 정도에 따라 다음으로 분류됨.
Build Executor | - 저수준 - 실제 컴파일러/링커를 호출 - CMake 등으로 생성된 빌드 스크립트를 실행 |
Make, Ninja |
Build System (Tool-Chain) |
- 고수준 - 의존성 관리, 테스트, 빌드, 배포 포함한 전체 워크플로우 담당 |
MSBuild, Gradle, Bazel |
Bundler | - 웹 프론트엔드 자원(JS, CSS 등)들을 하나로 합쳐주는 도구 - 빌드보다는 패킹에 초점 |
Webpack, Parcel, Vite |
Python의 setuptools등은 Python 전용 Build System이라고 볼 수 있음(컴파일은 하지 않으나 패키징과 의존성 명시, 설치 배포 등이 포함된 면에서 유사)
빌드 프로세스 순서도 (Classic Builder)
소스 코드 (.cpp, .c, .h 등)
│
▼
[빌드 설정 생성 도구]
└─> CMake / Meson / Gradle / Bazel ...
│
▼
[빌드 실행 도구]
└─> Make / Ninja / MSBuild / Gradle / Bazel / Webpack
│
▼
[컴파일러 / 링커]
└─> g++, clang++, MSVC, javac, emcc ...
│
▼
[결과물 생성]
└─> 실행 파일, 라이브러리, 웹 번들 등
- 소스코드(.cpp/.c)에서
- CMake 등 메타 빌더 를 통한 빌드 과정을 구성.
- Make/Ninja 등 저수준 빌더 를 통해 CMake가 작성한 빌드 과정을 수행.
- 빌드 과정 수행 중 g++, clang++ 등 컴파일러 호출을 통한 컴파일과
- 링커(ld)에 의한 링킹이 이루어지고
- 실행파일(.out) 을 지정한 위치에 이동시키는 설치 또는 압축 등을 이용한 패키징이 이루어짐.
빌더(예: Make/Ninja)는 직접 컴파일러(g++, clang++, MSVC 등)를 실행하는 방식으로 동작함.
- 빌더는 .cpp → .o → 실행파일로 이어지는 컴파일 및 링킹 명령을 정의된 규칙에 따라 호출함
- 컴파일러는 실제로 소스 코드를 머신 코드로 변환
- 링커는 여러 오브젝트 파일(.o/.obj)을 실행 파일로 결합
Classic Builder 요약
분류 | Tool | 주요 프로그래밍언어 | Desc. | 공식 사이트 |
Meta Builder | CMake | C/C++ | 플랫폼 독립적인 빌드 구성 생성 도구 | cmake.org |
Build Executor | Make | C/C++ 외 다수 | GNU의 전통적인 빌드 도구로 Makefile을 기반으로 동작. | gnu.org |
Build Executor | Ninja | C/C++ | Make보다 빠르고 간결한 빌드 시스템 | ninja-build.org |
Build System Tool-chain |
MSBuild | C#, C++ | Visual Studio의 기본 빌드 시스템 | MSBuild |
Build System Tool-chain |
Bazel | 다수 (C++, Java 등) | Google의 대규모 프로젝트용 빌더 | bazel.build |
Build System Tool-chain |
Gradle | Java, Kotlin | JVM 생태계용 빌더 도구 | gradle.org |
Bundler | Webpack | JavaScript | JS/React/SCSS 등 프론트엔드 번들러 | webpack.js.org |
- CMake
- Makefile, Ninja 파일(build.ninja), MSBuild 솔루션 등 다양한 빌드 스크립트를 생성함.
- 즉, CMake는 Make나 Ninja가 사용할 빌드 파일을 자동 생성하는 도구: Meta Build System
- CMakeLists.txt를 해석 → Makefile 또는 build.ninja 생성
- Make
- 주로 CMake가 만든 Makefile을 읽고 이를 바탕으로 소스 빌드를 수행.
- 의존성을 고려하여 실행되며, 가장 역사가 깊은 전통적인 빌더 시스템임.
- 규칙 기반의 빌드 실행, 자동화 가능
- 비교적 단순하지만 대규모 병렬 빌드나 복잡한 의존성 처리엔 한계
- Ninja
- Make를 좀 더 개선한 빌더 시스템
- 매우 빠르고 병렬처리가 가능한 장점을 가짐: Make에 비해 빌드 스크립트가 간결하고 빠르지만, 사람이 직접 쓰기엔 불편
- 때문에 CMake를 통해 build.ninja 스크립트를 작성하는 것이 일반적임.
- CMake에서 -G Ninja로 사용 가능
- MSBuild
- Visual Studio 기반의 빌드 도구
- .sln/.vcxproj 파일을 처리, Windows 플랫폼에 최적화
- Bazel
- Google이 만든 고성능 빌드 시스템
- 대규모 프로젝트에 사용됨.
- Gradle
- Java/Kotlin 프로젝트에서 사용됨.
- 의존성 관리, 빌드 캐시, Android 개발에 사용
- Webpack
- avaScript 웹 애플리케이션 개발용.
Python 생태계의 빌드 도구
Tool | 기능 | Classic Builder 여부 | Desc. |
setuptools | 파이썬 패키지 빌드 및 설치 | No | setup.py 기반. wheel 생성 |
distutils | setuptools의 전신 | No | deprecated 됨 |
poetry | 의존성 + 빌드 + 배포 자동화 | No | pyproject.toml 기반 |
flit | 간단한 패키징 도구 | No | 빠르고 간편 |
hatch | 다중 환경 빌드 + 테스트 지원 | No | 최신 Python 빌더 중 하나 |
- Python의 빌드 도구들은 실행파일을 생성하는 빌더라기보다는 패키징 도구로 분류되기도 함.
- setuptools
- Python 패키지 배포 및 설치 자동화
- setup.py 기반, pip install . 또는 python setup.py install 등으로 활용
- 공식사이트 https://setuptools.pypa.io
- Poetry
- Python 세계의 CMake + conda 느낌
- dependency 관리와 빌드를 동시에 처리하는 modern Python 도구
- 공식사이트 https://python-poetry.org/
- C/C++ 확장이 있을 경우, CMake + Ninja 조합이 선호됨.
Classic Builder vs Python 패키징 도구
항목 | Classic Builder | Package Builder |
주요목적 | 실행 파일/라이브러리 생성 | 패키지(.whl/.tar.gz) 생성 |
대상 언어 | C/C++, Java, JS 등 | Python |
입력 | .c, .cpp | .py, pyproject.toml |
출력 | 실행파일(.out), .so/.dll | .whl, .tar.gz |
증분 빌드 | 가능 | 대부분 불가 |
의존성 관리 | 간접 지원 | 명시적 지원(pyproject.toml 등) |
컴파일러/링커 호출 여부 | 직접 호출 | 대부분 호출하지 않음 |
요약 정리
- CMake, Make, Ninja, MSBuild 등은 전통적인 빌더 시스템.
- Python의 setuptools, poetry 등은 패키징 중심의 빌더 도구.
- 빌더 시스템은 컴파일 + 링킹 → 실행 파일 생성을 담당하는 반면,
Python 빌더는 패키지 단위 배포를 위한 구조를 제공.
목적 | 추천 도구 |
일반 C++ 프로젝트 | CMake + Ninja or Make |
Visual Studio | MSBuild |
대규모 C++ (Google 등) | Bazel |
Java/Kotlin/Android | Gradle |
웹 프론트엔드 | Webpack |
Python 확장 패키지 | setuptools + CMake |
'utils' 카테고리의 다른 글
[ipython] Shortcut (단축키) - readline editors (0) | 2025.04.09 |
---|---|
[vscode] Refactoring (0) | 2025.04.02 |
[vim] 마우스 설정 (1) | 2025.01.20 |
[vim] vim-plug 이용: nvim-treesitter, gruvbox (0) | 2025.01.20 |
[vscode] gcc 사용한 C/C++ 프로젝트 환경 구축. (1) | 2025.01.19 |