Makefile - 仅在文件不存在时才创建依赖项

时间:2014-02-13 05:14:56

标签: makefile dependencies target file-exists

就像标题所说的那样,我想只在某个文件不存在时才建立依赖关系,而不是每次都更新。

我有一个根目录(带有makefile的目录),在其中有一个名为“example”的子目录。在我的根目录中有四个.h文件(functions.h,parser.h,node.h和exception.h),如果那些.h文件还不存在,我想复制到“example”子目录在“例子”中。

不幸的是,我不能只在标准依赖项中检查“示例”中的头文件,因为每次我将头文件从root复制到“example”时,“example”中的头文件将被视为已更新并将每次运行make时触发依赖项。我希望有一种方法可以让我的makefile将头文件从根目录复制到“example”,只要它们在“example”中不存在。

2 个答案:

答案 0 :(得分:27)

这是order-only prerequisites/dependencies的用途:

  

但是,有时您可能希望对要调用的规则强制执行特定排序,而不强制在执行其中一个规则时更新目标。在这种情况下,您希望定义仅订单的先决条件。可以通过在先决条件列表中放置管道符号(|)来指定仅订单的先决条件:管道符号左侧的任何先决条件都是正常的;右边的任何先决条件都是仅限订单。

在你的情况下:

examples/%.h : | %.h
    cp $| $@

另请参阅:Order-only prerequisites do not show up in $^ or $+.

答案 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的任何规则。