在make make中清除消息(Makefile silent remove)

我想知道如何在Makefile中避免一些回显:

clean: rm -fr *.o 

这个规则将打印:

 $>make clean rm -fr *.o $> 

我怎样才能避免呢?

首先,实际的命令必须在下一行(或者至lessGNU Make是这样,它可能与其他Make不同) – 我不确定)

 clean: rm -rf *.o 

(注意,在每个规则中,你需要在rm -rf *.o之前有一个TAB

使之静音可以通过给@加上一个前缀:

所以你的makefile变成了

 clean: @rm -rf *.o 

如果没有*.o文件要删除,那么最后还是会显示一条错误消息。 要禁止这些,请添加以下内容

 clean: -@rm -rf *.o 2>/dev/null || true 
  • 2>/dev/null任何错误消息pipe道到/ dev / null – 所以你不会看到任何错误
  • -在命令前面确保make忽略一个非零的返回码

事实上,我正在寻找其他的东西,将这一行添加到Makefile中:

 .SILENT:clean 

同时默默地执行“干净”目标的每一步。

直到有人指出一些缺点,我用这个作为我最喜欢的解决scheme!

我正在回应这个古老的话题,因为它出现在search的高度,答案很混乱。 为了做到用户所需,所需要的是:

 clean: @rm -f *.o 

@表示make不会回应该命令。 rm-f参数告诉rm忽略任何错误,比如没有*.o文件,总是返回成功。

我从OP示例中删除了-r,因为这意味着recursion,而在这里我们只是.o文件,没有任何recursion。

没有必要使用2>&1 >/dev/null因为使用-f将不会打印错误。

 .SILENT: clean 

@地方工作,但它不是在它的影响的命令在Makefile中的相同的地方,所以稍后维护项目的人可能会感到困惑。 这就是为什么@是首选。 这是更好的参考地点。

如果你在命令前加@,它不会回显到shell。 尝试将rm更改为@rm。 ( 参考

从手册: .SILENT实质上已经过时了,因为@更加灵活。

更糟糕的是,打印太多的信息。 警告/错误/私人消息被掩埋在输出中。 另一方面-s.SILENT )只会压制任何东西。 特别是“无所事事”和“最新”的消息可能是一个痛苦。 没有select压制他们。 您必须主动过滤出来或使用像colormake 。 这是一个grep的解决scheme:

 make | egrep -hiv 'nothing to be done|up to date' 

但输出将有行号。 Perl解决scheme因此更好,因为它会立即禁止行号和刷新stdout:

 make | perl -ne '$|=1; print unless /nothing to be done|up to date/i' 

做一个有缺陷的工具。 “GNU make有什么错误?” 这比我能解释得更好。