【问题标题】:How to copy a directory in a Makefile?如何在 Makefile 中复制目录?
【发布时间】:2011-03-07 06:12:45
【问题描述】:

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

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

我使用的是 GNU make,所以允许使用 GNU 特定的东西。

【问题讨论】:

标签: directory makefile gnu-make


【解决方案1】:

好吧,我就用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))

【讨论】:

  • 您可能希望在rsync 命令中添加--delete,以便在从源代码树中删除文件时将其删除。
  • 如果使用了-p,rsync 会忽略-E
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多