1

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 が生成された後にfoo.files.templateFOO_FILESが評価されるようにするにはどうすればよいでしょうか?

4

3 に答える 3

4

元のルールは正しいです。foo.files を更新すると FOO_FILES の値が古くなるため、Makefile を foo.files に依存させることによって foo.files が更新されたときに、Makefile が gnu make によって再評価されるようにする必要があります。

Makefile : foo.files
于 2011-01-23T13:03:13.340 に答える
0

1 回のパスで行うことはできません。Make は、実際にルールを実行する前に、どのターゲットを再構築する必要があるかを判断します。この場合、ルールの 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。)

于 2011-01-23T09:01:45.100 に答える
0

そこで、mad-scientist.netAdvanced Auto-Dependency Generationに関する回答を見つけました。基本的に、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

于 2011-01-23T10:21:32.117 に答える