どのターゲットがどの前提条件に依存するかについて、少なくとも明確に構造化された情報を出力する一種のハックを見つけました。欠点は、非常に邪魔になることです。つまり、メイクファイルを変更して、すべてのターゲットのビルドレシピを小さな条件関数にラップする必要があります。簡単な例を投稿します。
getRecipe = $(if $(DEPENDENCY_GRAPH),@echo Target $@ depends on prerequisites "$^",$(1))
VARIABLE_TARGET_NAME = foobar.txt
all : TopLevelTarget
TopLevelTarget : Target_A Target_D
$(call getRecipe,\
@echo Building target $@)
Target_A : Target_B
$(call getRecipe,\
@echo Building target $@)
Target_D : Target_C
$(call getRecipe,\
@echo Building target $@)
Target_B : $(VARIABLE_TARGET_NAME)
$(call getRecipe,\
@echo Building target $@)
Target_C :
$(call getRecipe,\
@echo Building target $@)
$(VARIABLE_TARGET_NAME) :
$(call getRecipe,\
@echo Building target $@)
この例では、手巻きのgetRecipe関数を使用して個々のターゲットのレシピをラップし、そのレシピを実際に実行するか、ビルド中のターゲットと依存する前提条件を単に出力するかを決定します。後者は、変数DEPENDENCY_GRAPH
が設定されている場合にのみ発生します(たとえば、環境変数として)。この例では、ビルドレシピはターゲットがビルドされていることを示すエコーにすぎませんが、これを明らかに任意のコマンドに置き換えることができます。
ではDEPENDENCY_GRAPH
1に設定し、出力でこの結果:
Target foobar.txt depends on prerequisites ""
Target Target_B depends on prerequisites "foobar.txt"
Target Target_A depends on prerequisites "Target_B"
Target Target_C depends on prerequisites ""
Target Target_D depends on prerequisites "Target_C"
Target TopLevelTarget depends on prerequisites "Target_A Target_D"
これは、解析してドットグラフに変換するのに十分簡単なはずです。
ではDEPENDENCY_GRAPH
、すべての設定または0に設定されていないと、出力は次のようになります。
Building target foobar.txt
Building target Target_B
Building target Target_A
Building target Target_C
Building target Target_D
Building target TopLevelTarget
または、言い換えれば、通常のビルドレシピが代わりに使用されます。複雑なレシピでこれが確実に機能するかどうかはまだテストしていません。私が既に遭遇した問題の1つは、複数行のレシピではまったく機能しないことです。
たとえば、最後のターゲットのビルドレシピで、ターゲットがビルドされていると言うことに加えて、実際touch
にファイルにしたかった場合:
$(VARIABLE_TARGET_NAME) :
$(call getRecipe,\
@echo Building target $@\
touch $@)
make
そのtouch $@
部分は前の行のエコーの一部にすぎないと考えているようです:
Building target foobar.txt touch foobar.txt
私は前の行の末尾にバックスラッシュをオフのままにしておくと、make
文句*** unterminated call to function
コール':欠落しているが)'. Stop.
、誰もが取得する方法のアイデアがある場合はmake
素敵を再生するためには、私はすべての耳です。:)
編集:このアプローチのもう1つの問題は、ビルド結果がまだ存在しない場合にのみ機能することです。make
明らかに、最新とみなされるターゲットのビルドレシピを実行しません。