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 の "-k" オプションとその他方法

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



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

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


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

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


コマンド出力スッキリ!Makeの「-s」オプションでスマートなビルド環境を実現

このオプションの利点と欠点利点:Makeの出力結果が簡潔になり、必要な情報だけを確認しやすくなります。長時間実行される複雑なMakefileを処理する場合などに、画面が情報で埋もれるのを防ぎます。スクリプト内でMakeを呼び出す場合などに、余計な情報が出力されずに、処理をよりスマートに見せることができます。


【徹底解説】GNU Makeの「-v」オプション:詳細情報表示でデバッグを極める

概要GNU Makeの「-v」オプションは、冗長モードを有効にし、Makeの処理過程における詳細情報を表示します。これは、Makeの動作を理解したり、デバッグしたりする際に役立ちます。表示内容「-v」オプションを指定すると、Makeは以下の情報を表示します。



コマンド出力スッキリ!Makeの「-s」オプションでスマートなビルド環境を実現

このオプションの利点と欠点利点:Makeの出力結果が簡潔になり、必要な情報だけを確認しやすくなります。長時間実行される複雑なMakefileを処理する場合などに、画面が情報で埋もれるのを防ぎます。スクリプト内でMakeを呼び出す場合などに、余計な情報が出力されずに、処理をよりスマートに見せることができます。


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

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


GNU Make の include ディレクティブの詳細

--include-dir=dir オプションは、GNU Make に .mk ファイルの検索パスを追加するために使用されます。このオプションは、include ディレクティブで指定されたファイルが見つからない場合に役立ちます。オプションの詳細:


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

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


Make でエラーを無視する方法:--ignore-errors オプションと代替手段

GNU Make の --ignore-errors オプションは、Make がコマンドの実行中に発生するエラーを無視するように指示します。これは、ビルドプロセス中に発生するマイナーなエラーを無視し、可能な限りビルドを継続したい場合に役立ちます。