Makefile 仅在外部工具出现错误时停止生成,而不是在警告时停止生成

Makefile 仅在外部工具出现错误时停止生成,而不是在警告时停止生成,makefile,gnu-make,Makefile,Gnu Make,在一个构建过程相当复杂的项目中,我需要通过一个工具传递一些生成的文件,该工具在stdout上从stdin生成一些输出 相应的配方为: out-file: in-file @tool < $< > $@ 然后它将不在出现错误时停止 我如何实现这种行为,最好只使用make 如果您关心的代码是返回代码,则需要手动捕获错误并仅在出现错误时退出 比如: @tool < $< > $@; [ $$? -ne 2 ] @工具

在一个构建过程相当复杂的项目中,我需要通过一个工具传递一些生成的文件,该工具在
stdout
上从
stdin
生成一些输出

相应的配方为:

out-file: in-file
    @tool < $< > $@
然后它将在出现错误时停止

我如何实现这种行为,最好只使用make


如果您关心的代码是返回代码,则需要手动捕获错误并仅在出现错误时退出

比如:

@tool < $< > $@; [ $$? -ne 2 ]
@工具<$<>$@;[$$?-ne 2]
或者更确切地说:

@tool < $< > $@; ret=$$?; [ $$ret -eq 0] || [ $$ret -eq 1 ]
@工具<$<>$@;ret=$$?;[$$ret-eq 0]|[$$ret-eq 1]

谢谢,但这是假设bash,不是吗?我不这么认为。尽管它可能(而且可能确实)假设
sh
-派生,而不是
csh
-派生。但是这个想法是重点。是的,对不起,我不够清楚;-)我的意思是,这在Windows操作系统上不起作用(除非MSYS或类似系统)。这就是为什么我要一个纯make解决方案。但这可能是不可能的。您应该能够在Windows上对
%ERRORLEVEL%
或任何我相信的东西执行相同的操作。再次强调,关键是机制。不,你不能单独用make来做这件事,因为make只是检查成功与失败。我可能错过了什么,我试图实现你的答案,但使用了
@ret=$(ls);按照配方给我的提示,回显“ret=-$ret-”
。而替换为
$(ret)
会给出一个空内容(尽管shell上的
echo$?
会给出
0
)。我还尝试了
@ret=$(shell ls);echo“ret=-$(ret)-”
(我不清楚这些区别),但这会产生一个错误。我错过什么了吗?
@tool < $< > $@; ret=$$?; [ $$ret -eq 0] || [ $$ret -eq 1 ]