MakeFile:依存関係評価の順序
-
23-10-2019 - |
質問
ターゲットを想定します foo.tar
, 、それはファイルのリストに依存します foo.files
, 、例:
FOO_FILES := $(shell cat foo.files)
foo.tar: foo.files $(FOO_FILES)
tar -cf foo $(FOO_FILES)
ここで、foo.filesを生成する必要があるとします。
foo.files: foo.files.template
sed -e "s/@{VERSION}/$(VERSION)/" < $< > $@
は明らかです foo.files
に依存します foo.files.template
, 、しかし、foo_filesが評価されていることを確認するにはどうすればよいですか 後 foo.filesは生成されますか?
解決
あなたの元のルールは正しいです。 foo.filesを更新するとfoo_filesの値が時代遅れになるため、make.filesがfoo.filesに依存することによってfoo.filesが更新された場合、makefileがgnu makeによって再評価されることを確認する必要があります。
Makefile : foo.files
他のヒント
それで、私は読んでいる答えを見つけました 高度な自動依存性生成 上 mad-scientist.net. 。基本的に、GNU/Make機能によってMakeFileを再評価することが可能です。含まれているMakeFileを生成するルールがある場合、メイクファイル全体が含まれているファイルの生成後に再読されます。したがって -
# -*- mode: make -*-
VERSION := 1.2.3
foo.tar: foo.files $(FOO_FILES)
tar cf $@ $(FOO_FILES)
clean:
rm -f foo.files foo_files.mk foo.tar
foo.files: foo.files.template
sed -e "s/@{VERSION}/$(VERSION)/" < $< > $@
# -- voodoo start here --
# This will ensure that FOO_FILES will be evaluated only
# *after* foo.files is generated.
foo_files.mk: foo.files
echo "FOO_FILES := `xargs < $<`" > $@
include foo_files.mk
# -- voodoo ends here --
.PHONY: clean
- 正しいことをしているようです。
...そして完全性のために:
foo.files.template
は:
a-$(VERSION)
b-$(VERSION)
の存在を仮定します a-1.2.3
と b-1.2.3
.
1つのパスではできません。実際にルールを実行する前にどのターゲットを再構築する必要があるかを決定します。この場合、ルールの1つが実行されるまでターゲットの完全なリストは存在しません。
これはそれをする必要があります:
FOO_FILES := $(shell cat foo.files)
foo.tar: foo.files
$(MAKE) foo-tarball
.PHONY: foo-tarball
foo-tarball: $(FOO_FILES)
tar -cf foo $^
編集:
OPが指摘しているように、これは書かれたとおりに機能しません。前提条件を除外しました:
foo.tar: foo.files $(FOO_FILES)
...
これは、もしあっても再発することに注意してください foo.files
変更されていませんが、厳密に必要ではありません。これを修正することは可能ですが、エレガントではありません。 (比較のために、私が私が私のものよりきれいであると認める選択されたソリューションは、ターゲットが何の関係もない場合でも再発します foo.tar
.)