始める前に、このケースでは C/C++ プロジェクトのビルドに GNU Make を使用していないことを述べておきます。
メイクファイル:
DEST_DIR = build/
SRC_DIR = src/
$(SRC_DIR)a/ : $(SOMETHING_ELSE)
$(DO_SOMETHING_TO_GENERATE_A_DIR)
$(DEST_DIR)% : $(SRC_DIR)%
cp -r $^ $@
ALL_DEPS += <SOMETHING>
... more code which appends to ALL_DEPS ...
.PHONY: all
all : $(ALL_DEPS)
$(SRC_DIR) の Make ルールによって生成されていないファイルがいくつかあります。(この例のために、ディレクトリ $(SRC_DIR)b/ とファイル $(SRC_DIR)c があるとしましょう。)
$(DEST_DIR) 内のファイルまたはディレクトリを表すすべてのターゲットを ALL_DEPS に追加して、「make all」が利用可能なすべての $(DEST_DIR)% ルールを実行するようにします。
私はこのようなことを考えました:
ALL_DEPS += $(addprefix $(DEST_DIR),$(notdir $(wildcard $(SRC_DIR)*)))
しかしもちろん、それはまだ作られていないものを捉えることはできません。(つまり、 $(SRC_DIR)a/ は $(wildcard ...) 呼び出しが評価され、シェルがそれを$(wildcard ...) 呼び出しによって返される結果。)
したがって、パターンに一致するすべての (現在存在する)ファイルを検索する関数ではなく、パターンに一致するすべてのターゲットを検索する関数が必要です。次に、次のようなことができます。
ALL_DEPS += $(addprefix $(DEST_DIR),$(notdir $(targetwildcard $(SRC_DIR)*)))
何か問題があれば、私は GNU Make コードの多くを複数のファイルに分割し、「マスター」Makefile に含めました。ALL_DEPS 変数は、追加するものがあるこれらのファイルのいずれかに追加されます。これは、1 つの巨大な Makefile にすべてをドロップするのではなく、ビルド プロセスをモジュール化する試みです。
私は間違いなくまだ GNU Make を学んでいます。私がこれについてすべて間違っている場合は、私に知らせてください。
ありがとう!