빌드 시스템 비교 | CMake vs Make vs Ninja vs Meson 완벽 가이드
이 글의 핵심
빌드 시스템 비교 가이드입니다. CMake, Make, Ninja, Meson의 특징과 실무 선택 기준을 제시합니다.
들어가며: 빌드 시스템이란?
”왜 이렇게 많은 빌드 도구가 있나요?”
C++ 프로젝트를 시작하면 CMake, Make, Ninja, Meson 등 다양한 빌드 시스템을 접하게 됩니다. 각각 어떤 역할을 하고, 언제 어떤 것을 선택해야 할까요?
이 글에서 다루는 것:
- 빌드 시스템의 역할과 필요성
- CMake, Make, Ninja, Meson 비교
- 실무 선택 기준
- 각 도구의 장단점
목차
1. 빌드 시스템이란?
빌드 시스템의 역할
빌드 시스템(Build System)은 소스 코드를 실행 파일로 변환하는 과정을 자동화하는 도구입니다.
빌드 과정:
flowchart LR
A[소스 코드] --> B[전처리]
B --> C[컴파일]
C --> D[링킹]
D --> E[실행 파일]
F[빌드 시스템] -.관리.-> A
F -.관리.-> B
F -.관리.-> C
F -.관리.-> D
빌드 시스템이 하는 일:
- 의존성 관리: 어떤 파일이 변경되었는지 추적
- 증분 빌드: 변경된 파일만 재컴파일
- 병렬 빌드: 여러 파일을 동시에 컴파일
- 크로스 플랫폼: Windows, macOS, Linux에서 동일한 빌드 스크립트 사용
빌드 도구 vs 빌드 파일 생성기
빌드 도구 (Build Tool):
- 실제로 컴파일러를 호출하고 빌드를 수행
- 예: Make, Ninja
빌드 파일 생성기 (Build File Generator):
- 빌드 도구가 사용할 빌드 파일을 생성
- 예: CMake, Meson
관계:
CMakeLists.txt (CMake 스크립트)
↓ CMake 실행
Makefile 또는 build.ninja (빌드 파일)
↓ Make 또는 Ninja 실행
실행 파일
2. Make
Make란?
Make는 1976년에 만들어진 가장 오래된 빌드 도구입니다. Unix/Linux 시스템에서 표준으로 사용됩니다.
Makefile 예제
# Makefile
CXX = g++
CXXFLAGS = -std=c++17 -Wall -Wextra -O2
# 타겟: 의존성
# 명령어
all: main
main: main.o utils.o
$(CXX) $(CXXFLAGS) -o main main.o utils.o
main.o: main.cpp utils.h
$(CXX) $(CXXFLAGS) -c main.cpp
utils.o: utils.cpp utils.h
$(CXX) $(CXXFLAGS) -c utils.cpp
clean:
rm -f *.o main
.PHONY: all clean
사용법:
# 빌드
make
# 병렬 빌드 (4개 작업 동시)
make -j4
# 클린 빌드
make clean && make
Make의 장단점
장점:
- ✅ 단순함: 기본 개념이 직관적
- ✅ 범용성: 모든 Unix/Linux에 기본 설치
- ✅ 유연성: 쉘 명령어 직접 사용 가능
단점:
- ❌ 크로스 플랫폼 어려움: Windows 지원 제한적
- ❌ 수동 의존성 관리: 헤더 파일 의존성 수동 작성
- ❌ 문법 까다로움: 탭/스페이스 구분, 변수 문법 복잡
3. CMake
CMake란?
CMake는 크로스 플랫폼 빌드 파일 생성기입니다. Makefile, Visual Studio 프로젝트, Ninja 빌드 파일 등을 생성할 수 있습니다.
CMakeLists.txt 예제
cmake_minimum_required(VERSION 3.15)
project(MyProject VERSION 1.0)
# C++ 표준 설정
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 실행 파일 생성
add_executable(main
main.cpp
utils.cpp
)
# 헤더 파일 경로
target_include_directories(main PRIVATE include)
# 컴파일 옵션
target_compile_options(main PRIVATE
-Wall -Wextra -O2
)
# 라이브러리 링크
find_package(Boost REQUIRED)
target_link_libraries(main PRIVATE Boost::boost)
사용법:
# 빌드 디렉터리 생성
mkdir build && cd build
# CMake 실행 (Makefile 생성)
cmake ..
# 빌드
cmake --build .
# 또는 Ninja 사용
cmake -G Ninja ..
ninja
CMake의 장단점
장점:
- ✅ 크로스 플랫폼: Windows, macOS, Linux 모두 지원
- ✅ 자동 의존성: 헤더 파일 의존성 자동 추적
- ✅ 생태계: 대부분의 C++ 라이브러리가 CMake 지원
- ✅ IDE 통합: Visual Studio, CLion 등과 통합
단점:
- ❌ 복잡한 문법: 학습 곡선 높음
- ❌ 느린 설정: 대규모 프로젝트에서 CMake 실행 시간 김
- ❌ 디버깅 어려움: 에러 메시지 불친절
CMake 빌드 흐름
flowchart LR
A[CMakeLists.txt] --> B[cmake 실행]
B --> C{Generator 선택}
C -->|Unix Makefiles| D[Makefile]
C -->|Ninja| E[build.ninja]
C -->|Visual Studio| F[.sln/.vcxproj]
D --> G[make]
E --> H[ninja]
F --> I[msbuild]
G --> J[실행 파일]
H --> J
I --> J
4. Ninja
Ninja란?
Ninja는 빌드 속도에 최적화된 빌드 도구입니다. CMake의 백엔드로 많이 사용됩니다.
build.ninja 예제
# build.ninja (보통 CMake가 자동 생성)
cxx = g++
cxxflags = -std=c++17 -Wall -Wextra -O2
rule cxx
command = $cxx $cxxflags -c $in -o $out
description = CXX $out
rule link
command = $cxx $in -o $out
description = LINK $out
build main.o: cxx main.cpp
build utils.o: cxx utils.cpp
build main: link main.o utils.o
사용법:
# CMake로 Ninja 빌드 파일 생성
cmake -G Ninja ..
# Ninja 빌드
ninja
# 병렬 빌드 (자동)
ninja -j 8
Ninja의 장단점
장점:
- ✅ 빠른 속도: Make보다 2-3배 빠름
- ✅ 병렬 빌드: 자동 최적화
- ✅ 최소 기능: 빌드에만 집중
단점:
- ❌ 수동 작성 어려움: 직접 작성하기 복잡
- ❌ 기능 제한: Make의 고급 기능 없음
- ❌ CMake 의존: 보통 CMake와 함께 사용
Make vs Ninja 속도 비교
프로젝트 크기: 1000개 파일
Make:
- 클린 빌드: 120초
- 증분 빌드: 15초
Ninja:
- 클린 빌드: 45초 (2.7배 빠름)
- 증분 빌드: 5초 (3배 빠름)
5. Meson
Meson이란?
Meson은 Python으로 작성된 현대적인 빌드 시스템입니다. CMake의 대안으로 주목받고 있습니다.
meson.build 예제
# meson.build
project('myproject', 'cpp',
version: '1.0',
default_options: ['cpp_std=c++17']
)
# 실행 파일
executable('main',
'main.cpp',
'utils.cpp',
include_directories: include_directories('include')
)
# 라이브러리
boost_dep = dependency('boost')
executable('main',
'main.cpp',
dependencies: boost_dep
)
사용법:
# 빌드 디렉터리 설정
meson setup build
# 빌드
meson compile -C build
# 또는
cd build
ninja
Meson의 장단점
장점:
- ✅ 빠른 속도: Ninja 백엔드 사용
- ✅ 간결한 문법: Python 스타일, 읽기 쉬움
- ✅ 현대적: 최신 C++ 표준 지원
- ✅ 크로스 컴파일: 쉬운 설정
단점:
- ❌ 생태계 작음: CMake보다 라이브러리 지원 적음
- ❌ 학습 자료 부족: CMake 대비 문서/예제 적음
- ❌ 레거시 지원 약함: 오래된 프로젝트 마이그레이션 어려움
6. 비교 및 선택 가이드
종합 비교표
| 특징 | Make | CMake | Ninja | Meson |
|---|---|---|---|---|
| 타입 | 빌드 도구 | 생성기 | 빌드 도구 | 생성기 |
| 크로스 플랫폼 | ❌ | ✅ | ✅ | ✅ |
| 빌드 속도 | 보통 | 보통 | 빠름 | 빠름 |
| 학습 곡선 | 낮음 | 높음 | 중간 | 낮음 |
| 생태계 | 큼 | 매우 큼 | 중간 | 작음 |
| IDE 통합 | 제한적 | 우수 | 우수 | 보통 |
| 설정 시간 | 빠름 | 느림 | 빠름 | 빠름 |
빌드 속도 벤치마크
테스트 환경: 1000개 C++ 파일, 8코어 CPU
클린 빌드 (모든 파일 컴파일):
1. Ninja: 45초 ⭐
2. Make -j8: 120초
3. CMake: 설정 10초 + 빌드 60초 = 70초
증분 빌드 (1개 파일 변경):
1. Ninja: 2초 ⭐
2. Make: 8초
3. CMake: 설정 3초 + 빌드 3초 = 6초
선택 플로우차트
flowchart TD
A[프로젝트 시작] --> B{크로스 플랫폼?}
B -->|예| C{빌드 속도 중요?}
B -->|아니오| D[Make]
C -->|예| E[CMake + Ninja]
C -->|아니오| F[CMake + Make]
G[새 프로젝트?] --> H{현대적 문법 선호?}
H -->|예| I[Meson + Ninja]
H -->|아니오| F
시나리오별 권장 도구
1. 단순 프로젝트 (파일 10개 미만)
- Make: 간단하고 충분함
- 예: 알고리즘 연습, 작은 유틸리티
2. 크로스 플랫폼 라이브러리
- CMake: 업계 표준, 최고의 호환성
- 예: 오픈소스 라이브러리, 상용 제품
3. 대규모 프로젝트 (빌드 시간 중요)
- CMake + Ninja: 빠른 빌드
- 예: 게임 엔진, 브라우저, 대형 서버
4. 새 프로젝트 (레거시 없음)
- Meson + Ninja: 현대적 문법, 빠른 빌드
- 예: 신규 프로젝트, 스타트업
5. Windows 전용
- Visual Studio 프로젝트: 최고의 IDE 통합
- 또는 CMake: 나중에 크로스 플랫폼 전환 가능
7. 정리
핵심 요약
Make:
- 가장 오래되고 단순한 빌드 도구
- Unix/Linux에서 표준
- 크로스 플랫폼 지원 약함
CMake:
- 크로스 플랫폼 빌드 파일 생성기
- C++ 프로젝트의 사실상 표준
- 복잡하지만 강력함
Ninja:
- 빠른 빌드 도구
- CMake의 백엔드로 많이 사용
- 수동 작성 어려움
Meson:
- 현대적인 빌드 시스템
- 간결한 문법, 빠른 속도
- 생태계 작음
실무 권장 조합
초보자:
# CMake + Make (가장 무난)
cmake ..
make
중급자:
# CMake + Ninja (빠른 빌드)
cmake -G Ninja ..
ninja
고급자:
# Meson + Ninja (현대적)
meson setup build
meson compile -C build
다음 단계
빌드 시스템을 선택했다면, 각 도구의 자세한 사용법을 학습하세요:
- CMake 입문 가이드
- CMake 고급 기법
- CI/CD와 빌드 자동화
관련 주제:
- C++ 컴파일러 비교
- 크로스 플랫폼 개발
- 빌드 시스템 비교
추가 학습 자료
공식 문서:
실전 예제: