0

以下は、私の問題に対する現在の「解決策」です。別のディレクトリの依存関係のルールが見つからない場合、make はこれを自動的に行うはずだと思っていましたが、なぜそう思ったのかわかりません。もっと良い方法を知っていますか?

../a/作成する Makefile がある別のディレクトリがあります../a/generated.h

.PHONY: FORCE

FORCE:

my.c: ../a/generated.h
    cp --preserve=timestamps $< $@

../a/generated.h: FORCE
    $(MAKE) -C $(dir $@) $(notdir $@)

「外部」ファイルごとに 2 番目の規則が重複しないようにするために使用できる一般的な形式がありますが、前述のとおり、これはすべて不必要だと思いました。

define REMOTE
$(1): FORCE
    $$(MAKE) -C $$(dir $$@) $$(notdir $$@)
endef

$(eval $(call REMOTE,../a/generated.h))
$(eval $(call REMOTE,../a/anotherGeneratedFile.h))
4

2 に答える 2

1

make の再帰呼び出しは、ターゲットの依存関係の直接非巡回グラフ (DAG) を壊すことが知られており、予期しない動作の原因になる可能性があります。

「Recursive Make Considered Harmful」で提案されているように、問題の 1 つの可能な解決策は、プロジェクトに単一の Makefile を用意することです。そうしないと、ビルドシステムの抽象化のレベルを「上げ」て、 のようなツールに移行する可能性がありますcmake

于 2013-02-11T21:06:48.510 に答える
0

別のディレクトリの依存関係のルールが見つからない場合、make はこれを自動的に行うはずだと思っていましたが、なぜそう思ったのかわかりません。

GNU Make にはそのような組み込み規則はありません。Catalog of Implicit Rulesですべての組み込みルールを参照してください。

あなたのソリューションは中途半端に機能するはずです。の依存関係がない../a/generated.hため (再帰的な make を使用しており、それらの依存関係はそのディレクトリ内の makefile にしか認識されていないため)、自動的に再構築されません。../a/generated.hただし、存在しない場合は構築されます。

于 2013-02-11T22:17:04.707 に答える