[Mac 개발 일기] Make와 Ninja의 차이

muchan
muchan
∙∙조회 3인생리롤중

개요

macOS에서 C++ 개발 환경을 구축하면서 CMake와 Ninja를 설치했다.

처음 CMake 프로젝트를 생성했을 때는 Unix Makefiles 방식으로 설정되었지만, 이후 Ninja로 변경했다.

두 빌드 도구가 어떤 차이가 있는지 정리해 보았다.

Make란?

Make는 Makefile에 작성된 빌드 규칙을 바탕으로 프로그램을 빌드하는 도구다.

파일 간 의존성을 확인하여 변경된 파일만 다시 컴파일하는 증분 빌드(Incremental Build)를 지원한다.

  • Makefile을 통해 빌드 규칙 관리
  • 증분 빌드 지원
  • -j 옵션으로 병렬 빌드 지원
  • 범용적인 작업 자동화에도 활용 가능

Ninja란?

Ninja는 빠르고 효율적인 빌드 실행을 목적으로 설계된 빌드 도구다.

Make와 마찬가지로 의존성을 분석하여 필요한 작업만 수행하지만, 빌드 실행 과정의 오버헤드를 줄이는 데 중점을 두었다.

  • 빠른 빌드 실행에 특화
  • 증분 빌드 지원
  • 병렬 빌드 기본 지원
  • CMake 같은 빌드 구성 도구와 함께 사용하기 적합

Make와 Ninja 비교

구분MakeNinja
빌드 규칙 파일Makefilebuild.ninja
빌드 속도일반적대규모 프로젝트에서 유리한 경우가 많음
증분 빌드지원지원
병렬 빌드-j 옵션기본 지원
규칙 직접 작성비교적 용이자동 생성 권장
CMake 연동지원지원

CMake와의 관계

CMake는 직접 소스 코드를 컴파일하는 도구가 아니라, 빌드 시스템을 구성하고 빌드 규칙을 생성하는 도구다.

CMake에서 사용할 빌드 도구를 지정할 수 있다.

Make 사용

bash
cmake -S . -B build -G "Unix Makefiles"

Ninja 사용

bash
cmake -S . -B build -G Ninja

이후 다음 명령어로 빌드할 수 있다.

bash
cmake --build build

CMake가 선택된 빌드 도구를 호출하고, 실제 C++ 코드의 컴파일은 Clang이나 GCC 같은 컴파일러가 수행한다.

참고로 같은 빌드 디렉터리에서 Make와 Ninja 생성기를 혼용할 수는 없다.

정리

Make와 Ninja는 모두 빌드 자동화 도구이며, 증분 빌드와 병렬 빌드를 지원한다.

Make는 범용성과 유연성이 강점이고, Ninja는 빌드 실행 속도와 효율성에 중점을 둔다.