web-dev-qa-db-ja.com

デバッグGNU make

makeには、ターゲットのどの前提条件が更新されていないかを調べるコマンドラインの方法がありますか?

69
mithuna
make -d

メイクファイルをデバッグするのに十分な情報よりもmoreを提供する必要があります。

警告:出力を分析するには多少の時間と労力がかかりますが、お気に入りのエディターに出力を読み込んで検索を行うと、非常に役立ちます。

興味のある特定のターゲットを指定すると、デバッグ出力の量を大幅に削減できます。したがって、make -dだけではなく、dodgyターゲットのみに興味がある場合は、さまざまなものを試してください:

make clean
make -d dodgy

(もちろん、cleanターゲットがあると仮定します)。

make --debugmake -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'.
96
paxdiablo

Makeの「ドライラン」をお探しですか? makeは実際に実行せずに何を実行しているかを出力し、何が起こるかを確認できるようにします。

フラグは-nです。make -nのように使用します。

23
LiraNuna

GNUデバッガーでのmakeおよびより良いトレース/エラー出力: Remake

スクリーンキャスト: http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=4

8
rocky

あなたの質問は少し不明瞭です。最近変更されていない前提条件ファイルを確認する場合は、ls -lを使用して変更時刻を確認してください。 makeの動作を確認するには、次を試してください。

#makeは、このターゲットを作成するタイミングと理由を通知します。
 sometarget:preq1 preq2 preq3 
 @echo making $ @ 
 @echoターゲットよりも新しい:$?
 do_things 
7
Beta

私が通常行うことは、以前の回答者が言ったように、-dを使用しないことです。

私のどちらか:

  1. -pを使用してデータベースを印刷し、作成されたルールを確認します。これは、2番目の展開ルールがあり、その場でルールを作成している場合、特に再帰的なmakeの場合に便利です。
  2. $(info)関数の頻繁な使用。
  3. このDrDobbs記事で説明されているヒントとコツを使用してください デバッグ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
6
George André

this (古いがまだ機能している)ジョン・グラハム・カミングによる対話型makeデバッガーも使用したことがある

1
Alex

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
  • $(call ...)はテンプレートを呼び出します
  • $(info ...)は、テンプレート置換の結果を出力します。 (evalは、出力の解析と現在のmakeファイルへの追加を呼び出します)

ここに私のメイクファイルの詳細: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html

0
MichaelMoser