Makefile 如果文件不';不存在?

Makefile 如果文件不';不存在?,makefile,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 只要所有文件都存在,一切都会顺利进行。但也有一些例子,我手动提供

我有几个文件之间的依赖关系,其中一个文件是从另一个文件生成的。例如,需要
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本身不需要通过另一个目标创建)

函数返回与模式匹配的文件列表,并删除不匹配的文件。这也适用于没有通配符/全局字符的文件名

或者(更详细一点)

相同的基本思想,但返回一个“规范绝对名称”,因此您不能直接使用其结果(除非您希望那里有一个绝对路径),因此我们使用函数短路的事实,仅当
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
旧).

是不是
多施魔法-o foo-temp.xml foo.xml
在这里还是在你的原稿中是一个打字错误?这不应该是
多施魔法-o foo.xml foo-temp.xml
?这并不会影响这个问题。@EtanReisner:哦,你是对的,修复了。两者的组合都有效。我使用了
$(和..)实际上,
函数,因为它允许我添加对全局变量的依赖关系:
$(和$(ROOTFILE),bla.txt)
当主
$ROOTFILE
bla.txt
存在时,会生成一个依赖项。@Jens是的,
对于类似的有条件的东西是有用的。不过,一句忠告。在make上下文中避免多余的空格。它们并不总是在你期望的地方被剥离/忽略。因此我建议
$(和$(ROOTFILE),bla.txt)
而不是
$(和$(ROOTFILE),bla.txt)
,尽管我认为这在这种情况下并不重要。啊,我不知道!谢谢:)
foo-temp.xml: $(wildcard bar.txt)
foo-temp.xml: $(and $(realpath bar.txt),bar.txt)