【初心者向け】Make の `-b` オプションを使いこなそう! ターゲット強制ビルド、依存関係更新、再帰実行をマスター


対象ターゲットの強制ビルド

-b オプションは、指定したターゲットのビルドを強制的に実行するために使用されます。通常、Make は依存関係が変更された場合のみ、ターゲットを再ビルドします。しかし、-b オプションを使用すると、たとえ依存関係が変更されていなくても、Make は指定したターゲットを強制的に再ビルドします。

make -b mytarget

この例では、mytarget ターゲットが強制的に再ビルドされます。

必要な依存関係のみの更新

-b オプションは、必要な依存関係のみを更新するために使用できます。通常、Make はすべての依存関係を再ビルドしますが、-b オプションを使用すると、Make は変更された依存関係のみを再ビルドし、変更されていない依存関係はスキップします。

make -b mytarget -n

この例では、mytarget ターゲットに必要な依存関係のみが再ビルドされます。-n オプションは、実際に実行せずに、Make が何をすべきかをシミュレートします。

サブディレクトリへの再帰実行

-b オプションは、サブディレクトリに再帰的に実行するために使用できます。このオプションを使用すると、Make は現在のディレクトリだけでなく、サブディレクトリにあるすべての Makefile も処理します。

make -b mytarget -R

この例では、mytarget ターゲットと、現在のディレクトリとサブディレクトリにあるすべての Makefile が処理されます。-R オプションは、再帰実行を有効にします。

-b オプションは、上記以外にもさまざまな用途で使用できます。

  • 特定のディレクトリで実行する
  • 特定の変数の値を設定する
  • 特定のルールの実行を強制する

詳細については、GNU Make のマニュアルを参照してください。

-b オプションは、GNU Make の強力なツールであり、ビルドプロセスを制御するためにさまざまな方法で使用できます。このオプションを使用することで、開発者はビルドプロセスをより効率的にし、時間を節約することができます。

  • -d: デバッグ情報を表示する
  • -v: 詳細な出力を表示する
  • -j: 並行ジョブ数を指定する


例 1: 特定のターゲットを強制的にビルド

#Makefile

all: program1 program2

program1: program1.c
    gcc -o program1 program1.c

program2: program2.c
    gcc -o program2 program2.c

この Makefile で、make と実行すると、program1program2 の両方がビルドされます。しかし、make -b program2 と実行すると、program2 のみ強制的にビルドされます。

例 2: 必要な依存関係のみを更新

#Makefile

all: program1 program2

program1: program1.c
    gcc -o program1 program1.c

program2: program2.c program1
    gcc -o program2 program2.c

この Makefile で、make と実行すると、program1program2 の両方がビルドされます。しかし、program1.c を変更して make -b program2 -n と実行すると、program2 の再ビルドが必要であることが示され、実際に program2 は再ビルドされません。

例 3: サブディレクトリに再帰的に実行

#Makefile

all: subdir/program

subdir/program: subdir/program.c
    gcc -o subdir/program subdir/program.c

この Makefile で、make と実行すると、subdir/program がビルドされます。しかし、make -b subdir/program -R と実行すると、subdir/programsubdir ディレクトリにあるすべての Makefile が処理されます。



依存関係を明示的に指定

-b オプションの代わりに、依存関係を明示的に指定することで、ターゲットを強制的にビルドすることができます。

#Makefile

all: program1 program2

program1: program1.c
    gcc -o program1 program1.c

program2: program2.c program1
    gcc -o program2 program2.c

この例では、program2 を強制的にビルドするには、make program2 program1 と実行します。このコマンドは、program2 の依存関係である program1program2.c を明示的に指定します。

make touch を使用する

make touch コマンドを使用して、必要な依存関係のみを更新することができます。このコマンドは、指定したファイルのタイムスタンプを更新し、Make にそのファイルが変更されたと認識させます。

make touch program1.c

この例では、program1.c が変更されたと Make に認識させ、program1 ターゲットが再ビルドされます。

サブディレクトリを個別にビルド

-b オプションの代わりに、サブディレクトリを個別にビルドすることで、再帰的に実行することができます。

cd subdir
make
cd ..

この例では、subdir ディレクトリに移動して make コマンドを実行し、その後親ディレクトリに戻ります。これにより、subdir ディレクトリと subdir 内のすべての Makefile が処理されます。

-b オプションは便利なツールですが、状況によっては代替方法の方が適切な場合があります。上記で説明した代替方法は、-b オプションと同じ結果を達成するために使用できます。

  • -d: デバッグ情報を表示する
  • -v: 詳細な出力を表示する
  • -j: 並行ジョブ数を指定する