빌드 시스템 비교 | CMake vs Make vs Ninja vs Meson 완벽 가이드

빌드 시스템 비교 | CMake vs Make vs Ninja vs Meson 완벽 가이드

이 글의 핵심

빌드 시스템 비교 가이드입니다. CMake, Make, Ninja, Meson의 특징과 실무 선택 기준을 제시합니다.

들어가며: 빌드 시스템이란?

”왜 이렇게 많은 빌드 도구가 있나요?”

C++ 프로젝트를 시작하면 CMake, Make, Ninja, Meson 등 다양한 빌드 시스템을 접하게 됩니다. 각각 어떤 역할을 하고, 언제 어떤 것을 선택해야 할까요?

이 글에서 다루는 것:

  • 빌드 시스템의 역할과 필요성
  • CMake, Make, Ninja, Meson 비교
  • 실무 선택 기준
  • 각 도구의 장단점

목차

  1. 빌드 시스템이란?
  2. Make
  3. CMake
  4. Ninja
  5. Meson
  6. 비교 및 선택 가이드
  7. 정리

1. 빌드 시스템이란?

빌드 시스템의 역할

빌드 시스템(Build System)은 소스 코드를 실행 파일로 변환하는 과정을 자동화하는 도구입니다.

빌드 과정:

flowchart LR
    A[소스 코드] --> B[전처리]
    B --> C[컴파일]
    C --> D[링킹]
    D --> E[실행 파일]
    
    F[빌드 시스템] -.관리.-> A
    F -.관리.-> B
    F -.관리.-> C
    F -.관리.-> D

빌드 시스템이 하는 일:

  1. 의존성 관리: 어떤 파일이 변경되었는지 추적
  2. 증분 빌드: 변경된 파일만 재컴파일
  3. 병렬 빌드: 여러 파일을 동시에 컴파일
  4. 크로스 플랫폼: 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. 비교 및 선택 가이드

종합 비교표

특징MakeCMakeNinjaMeson
타입빌드 도구생성기빌드 도구생성기
크로스 플랫폼
빌드 속도보통보통빠름빠름
학습 곡선낮음높음중간낮음
생태계매우 큼중간작음
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++ 컴파일러 비교
  • 크로스 플랫폼 개발
  • 빌드 시스템 비교

추가 학습 자료

공식 문서:

실전 예제: