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

时间:2011-08-04 20:54:59

标签: makefile

请考虑以下代码:

$ANIMAL = COW PIG CHICKEN VAMPIRE

all:
        @echo $(ANIMAL, F, >.txt)

我努力在GNU make手册中找到一个提到上述语法的部分,但我找不到任何与之相关的内容。它的打印内容以及该功能的语法结构如何?

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

@-- $(GEN_ENV); ...

3 个答案:

答案 0 :(得分:0)

回答你的补充:在常规的Makefile中(阅读:POSIX,GNU,...)

  • 领先的'@'压制了这个命令。
  • 领先的' - '表示忽略非零退出状态
  • 两者都可以合并,重复也可以,所以@---@@@-@---echo foo@-echo foo相同

答案 1 :(得分:0)

这称为“宏修饰符”。这不是GNU make功能。看看this chapter of OPUS make tutorial。这些修饰符的一般语法:

$(name,modifier[,modifier]...) 

name is macro expanded, then each modifier is applied in succession to the elements of the expanded value. 

然后看看the list of modifiers,很明显它会添加.txt,形成一个文件名列表(截断 ANIMAL 中每个变量的路径)。所以,在你的情况下,它应该输出:

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

PS

我查看了上面提到的参考文献并且不认为第一行($ ANIMAL =)是正确的,因为宏定义应该在没有$的情况下开始。

答案 2 :(得分:0)

根据您的评论,您似乎实际上使用的是OpusMake,而不是GNU make。您可以在on the Opus Software, Inc. website以及this handy reference guide中找到有关它的更多信息。从这些来源中,您可以看到在扩展中使用宏修饰符示例。

一般来说,$(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附加到每个路径)