25

Makefile 内images/からコピーしたいディレクトリがあります。build/images/ディレクトリには、複数レベルのサブディレクトリが含まれる場合があります。それを行う最もエレガントな方法は何ですか?私が欲しい:

  • 実行ごとに完全なディレクトリ コピーを避けるmake(つまり no cp -r)
  • 一貫性の保証 (つまり、ファイルが で変更された場合、images/で自動的に更新される必要がありますbuild/images/)
  • Makefile 内の各イメージと各サブディレクトリにルールを指定しないようにする
  • 以内makeに問題を解決するため、いいえrsyncまたはcp -u可能であれば

私は GNU make を使用しているため、GNU 固有のものは許可されています。

4

1 に答える 1

36

まあ、私はただ使用しますrsync。これらmakeの制約を使用して作成するスクリプトは、その機能を複製するだけであり、ほとんどの場合、遅くなり、バグが含まれる可能性があります。ルールの例は次のようになります。

build/images:
    rsync -rupE images build/

.PHONY: build/images

.PHONY毎回ルールをトリガーします)。

代わりにシンボリックリンクまたはハードリンクを使用できますか?

build/images:
    ln -s ../images build/images

本当にリンクを回避したい場合はrsync、この部分で何らかの方法で再実装します (テストされていないfind、 、mkdir、およびプレーンが必要ですcp)。

image_files:=$(shell find images -type f)
build/images/%: images/%
    mkdir -p $(@D)
    cp $< $@

build: $(patsubst %,build/%,$(image_files))
于 2010-06-23T10:38:07.380 に答える