본문 바로가기
utils

[Tool] Builder System (or Packaging System)

by ds31x 2025. 4. 6.

빌더 시스템이란?

빌더 시스템은 소스 코드들을 실행 파일 또는 라이브러리로 만들어주는 자동화된 처리 과정을 담당하는 도구를 가리킴.

  • 소스 코드를 실행 가능한 프로그램 또는 라이브러리 (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