在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有什么错误?” 这比我能解释得更好。