GNU Make の --ignore-errors オプション: エラーを無視してビルドを続行する方法
GNU Make の --ignore-errors
オプションは、ビルドプロセス中に発生するエラーを無視するように設定します。これは、特定の状況で有用であり、エラーがあってもビルドを続行させたい場合などに役立ちます。
使用方法
--ignore-errors
オプションは、make
コマンドを実行する際に指定します。以下の 2 つの方法があります。
- コマンドラインオプションとして指定
make --ignore-errors
- Makefile 内で指定
MAKEFLAGS += --ignore-errors
動作
--ignore-errors
オプションが有効な場合、make
コマンドは、レシピの実行中に発生する非ゼロの終了ステータスを無視します。つまり、たとえコマンドがエラーで終了しても、make
はビルドを続行します。
ただし、--ignore-errors
オプションは、すべてのエラーを無視するわけではないことに注意する必要があります。以下の種類のエラーは引き続き報告されます。
- 致命的なエラー
システムエラーなど、ビルドを続行できない重大なエラー - 構文エラー
Makefile 内の構文エラー
--ignore-errors
オプションは、個々のレシピ内でも指定できます。レシピの先頭に-
(ハイフン) を追加することで、そのレシピ内でのみエラーを無視するように設定できます。
myapp: myapp.c
- gcc -o myapp myapp.c
--ignore-errors
オプションと-k
(keep-going) オプションは似ていますが、微妙な違いがあります。-k
オプションは、依存関係のビルドが失敗しても、ターゲットのビルドを続行します。一方、--ignore-errors
オプションは、レシピの実行中に発生するエラーを無視します。
例
以下の例では、--ignore-errors
オプションを使用して、rm
コマンドによる "ファイルが見つからない" エラーを無視し、ビルドを続行します。
clean:
- rm -rf *.o *.exe
clean:
- rm -rf *.o *.exe
例2: 特定のレシピのみでエラーを無視する
この例では、myapp
ターゲットのレシピのみでエラーを無視し、他のターゲットのレシピではエラーを報告します。
myapp: myapp.c
- gcc -o myapp myapp.c
app: app.c
gcc -o app app.c
例3: Makefile内で"--ignore-errors"オプションをグローバルに設定する
この例では、MAKEFLAGS
変数を使用して、Makefile内のすべてのレシピでエラーを無視するように設定します。
MAKEFLAGS += --ignore-errors
myapp: myapp.c
gcc -o myapp myapp.c
app: app.c
gcc -o app app.c
- エラーを無視することは、潜在的な問題を隠蔽する可能性があることに注意してください。デバッグを行う場合は、一時的にエラーを無視し、問題を解決したらエラー報告を有効に戻すようにしてください。
- 上記の例はあくまで基本的な使用方法を示しています。実際の使用状況に応じて、オプションの組み合わせや設定を調整する必要があります。
そこで、ここでは --ignore-errors
オプションの代替となる方法をいくつかご紹介します。
エラー処理を行うシェルスクリプトを使用する
エラー処理を行うシェルスクリプトを作成することで、make
コマンドよりも柔軟かつ詳細なエラー処理を行うことができます。
例
#!/bin/bash
# ビルド処理を実行
make
# ビルド処理の終了ステータスを取得
EXIT_STATUS=$?
# エラーが発生した場合の処理
if [ $EXIT_STATUS -ne 0 ]; then
echo "ビルドエラーが発生しました!"
# 具体的なエラー処理を行う
exit 1
fi
# ビルドが成功した場合の処理
echo "ビルドが正常に完了しました。"
-k オプションを使用する
-k
オプションは、依存関係のビルドが失敗しても、ターゲットのビルドを続行します。これは、--ignore-errors
オプションとは異なり、レシピの実行中に発生するエラーは無視しません。
例
clean:
- rm -rf *.o *.exe
myapp: myapp.c
gcc -o myapp myapp.c
app: app.c $(deps)
gcc -o app app.c $(deps)
continue ステートメントを使用する
continue
ステートメントは、現在のレシピの実行を中止し、次のレシピに進むように指示します。これは、特定のエラーが発生した場合にのみビルドを続行したい場合に役立ちます。
例
clean:
- rm -rf *.o *.exe
myapp: myapp.c
gcc -o myapp myapp.c || continue
app: app.c $(deps)
gcc -o app app.c $(deps)
特定のエラーメッセージを無視する
-C
オプションを使用して、特定のエラーメッセージを無視するように設定できます。
例
clean:
- rm -rf *.o *.exe
myapp: myapp.c
gcc -o myapp myapp.c 2>&1 | grep -v 'warning:'
MAKEFLAGS 環境変数を設定する
MAKEFLAGS
環境変数に -k
または --ignore-errors
オプションを設定することで、すべての make
コマンドでこれらのオプションを有効にすることができます。
例
export MAKEFLAGS="-k"
make
最適な代替方法の選択
使用する代替方法は、状況によって異なります。
- すべての
make
コマンドで--ignore-errors
オプションを有効にしたい場合は、MAKEFLAGS
環境変数を設定します。 - 特定のエラーメッセージを無視したい場合は、
-C
オプションを使用します。 - 特定のエラーが発生した場合のみビルドを続行したい場合は、
continue
ステートメントを使用します。 - 依存関係のビルドが失敗してもターゲットのビルドを続行したい場合は、
-k
オプションを使用します。 - 詳細なエラー処理が必要な場合は、シェルスクリプトを使用するのが最善です。