抑制make clean中的消息(Makefile silent remove)

时间:2010-06-30 10:51:47

标签: makefile

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

clean:
    rm -fr *.o

此规则将打印:

$>make clean   
rm -fr *.o

$>

我该如何避免?

5 个答案:

答案 0 :(得分:69)

首先:实际命令必须在下一行(或者至少是GNU 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将任何错误消息传递给/ dev / null - 因此您不会看到任何错误
  • 命令前面的-确保make忽略非零返回码

答案 1 :(得分:24)

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

.SILENT:clean

在静默执行“干净”目标的每一步时。

在有人指出这个问题之前,我会将此作为我最喜欢的解决方案!

答案 2 :(得分:14)

我正在回应这个古老的话题,因为它在搜索中占据了很高的位置,答案令人困惑。为了做到用户想要的,所需要的只是:

optional func imagePickerController(_ picker: UIImagePickerController,
  didFinishPickingMediaWithInfo info: [String : AnyObject])

@表示make不会回显该命令。 clean: @rm -f *.o 的{​​{1}}参数告诉-f忽略任何错误,例如没有rm个文件,并始终返回成功。

我从OPs示例中删除了-r,因为它意味着递归,这里我们只是rm *.orm个文件,没有什么可以递归的。

不需要.o,因为使用2>&1 >/dev/null时不会打印错误。

-f

代替.SILENT: clean ,但它与Makefile中的命令不在同一个地方,因此稍后维护项目的人可能会感到困惑。这就是为什么@是首选。这是更好的参考地点。

答案 3 :(得分:8)

如果在命令前放置@,它不会回显到shell。尝试将rm更改为@rm。 (的 Reference

答案 4 :(得分:4)

来自手册:.SILENT is essentially obsolete since @ is more flexible.

更糟糕的是 make 打印的信息太多了。警告/错误/私人消息隐藏在输出中。另一方面,-s.SILENT)可以抑制任何事情。特别是“无所事事”和“最新”的消息可能是一种痛苦。没有选择来压制它们。您必须主动过滤它们或使用colormake之类的内容。这是 grep 的解决方案:

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

但输出会有行号。因此,Perl解决方案更好,因为它可以立即抑制行号和刷新标准:

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

制作一个有缺陷的工具。 "What’s Wrong With GNU make?"比我更好地解释了这一点。