Ninja 빌드

Sijin·2025년 8월 12일

GN (Generates Ninja build files)

  • GN은 Ninja 빌드 파일인 build.ninja를 생성한다
  • Ninja는 만들어진 build.ninja를 읽어 컴파일 및 링킹 작업을 실행한다

GN 기초 문법

변수, 리스트
# 변수 선언
is_debug = true
project_name = "my_project"

# 리스트 선언과 추가
sources = [ "main.cc", "utils.cc" ]
sources += [ "helper.cc" ]
타겟 정의
executable("my_app") {
  sources = [ "main.cc", "app.cc" ]
  deps = [ ":my_lib" ]  # 의존 라이브러리
}

static_library("my_lib") {
  sources = [ "lib.cc" ]
}
open-dice 예시

https://github.com/google/open-dice/blob/main/BUILD.gn

pw_static_library("dice_with_boringssl_ed25519_ops") {
  public = [
    "include/dice/dice.h",
    "include/dice/utils.h",
  ]
  sources = [
    "src/boringssl_cert_op.c",
    "src/boringssl_ed25519_ops.c",
    "src/boringssl_hash_kdf_ops.c",
    "src/clear_memory.c",
    "src/dice.c",
    "src/utils.c",
  ]
  deps = [ "//third_party/boringssl:crypto" ]
  all_dependent_configs = [
    ":boringssl_ed25519_ops_config",
    ":default_profile",
  ]
}
  • libdice_with_boringssl_ed25519_ops.a 를 생성하는 블록
  • public
    • 이 라이브러리에 의존하는 다른 타겟들에게 같이 제공되는 헤더
    • 라이브러리를 사용하는 쪽에서 해당 헤더들을 자동으로 #include 경로로 삼을 수 있음
  • sources
    • 라이브러리에 포함되어 컴파일 될 소스코드
  • deps
    • 타겟이 의존하는 다른 타겟을 지정
    • public_deps, data_deps 등 다양한 의존성 type이 있다
  • all_dependent_configs
    • 이 타겟에 의존하는 모든 타겟에 적용될 컴파일러, 링커 설정
    • 컴파일 플래그, include 디렉토리, define 등 빌드 설정을 하위로 전파
Config
config("debug_config") {
  defines = [ "DEBUG=1" ]
  include_dirs = [ "include/debug" ]
}

static_library("lib_with_debug") {
  sources = [ "lib.cc" ]
  all_dependent_configs = [ ":debug_config" ]
}

shared_library("hello_shared") {
  sources = [
    "hello_shared.cc",
    "hello_shared.h",
  ]

  defines = [ "HELLO_SHARED_IMPLEMENTATION" ]
}
  • 컴파일 옵션, include 경로, 매크로 정의 등

GN 작성에서 Ninja 빌드까지 흐름

  1. GN 설정 파일(BUILD.gn 등)에 빌드 타겟, 설정을 정의
  2. 터미널에서 gn gen out 명령어를 실행하면 GN이 out/build.ninja 파일을 생성
  3. ninja -C out 명령어로 Ninja가 build.ninja 파일을 읽고 컴파일, 링킹 등 실제 빌드를 수행

Ninja

  • 빠른 속도에 중점을 둔 빌드 시스템
  • 대규모 프로젝트에서 변경된 파일만 다시 빌드하는 증분 빌드 속도를 대폭 향상
  • 크롬 브라우저, Android AOSP, LLVM 등 오픈소스에 활용되는 경우 많음

build.ninja

# 컴파일 규칙 정의
rule compile
  command = gcc -c $in -o $out

# 링크 규칙 정의  
rule link
  command = gcc $in -o $out

# 빌드 타겟 정의
build main.o: compile main.c
build app: link main.o

빌드 실행

# 전체 빌드
ninja

# 특정 타겟만 빌드
ninja app

# 4개 CPU 코어로 병렬 빌드
ninja -j4

Ninja 디버깅

# 빌드 통계 표시
ninja -d stats

# 의존성 설명
ninja -d explain

# 빌드 과정 상세 정보
ninja -v

Ninja를 Cmake랑 같이 사용하기

  • Ninja를 Makefile을 대체하는 용도로 Cmake랑 같이 사용할 수 있다

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(HelloNinja)

add_executable(hello main.cpp)

빌드 실행

# 빌드 디렉토리 생성 후 이동
mkdir build && cd build

# CMake로 Ninja 빌드 파일 생성
cmake -G Ninja ..

# Ninja로 빌드
ninja

# 또는 CMake를 통해 빌드
cmake --build .

빌드 시스템 조합

조합설명
CMake + NinjaCMake로 Ninja 파일 생성, Ninja로 빌드
CMake + MakefileCMake로 makefile 파일 생성, GNU Make로 빌드
GN + NinjaGN으로 Ninja 파일 생성, Ninja로 빌드

0개의 댓글