如何复制Makefile中的目录?

Gru*_*bel 21 directory makefile gnu-make

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

  • 避免每次make运行时都有完整的目录副本(即没有cp -r)
  • 保证一致性(即如果文件中的文件更改images/应自动更新build/images/)
  • 避免为Makefile中的每个图像和每个子目录指定规则
  • 解决问题make,所以没有rsynccp -u如果可能的话

我正在使用GNU make,因此允许GNU特定的东西.

lio*_*ori 30

好吧,我只是用rsync.make您将使用这些约束创建的任何脚本只会复制其功能,并且很可能会更慢并且可能包含错误.示例规则可能看起来如下:

build/images:
    rsync -rupE images build/

.PHONY: build/images
Run Code Online (Sandbox Code Playgroud)

(.PHONY每次触发规则).

也许可以使用符号链接或硬链接?

build/images:
    ln -s ../images build/images
Run Code Online (Sandbox Code Playgroud)

如果你真的想避免.PHONY和链接,这片重新实现它们以某种方式(未测试,需要rsync,find和普通的mkdir):

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

build: $(patsubst %,build/%,$(image_files))
Run Code Online (Sandbox Code Playgroud)

  • 您可能希望在`rsync`命令中添加`--delete`,以便在从源树中删除文件时删除它们. (4认同)