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 で対応する、という名前の特別なファイルにターゲットを事実上依存させます。call
とshell
は GNU Make 拡張であることに注意してください。