如果文件不存在,如何避免Makefile失败?

时间:2014-11-21 16:27:21

标签: makefile

我在几个文件之间存在依赖关系,其中一个文件是从另一个文件生成的。例如,生成最终bar.txt文件需要foo-temp.xml来生成foo.xml。在我的Makefile中,这表示如下:

foo-temp.xml: bar.txt
    do-magic -o foo-temp.xml bar.txt

foo.xml: foo-temp.xml
    do-more-magic -o foo.xml foo-temp.xml

只要所有文件都存在,一切都顺利进行。但有些情况下,我手动提供foo-temp.xml,而不是从bar.txt生成{; 1}}。事实上,bar.txt在这种情况下甚至不存在。

我怎样才能表达这种"不存在"在我的Makefile中没有失败,因为bar.txt不存在?

1 个答案:

答案 0 :(得分:0)

我不确定这是最好的方法,但它应该有效(假设bar.txt本身永远不需要通过另一个目标创建)。

foo-temp.xml: $(wildcard bar.txt)

wildcard函数返回与模式匹配的文件列表,并删除那些不匹配的文件。这也恰好适用于没有通配符/通配符的文件名。

或者(更详细一点)

foo-temp.xml: $(and $(realpath bar.txt),bar.txt)

相同的基本想法,但realpath返回一个“规范的绝对名称”,所以你不能直接使用它的结果(除非你想要一个绝对路径),所以我们使用and的事实函数短路仅在realpath返回非空值时生成输出。

如果需要自己生成bar.txt,那么这些解决方案都不会起作用,因为它会阻止bar.txt成为先决条件,除非它已经存在(尽管一旦正常生成过程将起作用) )。

如果是这种情况,那么您可以尝试使用make -o foo-temp.xml foo.xml告诉make foo-temp.xml无限旧,应该短路试图重新制作它(并处理它的先决条件)并且应该让foo.xml: foo-temp.xml规则工作(假设foo.xml不存在或者比您手动创建的foo-temp.xml旧。