GNU Make の --jobs オプションを使った実際のプロジェクトの例

2024-04-09

GNU Make の --jobs オプション

--jobs[=jobs] オプションは、GNU Make で同時に実行されるジョブ(コマンド)の数を指定します。これは、複数のターゲットを並行してビルドしたり、依存関係のないレシピを同時に実行したりする場合に便利です。

構文

make [options] --jobs[=jobs] [targets]

オプション

  • jobs: ジョブ数の指定。省略すると、デフォルトのジョブ数が使用されます。

動作

--jobs オプションを指定すると、GNU Make は以下の手順でジョブを管理します。

  1. Makefile を解析し、依存関係グラフを作成します。
  2. グラフ内のノード(ターゲット)を、ジョブ数に等しいグループに分割します。
  3. 各グループ内のノードを、並行して実行します。
  4. すべてのジョブが完了したら、終了します。

make --jobs=4 all

この例では、all ターゲットを最大 4 つのジョブで並行してビルドします。

注意事項

  • --jobs オプションは、GNU Make 3.8以降でのみ使用可能です。
  • ジョブ数が多いほど、システム全体の負荷が高くなります。
  • すべてのターゲットが並行して実行できるとは限りません。依存関係があるターゲットは、順番に実行されます。
  • 複数の GNU Make プロセスが同時に実行されると、競合が発生する可能性があります。

