あなたは使いこなせる?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の「-v」オプション:詳細情報表示でデバッグを極める

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


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

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



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

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


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

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


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

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


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

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


GNU Make の "--dry-run" オプション:ビルド前にコマンドを確認する方法

--dry-run オプションは、GNU Make に実際の処理を実行せずに、ターゲットのビルドに必要なコマンドを表示させるためのオプションです。ビルド前にコマンドを確認したい場合や、トラブルシューティングに役立ちます。使用方法--dry-run オプションは、make コマンドラインで以下のいずれかの方法で指定できます。