Makefile语法$(A,B,C)?

Makefile语法$(A,B,C)?,makefile,Makefile,考虑以下代码: $ANIMAL = COW PIG CHICKEN VAMPIRE all: @echo $(ANIMAL, F, >.txt) 我努力在GNU make手册中找到一个提到上述语法的部分,但找不到任何与之相关的内容。它打印什么?功能的语法结构如何 补充:当一行以“@--”开头时,它是什么意思 @-- $(GEN_ENV); ... 回答您的添加:在常规makefile中(读:POSIX,GNU,…) 一个领先的“@”抑制了命令的回音 前导“-”表示忽

考虑以下代码:

$ANIMAL = COW PIG CHICKEN VAMPIRE

all:
        @echo $(ANIMAL, F, >.txt)
我努力在GNU make手册中找到一个提到上述语法的部分,但找不到任何与之相关的内容。它打印什么?功能的语法结构如何

补充:当一行以“@--”开头时,它是什么意思

@-- $(GEN_ENV); ...

回答您的添加:在常规makefile中(读:POSIX,GNU,…)

  • 一个领先的“@”抑制了命令的回音
  • 前导“-”表示忽略非零退出状态
  • 两者都可以组合,重复也可以,因此
    @-@@@-@----echo foo
    @-echo foo
    • 这称为“宏修改器”。这不是GNU制造的特性。看一看。这些修饰符的一般语法:

      $(name,modifier[,modifier]...) 
      
      name is macro expanded, then each modifier is applied in succession to the elements of the expanded value. 
      
      看一看,很明显,它形成了一个文件名列表(截断ANIMAL中每个变量的路径),并添加了.txt。因此,在您的情况下,它应该输出:

      COW.txt PIG.txt CHICKEN.txt VAMPIRE.txt
      
      PS


      我浏览了上面提到的参考资料,不认为第一行($ANIMAL=)是正确的,因为宏定义应该以不带$开头。

      根据您的评论,您实际上使用的是OpusMake,而不是GNU make。您可以在中找到有关它的更多信息。从这些源代码中,您可以看到一个宏示例,该宏在其展开中使用宏修改器

      一般来说,
      $(FOO)
      扩展为变量
      FOO
      的未修改值,而
      $(FOO,mod1[,mod2[,…]])
      扩展为
      FOO
      的值,根据指定的修饰符进行修改。请注意,您可以将任意数量的修改器串在一起,它们将按从左到右的顺序应用

      有很多可能的修饰符,但您的示例具体使用了两个:

      • F
        修饰符,表示“仅使用变量值中每个路径名的最终路径组件”
      • >str
        修饰符,意思是“将文本
        str
        附加到值中每个空格分隔的单词”
      下面是一个简单的例子:

      FOO=abc/def ghi/jkl
      BAR=$(FOO,F)
      BAZ=$(FOO,>.txt)
      BOO=$(FOO,F,>.txt)
      
      • BAR
        将具有值
        def jkl
        (即,每个路径的文件名部分)
      • BAZ
        将具有值
        abc/def.txt ghi/jkl.txt
        (即,将.txt附加到值中每个空格分隔的单词)
      • BOO
        将具有值
        def.txt jkl.txt
        (即,首先只获取每个路径的文件名部分,然后将.txt附加到每个路径)

      这段代码实际上似乎是错误的:分配给以“$”开头的变量?你从哪里得到这段代码,你希望它做什么?1)它不会打印任何东西2)不知道。事实上,我的一位同事告诉我,我们使用的是一种称为OPUS的makefile变体。。。是的,也许这就是为什么很难找到这方面的文档/那么,也许你不应该把它标记为“makefile”和“gnu”,而把它标记为“opus”来迷惑人们?