[英]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 --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_dir
与new_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.