我在几个文件之间存在依赖关系,其中一个文件是从另一个文件生成的。例如,生成最终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
不存在?
答案 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
旧。