make
ターゲットのどの前提条件が更新されていないかを調べるためのコマンド ラインの方法はありますか?
7 に答える
make -d
makefile をデバッグするのに十分な情報が得られるはずです。
警告: 出力を分析するには時間と労力がかかりますが、出力をお気に入りのエディターにロードして検索を行うと、多くの場合に役立ちます。
関心のある特定のターゲットを指定すると、デバッグ出力の量を大幅に減らすことができます。したがって、何百もの異なるものを作成するのではdodgy
なく、ターゲットのみに関心がある場合は、次を試してください。make -d
make clean
make -d dodgy
clean
(もちろん、ターゲットがあると仮定します)。
はmake --debug
と同じですが、次のmake -d
ように指定することもできます:
make --debug=FLAGS
フラグは次のとおりです。
a
make -d
すべてのデバッグ用 (および と同じmake --debug
)。b
基本的なデバッグ用。v
もう少し詳細な基本的なデバッグ用。i
暗黙のルール用。j
呼び出し情報用。m
メイクファイルのリメイク中の情報については。
make --debug=b
次のトランスクリプトに示すように、必要なものに最適なオプションのようです。
pax@paxbox> cat makefile
c:a b
touch c
pax@paxbox> touch a b ; make
touch c
pax@paxbox> make
make: 'c' is up to date.
pax@paxbox> touch a ; make --debug=b
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc. Blah, blah, blah.
Reading makefiles...
Updating goal targets....
Prerequisite 'a' is newer than target 'c'.
Must remake target 'c'.
touch c
Successfully remade target file 'c'.
Makeの「ドライラン」をお探しですか?実際に実行しなくても make が実行していることを表示するので、何が起こるかを確認できます。
フラグは-n
、のように使用しmake -n
ます。
デバッガーとより優れたトレース/エラー出力を備えた GNU make もあります: Remake
- デモパート 1: https://vimeo.com/232710891
- デモパート 2: https://vimeo.com/97397484
これらはどちらも関連性がありますが、少し古いものです。
あなたの質問は少し不明確です。最近変更されていない前提条件ファイルを確認するには、ls -l を使用して変更時刻を確認します。make が何をしているかを見たい場合は、これを試してください:
# Make は、このターゲットを作成する時期とその理由を通知します。 sometarget: preq1 preq2 preq3 @echo メイキング $@ @echo 次の preq はターゲットよりも新しいものです: $? すること
私が通常行うことは、以前の回答者が言ったように -d を使用することではありません。
私はどちらか:
- -p を使用してデータベースを印刷し、作成されたルールを確認します。これは、2 番目の展開ルールがあり、その場でルールを作成している場合、特に再帰的な make の場合に便利です。
- $(info) 関数の多用。
- この DrDobbs の記事Debugging Makefilesで説明されているヒントとコツを使用してください。
以下は、値を出力するために使用しているコードです。
define pv
$(info $(1) [$(origin $(1))] : >|$($(1))|<)
endef
define pva
$(foreach t,$(1),$(call pv,$(t)))
endef
define itemizer
$(foreach t,$($(1)),$(info $(t)))
endef
John Graham-Cumming によるこの(古いがまだ動作している) インタラクティブな make デバッガーも使用したことが何度かあります。
ターゲットごとに make ルールを定義するために make gnu make テンプレートを使用しています。
テンプレートは、ルールを記述するマクロのようなものです。ここで説明されています https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
この機能は、プロジェクト タイプごとにすべてのルールを生成するためのコア メイクファイルを含むメイク システムがある場合に役立ちます。共有ライブラリを実行するように指示されている場合は、共有ライブラリをコンパイルするためのルールを記述します。他のタイプのターゲットの場合など。
この例では、make コマンド ラインに SHOW_RULES=1 を追加すると、 PROGRAM_target_setup_template によって生成されるルールのテキストも表示されます。ルール自体を生成するとともに(evalを使用)。
# this one defines the target for real
$(foreach prog, $(TARGETS), $(eval $(call PROGRAM_target_setup_template,$(prog))))
ifneq "$(SHOW_RULES)" ""
$(foreach prog, $(TARGETS), $(info $(call PROGRAM_target_setup_template,$(prog))))
endif
- $(call ... ) テンプレートを呼び出す
- $(info ... ) テンプレート置換の結果を出力します。( eval は、出力の解析と現在の make ファイルへの追加を呼び出します)
私のmakeファイルの詳細はこちら: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html