質問

ターゲットを想定します 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.3b-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.)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top