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
(即,将.txt附加到值中每个空格分隔的单词)abc/def.txt ghi/jkl.txt
将具有值BOO
(即,首先只获取每个路径的文件名部分,然后将.txt附加到每个路径)def.txt jkl.txt