make
には、ターゲットのどの前提条件が更新されていないかを調べるコマンドラインの方法がありますか?
make -d
メイクファイルをデバッグするのに十分な情報よりもmoreを提供する必要があります。
警告:出力を分析するには多少の時間と労力がかかりますが、お気に入りのエディターに出力を読み込んで検索を行うと、非常に役立ちます。
興味のある特定のターゲットを指定すると、デバッグ出力の量を大幅に削減できます。したがって、make -d
だけではなく、dodgy
ターゲットのみに興味がある場合は、さまざまなものを試してください:
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
スクリーンキャスト: http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=4
あなたの質問は少し不明瞭です。最近変更されていない前提条件ファイルを確認する場合は、ls -lを使用して変更時刻を確認してください。 makeの動作を確認するには、次を試してください。
#makeは、このターゲットを作成するタイミングと理由を通知します。 sometarget:preq1 preq2 preq3 @echo making $ @ @echoターゲットよりも新しい:$? do_things
私が通常行うことは、以前の回答者が言ったように、-dを使用しないことです。
私のどちらか:
以下は、値を出力するために使用しているコードです。
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
this (古いがまだ機能している)ジョン・グラハム・カミングによる対話型makeデバッガーも使用したことがある
make gnu makeテンプレートを使用して、ターゲットごとの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
ここに私のメイクファイルの詳細: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html