如何在Makefile中复制一个目录?

26

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

  • 避免在每个make运行中进行完整目录的复制(即不使用cp -r
  • 保证一致性(即如果images/中的文件更改,它应自动更新到build/images/
  • 避免在Makefile中为每个图像和每个子目录指定规则
  • make内解决问题,如果可能,不要使用rsynccp -u

我正在使用GNU make,因此允许使用GNU特定的内容。


2
看一下这个链接:https://dev59.com/fXE95IYBdhLWcg3wDpcG#2483203 (使用cp代替convert)。但我个人认为使用rsync更加简洁和健壮。 - Martin Wickman
1个回答

38

我会使用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))

4
你可能希望在rsync命令中添加--delete选项以删除源树中被删除的文件。 - bitmusher
如果使用了-p,rsync会忽略-E选项。 - Nick Zalutskiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接