请考虑以下代码:
$ANIMAL = COW PIG CHICKEN VAMPIRE
all:
@echo $(ANIMAL, F, >.txt)
我努力在GNU make手册中找到一个提到上述语法的部分,但我找不到任何与之相关的内容。它的打印内容以及该功能的语法结构如何?
补充:当一行以“@ - ”开头时是什么意思?
@-- $(GEN_ENV); ...
答案 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附加到每个路径)