就像标题所说的那样,我想只在某个文件不存在时才建立依赖关系,而不是每次都更新。
我有一个根目录(带有makefile的目录),在其中有一个名为“example”的子目录。在我的根目录中有四个.h文件(functions.h,parser.h,node.h和exception.h),如果那些.h文件还不存在,我想复制到“example”子目录在“例子”中。
不幸的是,我不能只在标准依赖项中检查“示例”中的头文件,因为每次我将头文件从root复制到“example”时,“example”中的头文件将被视为已更新并将每次运行make时触发依赖项。我希望有一种方法可以让我的makefile将头文件从根目录复制到“example”,只要它们在“example”中不存在。
答案 0 :(得分:27)
这是order-only prerequisites/dependencies的用途:
但是,有时您可能希望对要调用的规则强制执行特定排序,而不强制在执行其中一个规则时更新目标。在这种情况下,您希望定义仅订单的先决条件。可以通过在先决条件列表中放置管道符号(
|
)来指定仅订单的先决条件:管道符号左侧的任何先决条件都是正常的;右边的任何先决条件都是仅限订单。
在你的情况下:
examples/%.h : | %.h
cp $| $@
答案 1 :(得分:4)
您必须根据相对文件年龄来表达依赖关系。
常用的解决方法是使用标记操作完成的虚拟(“sentinel”)文件:
examples/%.h.hasbeencopied: %.h
if [ -f example/$@.h ] || cp -p $< examples/$@.h; \
then touch $@; \
else rm -f $@; \
fi
并根据example/foo.h
制定依赖于example/foo.h.hasbeencopied
的任何规则。