我在几个文件之间有一个依赖关系,其中一个是从另一个文件生成的。例如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
;实际上,bar.txt
在这种情况下甚至都不存在。
如何在我的Makefile中表达这种“不存在”而不会因为bar.txt
不存在而失败呢?
我不确定这是否是最好的方法,但是它是否可以工作(假设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
是无限老的,这应该使make尝试进行重新制作(并处理其先决条件)短路,并应让foo.xml: foo-temp.xml
规则起作用(假设foo.xml
不存在或早于该规则)。foo-temp.xml
您手动创建的)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句