補足

  • **--jobsオプションは、-j` オプションと短縮表記できます。
  • デフォルトのジョブ数は、システムの CPU コア数と同じです。
  • ジョブ数を制限することで、ビルド時間を短縮したり、システム全体の負荷を抑えたりすることができます。


GNU Make の --jobs オプションを使ったサンプルコード

基本的なサンプル

all: target1 target2 target3

target1:
	echo "Building target1..."
	sleep 1

target2:
	echo "Building target2..."
	sleep 2

target3:
	echo "Building target3..."
	sleep 3
make --jobs=2

このコマンドを実行すると、target1target2 は並行して実行され、target3 はその後で実行されます。

依存関係のあるターゲット

all: target1 target2

target1: target3
	echo "Building target1..."
	sleep 1

target2:
	echo "Building target2..."
	sleep 2

target3:
	echo "Building target3..."
	sleep 3

このサンプルコードでは、target1target3 に依存しています。

make --jobs=2

このコマンドを実行すると、target3 は最初に実行され、その後 target1target2 が並行して実行されます。

ジョブ数の制限

all: target1 target2 target3 target4 target5

target1:
	echo "Building target1..."
	sleep 1

target2:
	echo "Building target2..."
	sleep 2

target3:
	echo "Building target3..."
	sleep 3

target4:
	echo "Building target4..."
	sleep 4

target5:
	echo "Building target5..."
	sleep 5

このサンプルコードでは、5 つのターゲットを定義しています。

make --jobs=3

このコマンドを実行すると、5 つのターゲットのうち、3 つずつ並行して実行されます。

その他のオプション

all: target1 target2 target3

target1:
	echo "Building target1..."
	sleep 1

target2:
	echo "Building target2..."
	sleep 2

target3:
	echo "Building target3..."
	sleep 3

.PHONY: clean

clean:
	echo "Cleaning up..."

このサンプルコードでは、clean というターゲットを追加しています。

make --jobs=2 -j clean

このコマンドを実行すると、target1target2 が並行して実行され、その後 clean ターゲットが実行されます。

--jobs オプションは、GNU Make でビルド時間を短縮したり、システム全体の負荷を抑えたりするための便利な機能です。さまざまなサンプルコードを参考に、実際のプロジェクトで活用してみてください。



GNU Make で並行処理を行うその他の方法

make コマンドの複数回実行

make target1 & make target2

このコマンドは、target1target2 をそれぞれ別のプロセスで実行します。

-l オプション

-l オプションは、GNU Make にジョブ数を制限するように指示します。

make -l 2 all

このコマンドは、all ターゲットを最大 2 つのジョブで並行して実行します。

distcc は、複数のコンピュータでコンパイルを分散させるツールです。

distcc make all

このコマンドは、all ターゲットを、ネットワーク上の複数のコンピュータで並行してコンパイルします。

ccache は、コンパイル済みオブジェクトファイルをキャッシュするツールです。

ccache make all

このコマンドは、all ターゲットを、コンパイル済みオブジェクトファイルをキャッシュすることで高速化します。

--jobs オプション以外にも、GNU Make で並行処理を行う方法はいくつかあります。それぞれの方法の特徴を理解し、状況に応じて使い分けることが重要です。




GNU Make で特定の Makefile の一部のみを処理する

"-b" オプションは、コマンドラインで make コマンドを実行する際に指定します。オプションの後に、読み込むファイルの名前を指定します。例:このコマンドは、"Makefile. debug" というファイルを読み込み、その内容を Makefile として処理します。



GNU Make の --no-print-directory オプション: ディレクトリ名の出力を抑制する

--no-print-directory オプションは、make が処理する各ディレクトリの名前を出力することを抑制します。これは、大量のディレクトリを処理する場合、出力を簡潔にするために役立ちます。オプションの詳細デフォルトの動作: make は、処理する各ディレクトリの名前を出力します。


"-w" オプションと Makefile の .SILENT ディレクティブ:徹底比較

-w オプションは、GNU Make における重要なコマンドラインオプションの一つです。このオプションは、警告メッセージの表示を制御するために使用されます。機能-w オプションには、以下の 3 つの機能があります。警告メッセージの抑制特定の警告メッセージの抑制


あなたは使いこなせる?GNU Make の "-k" オプションとその他方法

上記のコマンドは、Makefile に記述されたすべてのターゲットを、エラーが発生しても すべて実行しようとします。-k オプションには、以下の 2 つの動作モードがあります。エラーがあっても処理を継続する エラーが発生しても、Make は処理を継続し、残りのターゲットを実行しようとします。 エラーが発生したターゲットは、$? 変数に格納されます。 詳細なエラー情報は、make -r コマンドで確認できます。


GNU Make の --version オプションの詳細解説

コマンドラインから --version オプションを実行すると、次の情報が表示されます。Make ユーティリティのバージョン番号メジャーバージョン番号マイナーバージョン番号パッチレベルリリース候補番号 (存在する場合)ビルドホストビルド日時



GNU Make の --version オプションの詳細解説

コマンドラインから --version オプションを実行すると、次の情報が表示されます。Make ユーティリティのバージョン番号メジャーバージョン番号マイナーバージョン番号パッチレベルリリース候補番号 (存在する場合)ビルドホストビルド日時


GNU Make の --quiet オプションでメッセージ出力を抑制

--quiet オプションは、以下の動作を引き起こします。ヘッダーとフッターメッセージの抑制ターゲットの更新に関する情報の抑制レシピの実行に関する情報の抑制エラーメッセージの表示--quiet オプションは、単独で使用したり、他のオプションと組み合わせて使用したりできます。たとえば、-v オプションと組み合わせて使用すると、レシピの実行に関する詳細情報のみを表示できます。


include ディレクティブを使用して作業ディレクトリを指定する

以下の例では、-C オプションを使用して、subdir ディレクトリにある Makefile を実行します。このコマンドは、現在のディレクトリではなく、subdir ディレクトリに移動し、そのディレクトリにある Makefile を実行します。


GNU Make で特定の Makefile の一部のみを処理する

"-b" オプションは、コマンドラインで make コマンドを実行する際に指定します。オプションの後に、読み込むファイルの名前を指定します。例:このコマンドは、"Makefile. debug" というファイルを読み込み、その内容を Makefile として処理します。


"-w" オプションと Makefile の .SILENT ディレクティブ:徹底比較

-w オプションは、GNU Make における重要なコマンドラインオプションの一つです。このオプションは、警告メッセージの表示を制御するために使用されます。機能-w オプションには、以下の 3 つの機能があります。警告メッセージの抑制特定の警告メッセージの抑制