본문 바로가기
Development/CMake

Ninja(닌자) 빌드 시스템 이해하기

by 드로니뚜벅이 2022. 4. 23.

닌자(Ninja)는 속도에 중점을 둔 소형 빌드 시스템입니다. 다른 빌드 시스템과 다른 점은 상위 레벨 빌드 시스템에서 입력 파일을 생성하도록 설계되었으며 최대한 빨리 빌드를 실행하도록 설계되었습니다.

Make증분 빌드(또는 무연산 빌드)를 수행 할 때 안정성을 위해 속도가 상대적으로 느려집니다. 이렇게 하면 예를 들어 약39,000 개의 입력 파일을 하나의 실행 파일로 컴파일하는 크로미움(chromium) 과 같은 대규모 프로젝트에서 작업하는 개발자의 작업 속도가 상당히 느려질 수 있습니다. 실제로 크롬(chrome)은 Ninja의 주요 사용자입니다. 이러한 의미로 닌자(Ninja)는 Make를 대체하기 위한 것일 수 있습니다. Make 와는 달리 Ninja 빌드 파일은 손으로 직접 작성하지 않으므로 Ninja에는 문자열 조작과 같은 기능이 없습니다. 대신 닌자(Ninja) 빌드 파일을 생성하려면 "빌드 생성기"를 사용해야 합니다. 전통적인 CMake 같은 다른 빌드 관리 소프트웨어도 닌자(Ninja)에 대한 빌드 파일 생성을 지원합니다.

일부 대형 프로젝트에서는 닌자 빌드 파일 생성기를 별도로 제공하는데, 일례로 크로미움 프로젝트는 GN이라는 닌자 빌드 파일 생성기를 소스코드 관련 툴(depot tolos)을 배포시 포함합니다.

 

Ninja의 장점은 빠른 빌드 속도와 리눅스 / 윈도 / 맥 운영체제를 포함하는 멀티 플랫폼 지원입니다. 빠른 속도를 얻기 위해 시스템에 장착된 모든 CPU를 모두 사용해서 병렬로 작업을 처리합니다. make -jN 명령에서 N에 시스템 CPU 갯수를 지정한 것과 같은 셈입니다. 하지만 조금 다뤄보니 병렬 작업에 대한 고려를 많이 했다는 느낌을 받습니다. 병렬 처리되는 작업의 결과 내용을 섞어서 표시하지 않고 버퍼링 했다가 따로따로 출력한다거나 Make처럼 세심하게 신경 쓰지 않아도 대부분 작업을 병렬로 잘 처리합니다.

쉬운 문법과 사용법도 장점입니다. 1~2시간 정도면 매뉴얼을 다 읽을 수 있을 정도로 문법이 단순하고 양도 적다. Make의 암묵적인 규칙 같은 게 전혀 없어서 외우거나 혼란스러운 것도 없습니다. 하지만 이 단순함은 반대로 치명적인 단점이기도 합니다.

예를 들어 Make에서는 A = $(shell pkg-config --cflags libuv)처럼 명령어 실행 결과를 변수에 담거나, A += $(B), A ?= src 같이 다양한 조건을 이용해 변수를 조작할 수 있는데 Ninja에서는 a = $b 단순 대입 문법이 전부입니다. 심지어 환경 변수도 사용할 수 없습니다. 조건문 같은 건 상상도 할 수 없습니다. 다양한 운영체제를 지원하기 위해 유닉스 셸 실행 기능이 빠진 건 이해할 수 있지만, 환경 변수나 조건문이 없다는 건 Make처럼 혼자서 모든 다양한 경우에 대한 작업을 다 할 수 없다는 뜻이기도 합니다. 그래서 홈페이지에도 Ninja를 직접 사용하지 말고 Ninja 빌드 파일을 자동으로 만드는 다른 도구 를 추천하는 것 같습니다.

참고로 Sublime Text 같은 텍스트 에디터에서 Ninja 문법을 지원하거나 빌드 명령어 실행 을 위한 설정 방법은 대부분 구글에서 검색하면 쉽게 찾을 수 있습니다. 다음은 리눅스에서 Sublime Text를 사용할 때 필요한 Ninja 빌드 시스템 내용인데, 따로 적어두는 이유는 Chromium 사이트의 내용과 조금 다르기 때문입니다.

{
 "shell_cmd": "ninja",
 // ${folder} or ${file_path}
 "working_dir": "${folder}",
 // (file_path):(line_number):(column):(error_message)
 "file_regex": "^([^:\n]*):([0-9]+):?([0-9]+)?:? (.*)$"  
}

 

참고 사이트

 

'Development > CMake' 카테고리의 다른 글

CMake FetchContent 명령어  (1) 2023.11.01
CMake - 정적 라이브러리 링크하기  (0) 2022.09.06
CMakeLists.txt 파일 기본 골격 만들기  (0) 2022.04.23