繁体   English   中英

递归复制带有剥离前缀的文件

[英]recursively copy files with stripping prefix

我正在尝试创建一个 GNU Makefile 规则,将文件(通过 VPATH 找到)从一个目录复制到另一个目录,保留它们的目录结构。

有无数种方法可以做到这一点(从cp -r开始),但似乎它们都没有在make的上下文中工作,其中复制是在目标目录中启动的。

例如

  cp ../src/foo.c ../src/bar.c .

所有的源文件共享一个公共目录(只在运行时知道),这个公共目录应该被剥离。

例如

  $ srcdir=../../knurgl
  $ cp ${srcdir}/src/foo.c ${srcdir}/src/bar.c .
  $ find . -type f
  ./src/foo.c
  ./src/bar.c

即使公共目录在运行时已知,它也可以是任意的,甚至包括当前目录. (在这种情况下,操作应该是 nop)。

这是我试过的:

cp

cp --parent ${srcdir}/src/foo.c ${srcdir}/src/bar.c .

但是当从目标目录调用时,这理所当然地拒绝工作(因为它总是将文件复制到自己身上)。

柏油

tar c ${srcdir}/src/foo.c ${srcdir}/src/bar.c | tar x

这会./knurgl/src/foo.c任何相关目录,但保留其余目录(所以我最终使用./knurgl/src/foo.c而不是./src/foo.c

--strip-components选项对我帮助不大,因为我不知道${srcdir}的深度。

代替

cp --parent ${srcdir}/src/foo.c ${srcdir}/src/bar.c .

(这不起作用,因为它不会剥离$srcdir )你可以写

(wd=$PWD; cd $srcdir; cp --parent src/foo.c src/bar.c $wd)

make具有处理字符串的内置函数。 要更换old_base_dirnew_base_dir在变量path ,电话:

$(path:old_base_dir/%=new_base_dir/%)

您还可以让它在列表上执行替换:

$(foreach path,$(path_list),$(path:old_base_dir/%=new_base_dir/%)

这里,变量path_list包含多个文件。 请注意,如果文件名包含空格,这将中断。

GNU make 手册描述了更多有用的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM