我的Makefile运行一个程序,当它在输入文件中发现问题时,只是将错误消息转储到stderr但仍返回零。这是Makefile片段:
target:
prog1 -i input1 input2 -o out.txt
prog2
" PROG1"是程序,这是我的修复:
target:
prog1 -i input1 input2 -o out.txt 2>&1 1>/dev/null | tee err_log
if [ -s err_log ]; then false ; fi
prog2
基本上我将stderr重定向到文件err_log并检测err_log是否为空。我还希望错误消息显示在控制台中。
这些都有效,但有一个小麻烦:false
命令,if [ -s err_log ]; then false ; fi
在控制台中显示,它位于控制台的末尾。
我想知道如果在虚假命令的地方,我可以停止制作,但没有消息进入控制台?基本上我最后想要stderr消息。
答案 0 :(得分:0)
您可以通过在配方行前添加make
字符来告诉@
不打印它运行的命令:
target:
prog1 -i input1 input2 -o out.txt 2>&1 1>/dev/null | tee err_log
@if [ -s err_log ]; then false ; fi
prog2
仅供参考,你可以使用:
@[ ! -s err_log ]
获得相同的效果。
答案 1 :(得分:0)
使用尽可能少的辅助文件。它们是您可能需要制定解决方法的其他问题的来源。
如果您只想测试是否正在生成任何输出,可以使用grep
。
您还需要将输出文件声明为目标,并将输入文件声明为依赖项。
所以这应该可以解决问题:
out.txt: input1 input2
prog1 -i $+ -o $@ 2>&1 | grep -q .
prog2
但是,您应该有一个单独的规则来运行prog2
,因为它可能取决于out.txt
。像
out.txt: input1 input2
prog1 -i $+ -o $@ 2>&1 | grep -q .
whatever: out.txt
prog2
如果prog2
拥有并输出文件和输入文件,请将它们作为目标和依赖项。