Ninja
Ninjaは、高速かつ効率的なビルドシステムであり、ソフトウェアのコンパイルやビルドプロセスを管理するツールです。このツールは、ビルドの並列実行を効果的に利用し、ビルドプロセス全体の高速化を図ることで、大規模なソフトウェアプロジェクトの開発を支援します。
Ninjaは簡潔なビルドファイル構文を特徴としており、CMakeやMesonなどのビルドシステムと組み合わせて使用されることが多いです。
Ninjaの主な特徴は次の通りです:
- 高速性
- ビルドプロセスを迅速に実行し、効果的な並列処理により高速で効率的なビルドを実現します。
- シンプルな構文
- 簡潔で直感的なビルドファイルの記述が可能で、複雑な設定を簡単に扱うことができます。
- プラットフォーム非依存性
- 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!