2014-02-13 55 views
13

就像标题所说,我只想在某个文件不存在的情况下创建一个依赖项,而不是每次更新时。Makefile - 只在文件不存在的情况下依赖项

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

不幸的是,我不能只是制作一个标准的依赖关系来检查“示例”中的头文件,因为每次我将头文件从根文件复制到“示例”时,“示例”中的头文件将被视为更新并且每次运行make时都会触发该依赖项。我想要一种方法让makefile将头文件从根目录复制到“example”,但前提是它们不存在于“example”中。

+0

该手册是非常,非常清楚的是自动变量(如'$ @')是配方中有效_only_。你不能在目标,先决条件或make条件语句中使用它们(因为在读入makefile时扩展了它们)。在这些情况下,'$ @'展开为空字符串。 – MadScientist

+0

我明白了,但是因为我附加了“example /”,所以ifeq()仍然会评估为false。谢谢你清理那个。我编辑了我的帖子,专注于剩下的问题。 – Daniel

回答

21

这是order-only prerequisites/dependencies是:

然而,有时候,你有一个情况下,你要强加的规则特定的顺序被调用,而不强制目标,如果其中的一个被更新规则被执行。在这种情况下,您需要定义仅限订单的先决条件。可以通过在先决条件列表中放置管道符号(|)来指定仅限于订单的先决条件:管道符号左侧的任何先决条件均为正常;任何权利的先决条件是仅限订单。

你的情况:

examples/%.h : | %.h 
    cp $| [email protected] 

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

+1

如果你使用GNU make(你可能是),这是一个很好的答案。 – reinierpost

+0

@reinierpost我不知道为什么会使用任何其他品牌。 –

+0

@reinierpost您的编辑是正确的) –

3

您必须用相对文件年龄来表达依赖关系。

常用的解决方法是使用一个虚拟(“哨兵”)文件标记操作的完成:

,并做出力所能及的规则依据example/foo.h还取决于example/foo.h.hasbeencopied

相关问题