14

make変数が変更されたときに(GNU)に再構築してもらいたい。どうすればこれを達成できますか?

例えば、

$ make project
[...]
$ make project
make: `project' is up to date.

...そうあるべきですが、私はそれを好むでしょう

$ make project IMPORTANTVARIABLE=foobar
make: `project' is up to date.

の一部または全部を再構築しprojectます。

4

4 に答える 4

10

Make は可変コンテンツを参照するようには設計されていませんが、Reinier のアプローチは回避策を示しています。残念ながら、変数値をファイル名として使用することは安全ではなく、エラーが発生しやすくなります。Unix ツールが値を適切にエンコードするのに役立つことを願っています。そう

IMPORTANTVARIABLE = a trouble

# GUARD is a function which calculates md5 sum for its
# argument variable name. Note, that both cut and md5sum are
# members of coreutils package so they should be available on
# nearly all systems.
GUARD = $(1)_GUARD_$(shell echo $($(1)) | md5sum | cut -d ' ' -f 1)

foo: bar $(call GUARD,IMPORTANTVARIABLE)
    @echo "Rebuilding foo with $(IMPORTANTVARIABLE)"
    @touch $@

$(call GUARD,IMPORTANTVARIABLE):
    rm -rf IMPORTANTVARIABLE*
    touch $@

$(NAME)_GUARD_$(VALUEMD5)ここでは、安全に参照でき、変数の値と (ほぼ) 1 対 1 で対応する、という名前の特別なファイルにターゲットを事実上依存させます。callshellは GNU Make 拡張であることに注意してください。

于 2013-07-24T09:59:20.090 に答える
8

次のようなものを使用して、空のファイルを使用して変数の最後の値を記録できます。

someTarget: IMPORTANTVARIABLE.$(IMPORTANTVARIABLE)
    @echo Remaking $@ because IMPORTANTVARIABLE has changed
    touch $@

IMPORTANTVARIABLE.$(IMPORTANTVARIABLE):
    @rm -f IMPORTANTVARIABLE.*
    touch $@

実行後、make名前が で始まりIMPORTANTVARIABLE.、変数の値が追加された空のファイルがディレクトリに作成されます。これには基本的に、変数の最後の値が何であったかに関する情報が含まれていますIMPORTANTVARIABLE

このアプローチでさらに変数を追加し、パターン ルールを使用してより洗練されたものにすることができますが、この例はその要点を示しています。

于 2012-07-25T12:35:14.643 に答える
3

最終的な目標が何であるかに応じて、ifdefまたはを使用することをお勧めします。例については、こちらifeqのマニュアルを参照してください。

于 2012-07-25T11:50:41.343 に答える