【初心者向け】Makeの`-v`オプション徹底解説!詳細モードでデバッグを楽々マスター


読み込まれたMakefile

  • 読み込まれたMakefile内の変数とマクロの定義
  • 読み込まれたMakefileのパスと内容

ルール処理

  • 各コマンドの実行結果
  • 各ルールのレシピ
  • 処理対象のターゲットと依存関係

変数展開

  • 変数の値と展開結果

ディレクトリ検索

  • ヘッダーファイルやソースファイルなどの検索パス
  • 使用されているライブラリ情報
  • Makeのバージョン情報

詳細レベルの調整

-v オプションを複数回指定することで、出力される詳細レベルを調整できます。

  • -vN: N 番目の詳細レベルの情報を出力 (N は任意の数値)
  • -v4: ディレクトリ検索の詳細な情報を出力
  • -vvv: 変数展開の詳細な情報を出力
  • -vv: ルール処理の詳細な情報を出力
  • -v: 基本的な情報を出力


make -vv program

このコマンドは、program ターゲットをビルドし、処理の各ステップにおいて詳細な情報をコンソールに出力します。

注意事項

  • ログファイルへの出力を併用することで、処理内容を記録し、後から確認することができます。
  • -v オプションを使用すると、コンソール出力量が多くなるため、処理速度が低下する可能性があります。

-v オプションは、GNU Make の動作を詳細に出力し、デバッグや複雑なMakefileの理解に役立つ強力なツールです。必要に応じて詳細レベルを調整することで、必要な情報のみを取得することができます。

  • -s オプションと併用することで、サイレントモードで実行しつつ、エラーメッセージのみを出力することができます。
  • -d オプションと併用することで、より詳細なデバッグ情報を出力することができます。


Makefile

# ターゲット: program
program: main.o hello.o
    $(CC) -o $@ $^

# オブジェクトファイル: main.o
main.o: main.c
    $(CC) $(CFLAGS) -c $<

# オブジェクトファイル: hello.o
hello.o: hello.c
    $(CC) $(CFLAGS) -c $<

使用方法

make -vv program

出力例

# Makefileを読み込む
# ...

# ターゲット "program" の依存関係を解析する
program: main.o hello.o

# main.o が最新かどうかを確認する
main.c: main.o
    $<  -mtime  $@
    $(CC) $(CFLAGS) -c $<

# hello.o が最新かどうかを確認する
hello.c: hello.o
    $<  -mtime  $@
    $(CC) $(CFLAGS) -c $<

# ルール "program" を実行する
CC=gcc
CFLAGS=-O2
main.o: main.c
    gcc -O2 -c main.c
hello.o: hello.c
    gcc -O2 -c hello.c
gcc -o program main.o hello.o

# ビルド完了

この例では、-vv オプションを使用しているため、Makefileの読み込み、ターゲットの依存関係解析、各ルールの処理内容、コマンドの実行結果など、詳細な情報が出力されています。

  • ルールの実行結果が成功したかどうかが表示されます。
  • ファイルの更新日時を確認することで、再コンパイルが必要かどうかを判断します。
  • 各ステップで、実行されるコマンドとオプションが表示されます。
  • 詳細なデバッグ情報が必要な場合は、-d オプションと併用することを検討してください。
  • より複雑なMakefileの場合、出力される情報は膨大になります。必要な情報に絞り込むために、-v オプションの個数を調整したり、grep コマンドなどを併用したりすることができます。


make -n オプション

  • -v オプションよりも簡潔な出力を得ることができます。
  • 実際にコマンドを実行せずに処理の流れを確認したい場合に役立ちます。
  • -v オプションと同様に、Makefile の処理内容を シミュレート して コマンドを実行せずに 出力します。
make -n program

make --dry-run オプション

  • より新しいバージョンの Makeで使用できる場合があります。
  • make -n オプションと同等の機能を提供します。
make --dry-run program

ログファイルの出力

  • ログファイルを後から分析することで、問題箇所を特定しやすくなります。
  • -v オプションよりも詳細な情報を記録したい場合は、-o オプションを使用してログファイルを生成することができます。
make program -o make.log

デバッガの使用

  • gdbstrace などのツールを使用して、Make の内部動作を詳細に追跡することができます。
  • 複雑なMakefileをデバッグする場合は、専用のデバッガを使用する方が効率的な場合があります。

コメントの活用

  • 複雑なMakefile を理解しやすくしたり、後から修正しやすくなったりします。
  • Makefile 内にコメントを記述することで、処理内容をわかりやすくすることができます。
  • 複雑なMakefileのデバッグ:
    • 複雑なMakefileをデバッグする場合はデバッガ
  • ログ分析:
    • 処理内容を記録して後から分析したい場合はログファイル
  • 処理状況の確認:
    • コマンドを実行せずに処理の流れを確認したい場合は -n オプションまたは --dry-run オプション
  • 必要な情報量:
    • 簡潔な情報で十分な場合は -n オプション、より詳細な情報が必要な場合は -v オプションまたはログファイル、さらに詳細な情報が必要な場合はデバッガ
  • 複数のオプションを組み合わせることで、より柔軟に情報を取得することができます。
  • 上記以外にも、Make の動作を制御するオプションがいくつか用意されています。詳細は、Make のマニュアルを参照してください。