【问题标题】:GNU Make silent by defaultGNU 默认静音
【发布时间】:2014-06-03 00:03:27
【问题描述】:

是否可以默认从Makefile 中抑制命令回显?

我知道在--silent 模式下运行make 可以做到这一点,在每个命令前加上@

我正在寻找一个命令或节,我可以将其包含在内部 Makefile,省去了使用@ 乱扔所有内容或让用户手动使所有内容静音的麻烦。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    如果你定义了目标.SILENT:,那么make 不会回显任何东西。通常最好保护定义,这样您就可以轻松地将其关闭:

    ifndef VERBOSE
    .SILENT:
    endif
    

    现在默认情况下,make 不会打印任何内容,但如果你运行make VERBOSE=1,它会打印。

    请注意,尽管手册中声明 .SILENT 已过时 - 如果保护得当,它通常比 @ 更好(更有用和更灵活)。

    .SILENT 目标不应该是你的Makefile 上的第一个目标,否则make 将默认使用它。

    【讨论】:

    • 比使用ifndef 更简单的方法就是写$(VERBOSE).SILENT:。现在,如果VERBOSE 为空,您将获得.SILENT 目标,但如果您将VERBOSE 设置为任何非空值,它将被禁用(定义一个完全不同的目标,这意味着什么都不做)。如果这对您很重要,这也可以移植到其他版本的 make 中。
    • 应该注意的是,您确保不要将它放在 Makefile 的顶部。否则,当您将VERBOSE 设置为任何非空值时,它将尝试执行目标。对某些用户来说可能很明显,但我花了几分钟想知道为什么我在执行 VERBOSE=1 make 时收到错误 VERBOSE=1 make 认为它会执行我通常的默认目标。
    【解决方案2】:

    您可以在MAKEFLAGS 变量的Makefile 开头添加--silent

    MAKEFLAGS += --silent
    
    all:
        echo foobar
    
    .PHONY: all
    

    你将拥有:

    $ make
    foobar
    

    【讨论】:

    • 我正在使用 GNU make 4.3,而 .SILENT 似乎不再起作用了。但是,这个技巧(添加 --silent 标志)仍然有效。
    • 这个答案指导人们使用更清晰易读的方式。谢谢
    【解决方案3】:

    根据GNU Make's manual,可以使用特殊目标.SILENT

    请注意,手册是这样说的:

    .SILENT 基本上已经过时,因为“@”更灵活。

    但它似乎按预期工作。以下代码使all 目标静音:

    .SILENT:
    
    hoge:
        echo hoge
    

    以下示例仅使 hoge 目标静音:

    .SILENT: hoge
    
    hoge:
        echo hoge
    
    fuga:
        echo fuga
    

    【讨论】:

    • 告诉 cmake
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多