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