Ninjaは、高速かつ効率的なビルドシステムであり、ソフトウェアのコンパイルやビルドプロセスを管理するツールです。このツールは、ビルドの並列実行を効果的に利用し、ビルドプロセス全体の高速化を図ることで、大規模なソフトウェアプロジェクトの開発を支援します。

Wikipedia
Wikipedia
ウィキペディアNinja (ソフトウェア)の記事があります。

Ninjaは簡潔なビルドファイル構文を特徴としており、CMakeMesonなどのビルドシステムと組み合わせて使用されることが多いです。

Ninjaの主な特徴は次の通りです:

高速性
ビルドプロセスを迅速に実行し、効果的な並列処理により高速で効率的なビルドを実現します。
シンプルな構文
簡潔で直感的なビルドファイルの記述が可能で、複雑な設定を簡単に扱うことができます。
プラットフォーム非依存性
Ninjaは、UNIXWindowsmacOSLinuxなど、さまざまなプラットフォームで利用できます。
拡張性
カスタムルールやフックを用いることで、ビルドプロセスを柔軟に拡張することが可能です。

Ninjaは特に、大規模なプロジェクトのコンパイルやビルド管理において、その高速性と拡張性を活かし、開発者の作業効率を向上させます。ビルドのボトルネックを解消し、開発プロセス全体の時間短縮に寄与します。

基本的なNinjaの使用例

編集

Ninjaを使用してC言語のHello Worldプログラムをビルドする手順は次のようになります。まず、Hello WorldのCプログラムを作成しましょう。

  1. 新しいテキストファイルを開き、次のようなコードを入力し hello.c という名前で保存します。
    hello.c
    #include <stdio.h>
    
    int main() {
        printf("Hello, World!\n");
        return 0;
    }
    
  2. 次に、ビルドスクリプト用のテキストファイル 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 という実行可能ファイルを生成します。
  3. コマンドラインで、以下のコマンドを実行して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プログラムをビルドできます。以下に手順を示します。

  1. Hello Worldプログラム hello.c を作成します。前節と同じです。
  2. CMakeLists.txt ファイルをhello.cと同じディレクトリに作成します。これはCMakeの設定ファイルで、プロジェクトの構成やビルド手順を記述します。以下は、簡単な例です。
    CMakeLists.txt
    cmake_minimum_required(VERSION 3.0)
    project(HelloWorld C)
    
    add_executable(hello hello.c)
    
  3. 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の設定の勘所が多く含まれています。
  4. 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プログラムをビルドできます。以下に手順を示します。

  1. Hello Worldプログラム hello.c を作成します。前前節と同じです。
  2. 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)
    
  3. 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!
    

リソース

編集