2

次のようなディレクトリ ツリーがあります。

├── dir_a
│   └── file_1.txt
├── dir_b
│   └── dir_c
│       ├── file_2.txt
|       └── file_3.txt
└── file_4.txt

このディレクトリ構造をミラーリングして、各テキスト ファイルを処理するコマンドの結果を保持したいと考えています。つまり、出力は次のようになります。

├── build
│   ├── dir_a
│   │   └── processed_file_1.txt
│   ├── dir_b
│   │   └── dir_c
│   │       ├── processed_file_2.txt
│   |       └── processed_file_3.txt
│   └── processed_file_4.txt
├── dir_a
│   └── file_1.txt
├── dir_b
│   └── dir_c
│       ├── file_2.txt
|       └── file_3.txt
└── file_4.txt

私は Makefile にあまり詳しくないので、私の質問は次のとおりです: Makefile を取得してディレクトリ構造を再作成し、すべてのテキスト ファイルを再帰的に処理してビルド ディレクトリ内の適切な場所に配置するにはどうすればよいですか? 入力ファイルが変更されるたびにこれを繰り返し実行するので、変更されていないファイルを処理しない Makefile が適切な方法のようです。

更新: 新しい入力ファイルが頻繁に追加されることにも言及する必要があるため、Makefile でそれらに明示的に名前を付けたくありません。

4

2 に答える 2

2

その「processed_」文字列を挿入するのではなく、異なるサフィックスを持つステムを使用した方が簡単ですが、ここで私にとってうまくいく例を次に示します。

OUTPUTS := build/dir_a/processed_file_1.txt       \
           build/dir_b/dir_c/processed_file_2.txt \
           build/dir_b/dir_c/processed_file_3.txt \
           build/processed_file_4.txt

all: $(OUTPUTS)

.SECONDEXPANSION:
$(OUTPUTS): build/% : $$(subst processed_file_,file_,%)
    mkdir -p $(dir $@)
    cp $< $@

clean:
    rm -rf build

.SECONDEXPANSIONファイル名の先頭ではなく末尾を変更することで、複雑さを取り除くことができます。

OUTPUTS := build/dir_a/file_1.out       \
           build/dir_b/dir_c/file_2.out \
           build/dir_b/dir_c/file_3.out \
           build/file_4.out

all: $(OUTPUTS)

$(OUTPUTS) : build/%.out : %.txt
    mkdir -p $(dir $@)
    cp $< $@

clean:
    rm -rf build
于 2012-07-05T17:27:10.903 に答える
0

Carlが提案したように、 2次拡張を使用できますが、注文のみの前提条件と組み合わせて使用​​できます。

BUILD_DIR = build

IN_FILES := dir_a/file_1.out       \
            dir_b/dir_c/file_2.out \
            dir_b/dir_c/file_3.out \
            file_4.out

OUT_FILES := $(IN_FILES:%=$(BUILD_DIR)/%)

all: $(OUT_FILES)

.SECONDEXPANSION:
$(OUT_FILES) : $(BUILD_DIR)/%.out : %.txt | $$(@D)/.
    # your text processing rule here...

%/. :
    mkdir -p $*

| $$(@D)意味:

  • 二次拡張中に、$(@D) 自動変数(ターゲットのディレクトリ部分)の値を計算し、
  • 順序のみの依存関係を追加します。つまり、ディレクトリが存在することを確認しますが、ターゲットがディレクトリよりも古い場合は、ターゲットを再作成することを検討しないでください(多くの場合)
于 2012-07-05T17:49:13.330 に答える