【问题标题】:What does @: (at symbol colon) mean in a Makefile?@: (在符号冒号处)在 Makefile 中是什么意思?
【发布时间】:2012-01-26 12:04:43
【问题描述】:

以下在 Makefile 中做了什么?

rule: $(deps)
    @:

我似乎在制作手册中找不到这个。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    意思是“不要在输出中回显这个命令”。所以这条规则是说“执行shell命令:并且不要回显输出。

    当然,shell 命令: 是无操作的,所以这是说“什么都不做,不说”。

    为什么?

    这里的诀窍是你得到了两种不同语法的模糊组合。 make(1) 语法是使用以@ 开头的操作,这根本不是为了回显命令。所以像

    这样的规则
    always:
           @echo this always happens
    

    不会发射

       echo this always happens
       this always happens
    

    现在,规则的操作部分可以是任何 shell 命令,包括:。 Bash 帮助解释了这一点以及任何地方:

    $ help :
    :: :
        Null command.
    
        No effect; the command does nothing.
    
        Exit Status:
        Always succeeds.
    

    【讨论】:

    • 谢谢,有什么地方可以更详细地描述这一点吗?我不确定“out-ut”是什么。
    • 别拿我打字开玩笑,总有一天你也会老的。
    • 这是对它的作用的一个很好的解释,但是你有没有机会知道为什么要在 makefile 中这样做?
    • 它在调用大量外部程序的 makefile 中很有用,并且在你想大量使用 echo 让它看起来不错的地方,比如 this one
    • @charles-keepax 如果您特别询问@:(不仅仅是@),那么除了@guestolio 的回答之外,它也可能是开发的剩余存根。这就像在 Python 中编写一个只包含 pass 的函数。它对于复制/粘贴代码块的存根很有用,但它们通常不应该存在很长时间。当以这种方式存根时,文件仍将编译、传递 linting 等。
    【解决方案2】:

    对于那些好奇你为什么要这样做的人,如果你想假装某事已经完成,这很有用,这样 Make 就不会输出“Nothing to be done for”你的目标。

    一个例子是,如果您有一个始终执行的虚假目标,并且其中的命令中有一堆条件。你希望至少有一些东西,以防这些条件出现错误并且什么都不做。

    例如(来自 Linux 的脚本/Makefile.clean):

    __clean: $(subdir-ymn)
    ifneq ($(strip $(__clean-files)),)
        +$(call cmd,clean)
    endif
    ifneq ($(strip $(__clean-dirs)),)
        +$(call cmd,cleandir)
    endif
    ifneq ($(strip $(clean-rule)),)
        +$(clean-rule)
    endif
        @:
    

    【讨论】:

      猜你喜欢
      • 2012-09-25
      • 1970-01-01
      • 2019-09-14
      • 2012-10-09
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      相关资源
      最近更新 更多