25

我有一个要从 Makefileimages/中复制到的目录。build/images/该目录可能包含多个级别的子目录。最优雅的方法是什么?我想:

  • 避免在每次make运行时复制完整的目录(即 no cp -r
  • 保证一致性(即,如果一个文件在其中更改,images/则应在 中自动更新build/images/
  • 避免为 Makefile 中的每个图像和每个子目录指定规则
  • 解决内的问题make,所以没有rsynccp -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和链接,这篇文章以某种方式重新实现它们(未经测试,需要findmkdir和普通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 回答