9

いくつかの複雑な依存関係を解決するエレガントな方法を見つけようとしています。Makefile に次のようなものがあります。

.PHONY: FOO
FOO: foo
foo:
    build foo

.PHONY: BAR
BAR: bar
bar: FOO
    build bar

ここでの考え方は、実際のファイル (foo、bar) を偽のターゲット (FOO BAR) で抽象化したいということです。もちろん、実際の Makefile ではもっと複雑なので、抽象化が重要です。ただし、ここでの問題は、偽のターゲット FOO を bar の依存関係にすることです。その場合、たとえ foo と bar の両方が最新であっても、Make は常に bar を再構築しようとします。これは明らかに、常に FOO が古いものとして扱われるためです。しかし、この動作は実際には正しくありません。

したがって、3 つのオプションしかないようです。1) bar を foo に直接依存させる。私の実際の Makefile では、より複雑であり、実際のファイルを依存関係として指定しようとすることは非常に望ましくありません。2) すべての偽物に加えて変数を使用します。これにより、Makefile 全体がより複雑になります。3) bar から依存関係として foo/Foo を削除し、bar の規則の一部として FOO の再帰的な make を追加します。これは非常に悪いフォームです。

私が気付いていない、よりエレガントなソリューションはありますか?

ありがとう。

4

2 に答える 2

2

この状況に対する GNU make の答えは、順序のみの依存関係です。「古い」関係を持たずに、ターゲットの順序を指定できます。あなたの質問から、これがあなたが探しているもののようです。

したがって、上記の makefile スニペットは次のようになります。

.PHONY: FOO
FOO: foo
foo:
    build foo

.PHONY: BAR
BAR: bar
bar: | FOO
    build bar

これにより、常に bar の前に foo をビルドできますが、foo が更新されたときにその bar をビルドする必要があることは強制されません。make BARfooが呼び出され、foo のファイルが存在しない場合にのみビルドされます。

于 2015-02-18T04:25:53.507 に答える