我在Makefile中定义了一个文件列表。
我需要将这些文件及其目录结构复制到新位置。
我无法使用cp --parent
,因为源文件位于../(所以..将成为dest路径的一部分)。
然后,我决定做一个用于创建dirs的循环,然后是第二个用于复制文件的for循环。然而,问题是我似乎无法在for循环的主体中调用$(dir $$file)
。我总是得到“./”作为结果,而不是实际的目录名称。如果我执行类似echo $(dir foo/bar)
的操作,那可以正常工作,但echo $(dir $$file)
(当$$file
为'foo / bar'时)始终返回'./'。
我尝试了其他选项,例如$(shell basename $$file)
,但这也不起作用。
我已经尝试定义一个函数并在for的主体中调用它,但是,它也不起作用。
这是一个简单的Makefile示例:
FILES := foo/faz \
bar/baz \
gah/gaz
all:
@for f in $(FILES); do \
echo $(dir $$f); \
done
我希望这个输出为:
foo
bar
gah
但相反,我得到了:
./
./
./
如果我的方法不是最好的,我会接受其他解决方案。在一天结束时,我需要能够将../(例如../foo/bar)中存在的所有$(FILES)复制到名为$(NEWDIR)的新目录(所以newdir / foo / bar,例如)。
这只需要在Linux下工作。
答案 0 :(得分:3)
f
是一个shell变量。在函数dir
上调用make函数$f
(然后shell将其解释为变量扩展)。
如果使用shell循环,则需要使用shell的构造来提取目录部分:
@set -e; for f in $(FILES); do \
echo $$(dirname $$f); \
done
不要忘记set -e
,这样如果在复制过程中出现错误,make规则就会失败。
您还可以在make中使用foreach
函数来生成一堆cp
命令。它使makefile更难调试。