Ninja 빌드 구성

CMake를 이용하여 Ninja 빌드를 구성 및 테스트해 보았다.

Ninja 란?

Ninja 빌드는 기존 Make보다 빠른 속도로 빌드할 수 있도록 설계 되었다. 특히 증분 빌드(변경과 관련 된 것만 빌드)가 기존 Make보다 빠르게 처리되고, multi-job 빌드를 적극적으로 사용하여 속도에 최적화 되었다고 한다. (또한 multi-job 빌드시 빌드 과정이 기존 Make보다 깔끔하게 출력됨)
Chrome이나 AOSP 등에서 빌드 시스템으로 도입되어 사용되는 듯한데, 내가 직접 Ninja 빌드를 구성해 본 적은 없었다가 이번에 처음으로 구성해 보았다.

Ninja 빌드 구성

Ninja에는 Make에서와 같은 문자열 조작 기능 등이 없어서 직접 빌드 파일을 생성하는 대신에, 빌드 생성기를 사용하여 생성하는 방식이 주로 사용된다고 하고, 많이 사용되는 빌드 생성기에는 GYP(Generate Your Projects), CMake가 있다고 한다.
나는 GYP는 사용해 본 적이 없는데 어차피 CMake와 비슷하다고 하므로, CMake로 Ninja 빌드를 구성해 보기로 하였다. (사실 내가 직접 CMake 빌드를 구성한 적은 없었고, 처음으로 구성해 보았지만, CMake 자체가 Make보다 훨씬 간단한 문법이어서, VS Code에서 CMake 익스텐션을 설치하여 어려움 없이 금방 작성할 수 있었다)

CMake 구성

CMake는 CMakeLists.txt 파일을 작성해야 한다. 나는 예로 아래와 같이 작성했다. (아래 예는 src 디렉토리 밑에 src1.c, src2.c, src3.c 파일들과 include 디렉토리 밑에 헤더 파일들로 구성되어 있는 경우의 간단한 예제임)

cmake_minimum_required(VERSION 3.0)
project(my_test_tool)

message(STATUS "Compiler Version: ${CMAKE_CXX_COMPILER_VERSION}")

set(INC_DIR include)
set(SRC_DIR src)
set(SOURCE ${SRC_DIR}/src1.c ${SRC_DIR}/src2.c ${SRC_DIR}/src3.c)

include_directories(${INC_DIR})

if(DEBUG)
    message("Build for debug")
    add_definitions(-DDEBUG)
else()
    message("Build for release")
endif()

add_compile_options(-O2 -Wall)
add_executable(my_test_tool ${SOURCE})

add_custom_command(
    TARGET my_test_tool
    POST_BUILD
    COMMAND strip my_test_tool
)

CMake 빌드

CMake가 설치되지 않았으면, 우분투에서는 아래와 같이 CMake를 설치한다.

$ sudo apt install cmake

위의 예와 같이 CMakeLists.txt 파일을 작성한 후 해당 디렉토리에서 아래와 같이 CMake를 generator로 Ninja를 사용하도록 실행시키면, 결과로 Makefile 대신에 build.ninja 파일이 생성된다.

$ cmake . -G Ninja

Ninja 빌드

Ninja가 설치되지 않았으면, 우분투에서는 아래와 같이 설치한다.

$ sudo apt install ninja-build

이제 Ninja 빌드를 아래와 같이 할 수 있다.

$ ninja

만약 빌드 과정을 좀 더 자세히 보고 싶으면 아래와 같이 -v 옵션을 추가하면 된다.

$ ninja -v

Clean은 아래와 같이 할 수 있다.

$ ninja clean

테스트 결과

Ninja로 빌드해 보니, 짧은 몇 개의 소스로만 구성되었음에도 불구하고 기존 Make 대비하여 빌드 시간이 단축되었음을 확인할 수 있었다. 또한 헤더 파일을 수정하면, 자동으로 이것을 사용하는 소스 파일들이 증분 빌드되었고, 역시 Make 대비하여 시간이 짧게 소요되었다.
따라서 Ninja는 Makefile을 제대로 구성하는 것이 귀찮을 경우에 간단히 사용하기에 괜찮은 것 같고, 대규모 프로젝트인 경우에도 빌드 시간을 단축시킬 수 있는 빌드 시스템인 것 같다.

Ninja는 CPU를 최대한 사용하는데 만약 CPU 사용량을 제한하고 싶으면 make와 유사하게 -j-l 옵션을 이용하면 된다.
예를 들어 load-average 값으로 제한을 하려면 아래 예와 같이 하면 된다. (참고로 load average 값은 uptime, top, htop 명령으로 확인할 수 있고, 3 개의 숫자는 각각 1분, 5분, 15분의 평균 부하값으로 core 개수가 반영된 값이다)

$ ninja -l 20

카테고리:

업데이트: