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

2024-04-02

GNU Make の "-k" オプション

概要

使用例

make -k

上記のコマンドは、Makefile に記述されたすべてのターゲットを、エラーが発生しても すべて実行しようとします。

詳細

-k オプションには、以下の 2 つの動作モードがあります。

  1. エラーがあっても処理を継続する

    • エラーが発生しても、Make は処理を継続し、残りのターゲットを実行しようとします。
    • エラーが発生したターゲットは、$? 変数に格納されます。
    • 詳細なエラー情報は、make -r コマンドで確認できます。
  2. エラーがあっても依存関係にあるターゲットのみ実行する

    • エラーが発生したターゲットの依存関係にあるターゲットのみ実行されます。
    • 依存関係にあるターゲットもエラーが発生した場合、そのターゲットの依存関係にあるターゲットは実行されません。

注意点

-k オプションを使用する際には、以下の点に注意が必要です。

  • エラーが発生しても処理が継続するため、問題を見逃してしまう可能性があります。
  • エラーが発生したターゲットが、他のターゲットに影響を与える可能性があります。
  • ログファイルを確認して、エラーが発生していないことを確認する必要があります。

-k オプションは、エラーが発生しても処理を継続させたい場合に便利なオプションです。ただし、使用には注意が必要です。



GNU Make の "-k" オプションのサンプルコード

エラーがあっても処理を継続する

# ターゲット1
target1:
	echo "ターゲット1を実行"
	exit 1

# ターゲット2
target2:
	echo "ターゲット2を実行"

# ターゲット3
target3:
	echo "ターゲット3を実行"

.PHONY: all
all: target1 target2 target3
$ make
ターゲット1を実行
*** エラーコード 1 でターゲット 'target1' が失敗しました ***
ターゲット2を実行
ターゲット3を実行

エラーがあっても依存関係にあるターゲットのみ実行する

# ターゲット1
target1:
	echo "ターゲット1を実行"
	exit 1

# ターゲット2
target2: target1
	echo "ターゲット2を実行"

# ターゲット3
target3:
	echo "ターゲット3を実行"

.PHONY: all
all: target1 target2 target3

上記の場合、make コマンドを実行すると、target1 でエラーが発生するため、target2 は実行されません。target3target1 に依存していないため、実行されます。

$ make
ターゲット1を実行
*** エラーコード 1 でターゲット 'target1' が失敗しました ***
ターゲット3を実行

特定のエラーを無視する

# ターゲット1
target1:
	echo "ターゲット1を実行"
	if [ $? -ne 0 ]; then
		echo "ターゲット1でエラーが発生しました"
	fi

# ターゲット2
target2: target1
	echo "ターゲット2を実行"

# ターゲット3
target3:
	echo "ターゲット3を実行"

.PHONY: all
all: target1 target2 target3

# 特定のエラーコードを無視する
.IGNORE: 1

上記の場合、target1 でエラーコード 1 が発生しても、make コマンドは処理を継続し、target2target3 を実行します。

$ make
ターゲット1を実行
ターゲット1でエラーが発生しました
ターゲット2を実行
ターゲット3を実行


GNU Make でエラーが発生しても処理を継続させる方法

"continue" ターゲットを使う

Makefilecontinue ターゲットを記述することで、エラーが発生しても処理を継続させることができます。

# ターゲット1
target1:
	echo "ターゲット1を実行"
	exit 1

# ターゲット2
target2:
	echo "ターゲット2を実行"

# エラーが発生した場合に実行されるターゲット
continue:
	echo "エラーが発生しましたが、処理を継続します"

.PHONY: all
all: target1 target2

上記の場合、make コマンドを実行すると、target1 でエラーが発生しますが、continue ターゲットが実行され、処理が継続されます。

$ make
ターゲット1を実行
*** エラーコード 1 でターゲット 'target1' が失敗しました ***
エラーが発生しましたが、処理を継続します
ターゲット2を実行

"ignore" エラーを使う

特定のエラーを無視したい場合は、Makefileignore エラーを記述することができます。

# ターゲット1
target1:
	echo "ターゲット1を実行"
	if [ $? -ne 0 ]; then
		echo "ターゲット1でエラーが発生しました"
	fi

# ターゲット2
target2: target1
	echo "ターゲット2を実行"

# ターゲット3
target3:
	echo "ターゲット3を実行"

.PHONY: all
all: target1 target2 target3

# 特定のエラーコードを無視する
.IGNORE: 1

上記の場合、target1 でエラーコード 1 が発生しても、make コマンドは処理を継続し、target2target3 を実行します。

$ make
ターゲット1を実行
ターゲット1でエラーが発生しました
ターゲット2を実行
ターゲット3を実行

override ディレクティブを使って、特定の変数の値を一時的に変更することができます。

# ターゲット1
target1:
	echo "ターゲット1を実行"
	if [ $? -ne 0 ]; then
		echo "ターゲット1でエラーが発生しました"
	fi

# ターゲット2
target2: target1
	echo "ターゲット2を実行"

# ターゲット3
target3:
	echo "ターゲット3を実行"

.PHONY: all
all: target1 target2 target3

# 特定の変数の値を一時的に変更する
override MAKEFLAGS = -k

上記の場合、make コマンドを実行すると、target1 でエラーが発生しても、-k オプションが有効になるため、処理が継続し、target2target3 を実行します。

$ make
ターゲット1を実行
*** エラーコード 1 でターゲット 'target1' が失敗しました ***
ターゲット2を実行
ターゲット3を実行

"eval" 関数を使う

eval 関数を使って、シェルコマンドを実行することができます。

# ターゲット1
target1:
	echo "ターゲット1を実行"
	if [ $? -ne 0 ]; then
		echo "ターゲット1でエラーが発生しました"
	fi

# ターゲット2
target2: target1
	echo "ターゲット2を実行"

# ターゲット3
target3:
	echo "ターゲット3を実行"

.PHONY: all
all: target1 target2 target3

# シェルコマンドを実行する
eval make -k

上記の場合、make コマンドを実行すると、target1 でエラーが発生しても、-k オプションを指定して make コマンドを再度実行するため、処理が継続し、target2target3 を実行します。

$ make
ターゲット1を実行
*** エラーコード 1 でターゲット 'target1' が失敗しました ***
make -k
ターゲット2を実行
ターゲット3を実行

GNU Make でエラーが発生しても処理を継続させる方法はいくつかあります。それぞれの方法にはメリットとデメリットがあるため、状況に合わせて最適な方法を選択する必要があります。




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

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




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

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


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

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


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

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


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

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


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

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