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 オプションを使用します。
  • 詳細なエラー処理が必要な場合は、シェルスクリプトを使用するのが最善です。