web-dev-qa-db-ja.com

トラブルシューティングのためにMakefileターゲットをトレースする方法は?

ビルドシステムには、長くて複雑なMakefileがあります。特定のmake呼び出しに対してどのターゲットが実行されるかを正確に追跡する良い方法はありますか?

20
zer0stimulus

make -dまたはmake --debug[=flags]オプション を使用します。

‘-d’

通常の処理に加えて、デバッグ情報を出力します。 デバッグ情報は、どのファイルが再作成を検討されているか、どのファイル時間が比較されているか、どの結果とどのファイルを実際に再作成する必要があるかを示しますどの暗黙のルールが考慮され、どれが適用されるか-makeが何をするかを決定する方法についての興味深いすべて。 -dオプションは‘--debug=a’と同等です(以下を参照)。

‘--debug[=options]’

通常の処理に加えて、デバッグ情報を出力します。さまざまなレベルとタイプの出力を選択できます。引数なしで、デバッグの「基本」レベルを出力します。考えられる引数は以下のとおりです。最初の文字のみが考慮され、値はコンマまたはスペースで区切る必要があります。

a(すべて)すべてのタイプのデバッグ出力が有効になります。これは、「-d」を使用するのと同じです。

b(基本)基本的なデバッグでは、古くなっていることが判明した各ターゲットと、ビルドが成功したかどうかが出力されます。

v(詳細)‘basic’より上のレベル。 makefileが解析されたメッセージ、再構築する必要のない前提条件などが含まれます。このオプションは、‘basic’メッセージも有効にします。

i(暗黙的)各ターゲットの暗黙的ルール検索を説明するメッセージを出力します。このオプションは、‘basic’メッセージも有効にします。

j(jobs)特定のサブコマンドの呼び出しの詳細を示すメッセージを出力します。

m(makefile)デフォルトでは、makefileを再作成しようとしている間、上記のメッセージは有効になりません。このオプションは、メイクファイルの再構築中にもメッセージを有効にします。 ‘all’オプションはこのオプションを有効にすることに注意してください。このオプションは、‘basic’メッセージも有効にします。

もう1つのオプションは、 remake -パッチを適用したバージョンのGNU Makeを使用することです。これにより、エラーレポートの改善、実行のトレース機能、およびデバッガーが追加されます。

26

ElectricMake は、この状況で役立つ多くの情報を含むXMLマークアップバージョンのビルドログを生成できます。

  • ビルド中に呼び出されたすべてのコマンドの完全なコマンドライン(@修飾子で「サイレント」コマンドとしてマークされたコマンドも含む)。
  • 呼び出されたコマンドのオリジン(メイクファイルと行番号)。
  • コマンドの実行時間。
  • ビルド内のターゲット間の依存関係。
  • ビルド内のターゲットと再帰的なmakeの間の構造的な関係。
  • ビルドで呼び出されたコマンドによって読み取り/書き込みされたファイル。

その出力のサンプルを次に示します。

<job id="J0824ab08" thread="5e72bb0" node="linbuild1-2" type="rule" name="../../i686_Linux/testmain/testmain.d" file="../config/rules.mak" line="109">
<command line="110">
<argv>echo Rebuilding '../../i686_Linux/testmain/testmain.d'</argv>
<output src="prog">Rebuilding ../../i686_Linux/testmain/testmain.d
</output>
</command>
<command line="111-114">
<argv>set -e; g++ -MM -w  -DUSE_PROFILING -DUSE_LOGGING -DHAVE_UNIX -DHAVE_LINUX -I.. testmain.cpp \
        | sed 's!\(testmain\)\.o[ :]*!../../i686_Linux/testmain/\1.o '../../i686_Linux/testmain/testmain.d' : !g' \
        &gt; '../../i686_Linux/testmain/testmain.d'; \
        [ -s '../../i686_Linux/testmain/testmain.d' ] || touch '../../i686_Linux/testmain/testmain.d'</argv>
</command>
<opList>
<op type="read" file="/home/ericm/src/testmain/testmain.cpp"/>
<op type="read" file="/home/ericm/src/minidumper/ExceptionReport.h"/>
<op type="read" file="/home/ericm/src/util/ECAssert.h"/>
<op type="create" file="/home/ericm/i686_Linux/ecloud/testmain/testmain.d" found="0"/>
</opList>
<timing invoked="1.919926" completed="3.600491" node="linbuild1-2"/>
<waitingJobs idList="J0824ae38"/>
</job>

見慣れないMakefileをすばやくナビゲートする方法 は、注釈付きのビルドログを使用してMakefileを回避する方法を見つける例を示しています。

Data Mining ElectricAccelerator Annotation は、注釈付きのビルドログを使用して、ビルドの部品表を生成する方法を示しています。

ElectricMakeはGNU Makeと互換性があるため、GNU makeで動作するmakefileを処理できます。

免責事項:私はElectricAcceleratorのアーキテクトおよびリード開発者です。

2
Eric Melski

GNU make:でShell変数を再定義することにより、構築されているターゲットとその理由に関する情報を取得できます。

__ORIGINAL_Shell:=$(Shell)
Shell=$(warning Building $@$(if $<, (from $<))$(if $?, ($? newer)))$(TIME) $(__ORIGINAL_Shell)

たとえば、trace-targets.mk

__ORIGINAL_Shell:=$(Shell)
Shell=$(warning Building $@$(if $<, (from $<))$(if $?, ($? newer)))$(TIME) $(__ORIGINAL_Shell)

all: aa.stamp ba.stamp

%.stamp:
    echo stamp > $(@)

stamp-clean:
    rm -vf *.stamp

clean: stamp-clean

.PHONY: %.phony
%.phony:
    echo $(@)

aa.stamp: ab.stamp
ab.stamp: ac.stamp

ba.stamp: bb.stamp
bb.stamp: bc.phony

クリーンアップ後にtrace-targets.mkを実行:

$ make -f trace-targets.mk
trace-targets.mk:9: Building ac.stamp
echo stamp > ac.stamp
trace-targets.mk:9: Building ab.stamp (from ac.stamp) (ac.stamp newer)
echo stamp > ab.stamp
trace-targets.mk:9: Building aa.stamp (from ab.stamp) (ab.stamp newer)
echo stamp > aa.stamp
trace-targets.mk:18: Building bc.phony
echo bc.phony
bc.phony
trace-targets.mk:9: Building bb.stamp (from bc.phony) (bc.phony newer)
echo stamp > bb.stamp
trace-targets.mk:9: Building ba.stamp (from bb.stamp) (bb.stamp newer)
echo stamp > ba.stamp

次に、クリーニングせずにtrace-targets.mkを再度実行します。

$ make -f trace-targets.mk
trace-targets.mk:18: Building bc.phony
echo bc.phony
bc.phony
trace-targets.mk:9: Building bb.stamp (from bc.phony) (bc.phony newer)
echo stamp > bb.stamp
trace-targets.mk:9: Building ba.stamp (from bb.stamp) (bb.stamp newer)
echo stamp > ba.stamp

John Graham-Cumming でこのメソッドを説明した人によるクレジット GNU Make でのルール実行のトレース.

1
Iwan Aucamp