Ninja
Ninjaは、高速で効率的なビルドシステムであり、ソフトウェアのコンパイルやビルドプロセスを管理するためのツールです。このツールは、ビルドプロセスの効率化と並列実行を可能にすることで、大規模なソフトウェアプロジェクトの開発を支援します。
Ninjaは、簡潔なビルドファイルの構文を持ち、CMakeやMesonなどのビルドシステムの補完として使用されることが一般的です。その名前の由来は、速さと効率性を象徴する忍者のように、素早く効果的にビルドを実行することを意味しています。
一般的に、Ninjaは以下のような特徴を持っています:
- 高速性
- ビルドプロセスを迅速に実行し、並列処理を効果的に利用することで、高速で効率的なビルドを実現します。
- 単純な構文
- シンプルで直感的なビルドファイルの構文を持ち、ビルド設定を簡単に記述できます。
- プラットフォーム非依存性
- UNIX、Windows、macOS、Linuxなど、さまざまなプラットフォームで利用可能です。
- 拡張性
- カスタムルールやフックを使って機能を拡張できます。
開発者はNinjaを使ってビルドプロセスを効率化し、大規模なプロジェクトのコンパイルやビルドを管理する際に、その高速性と柔軟性を活用します。
基本的なNinjaの使用例[編集]
Ninjaを使用してC言語のHello Worldプログラムをビルドする手順は次のようになります。まず、Hello WorldのCプログラムを作成しましょう。
- 新しいテキストファイルを開き、次のようなコードを入力し
hello.c
という名前で保存します。- hello.c
#include <stdio.h> int main() { printf("Hello, World!\n"); return 0; }
- 次に、ビルドスクリプト用のテキストファイル
build.ninja
を作成します。以下は、手動でNinjaのビルドファイルを作成する例です。- build.ninja
# Ninja build file for Hello World rule compile command = cc -o $out $in description = Compiling $in build hello: compile hello.c
- この
build.ninja
ファイルでは、hello
ターゲットを作成するためのcompile
ルールを定義しています。このcompile
ルールは、cc
を使ってhello.c
をコンパイルし、hello
という実行可能ファイルを生成します。
- コマンドラインで、以下のコマンドを実行してNinjaを使ってビルドを実行します。
% ninja [1/1] Compiling hello.c % ./hello Hello, World!
- これにより、手動で作成した
build.ninja
ファイルを使用して、hello.c
をコンパイルし、hello
という実行可能ファイルを生成できます。
ただし、この手法は非常に基本的な例です。実際のプロジェクトでは、多くの場合、複数のファイルや複雑な依存関係、オプション、ライブラリなどがあります。その場合、手動でビルドファイルを作成することは非常に手間がかかるため、CMakeなどのツールを使用することが一般的です。
CMakeとNinjaを組み合わせた C言語のHello Worldプログラム のビルド[編集]
CMakeを使用してNinjaビルドシステムを構成することで、C言語のHello Worldプログラムをビルドできます。以下に手順を示します。
- Hello Worldプログラム
hello.c
を作成します。前節と同じです。 CMakeLists.txt
ファイルをhello.c
と同じディレクトリに作成します。これはCMakeの設定ファイルで、プロジェクトの構成やビルド手順を記述します。以下は、簡単な例です。- CMakeLists.txt
cmake_minimum_required(VERSION 3.0) project(HelloWorld C) add_executable(hello hello.c)
- CMakeを使ってビルドシステムを構成します。次のコマンドを実行します。
% cmake -G Ninja -B build -- The C compiler identification is GNU 12.2.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Configuring done -- Generating done -- Build files have been written to: /home/USERNAME3/ninja/prj01/build
- ここで、
-G Ninja
はNinjaビルドを指定しています。-B build
はビルドディレクトリを指します。 - CMake は、build/build.ninja に設定を出力します。build/build.ninja には実行ファイルのビルド意外にも、ビルドディレクトリを掃除する clean など多くのターゲットが出力されます。機会があったら build/build.ninja を読んで観てください。Ninjaの設定の勘所が多く含まれています。
- Ninjaを使ってビルドを実行します。
% cmake --build build/ [2/2] Linking C executable hello % build/hello Hello, World!
- これにより、CMakeが生成したNinjaのビルドファイルを使って、
hello.c
をコンパイルし、hello
という実行可能ファイルがビルドされます。
この手順では、CMakeを使用してNinjaビルドシステムを構成し、Hello Worldプログラムをビルドしています。CMakeを使うことで、プロジェクトの構成や依存関係を管理しやすくなります。
MesonとNinjaを組み合わせた C言語のHello Worldプログラム のビルド[編集]
Mesonを使用してNinjaビルドシステムを構成することで、C言語のHello Worldプログラムをビルドできます。以下に手順を示します。
- Hello Worldプログラム
hello.c
を作成します。前前節と同じです。 meson.build
ファイルをmeson init
で生成します。% meson init Using "prj01" (name of current directory) as project name. Using "prj01" (project name) as name of executable to build. Detected source files: hello.c Detected language: c Generated meson.build file: project('prj01', 'c', version : '0.1', default_options : ['warning_level=3']) executable('prj01', 'hello.c', install : true)
- Mesonを使ってビルドシステムを構成します。次のコマンドを実行します。
% mkdir build && cd build % meson .. The Meson build system Version: 1.0.1 Source dir: /home/USERNAME3/ninja/prj01 Build dir: /home/USERNAME3/ninja/prj01/build Build type: native build Project name: prj01 Project version: 0.1 C compiler for the host machine: cc (gcc 12.2.0 "cc (Debian 12.2.0-14) 12.2.0") C linker for the host machine: cc ld.bfd 2.40 Host machine cpu family: x86_64 Host machine cpu: x86_64 Build targets in project: 1 Found ninja-1.11.1 at /usr/bin/ninja % meson compile INFO: autodetecting backend as ninja INFO: calculating backend command to run: /usr/bin/ninja [2/2] Linking target prj01 % ./prj01 Hello, World!