0

始める前に、このケースでは 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 を学んでいます。私がこれについてすべて間違っている場合は、私に知らせてください。

ありがとう!

4

1 に答える 1

2

あなたがやろうとしていることをすることは不可能です。存在しないものを make に認識させようとしています。

これが、一般的にワイルドカードが良くない理由の 1 つです (もう 1 つの理由は、意図しないものを含めてしまう可能性があることです)。ここで行うべき正しいことは、sourceファイルのリスト ( ) を明示的に作成し、そのリストに対して変換をls -1 | sed -e 's/\(.*\)/sources+=\1/' > dir.mk実行することです。patsubst

ビルドの一部として生成される追加のファイルがある場合は、それらをそのリストに追加すると、期待どおりにそれらのルールが検出されます。

于 2014-02-02T02:52:34.767 に答える