该代码节选自GNU makefile手册的8.6章。
Makefile中文件功能arg的@ $ @。in是什么意思?以及为什么像rm这样的shell命令以“ @”符号开头
program: $(OBJECTS)
$(file >$@.in,$^)
$(CMD) $(CMDFLAGS) @$@.in
@rm $@.in
文件功能语法为
$(file op filename[,text])
该代码节选自GNU makefile手册的8.6章。
Makefile中文件功能arg的@ $ @。in是什么意思?以及为什么像rm这样的shell命令以“ @”符号开头
program: $(OBJECTS)
$(file >$@.in,$^)
$(CMD) $(CMDFLAGS) @$@.in
@rm $@.in
文件功能语法为
$(file op filename[,text])
Answers:
这里有三种不相关的用途@
。
在中$@
,字符@
是可以在规则中使用的自动变量的名称。该变量的值是规则正在构建的目标。
在@
配方(命令)行的最开始使用时,在制表符之后,使用时,将导致命令执行时不打印命令。
@
其他地方的字符并不特殊。
因此,在您的示例中,构建program
:
file
函数被调用。它将目标($^
自动变量)的依赖项写入文件program.in
。执行存储在变量中的任何命令,并使用存储在变量CMD
中的参数CMDFLAGS
加上Extra参数@program.in
。这做什么取决于什么CMD
。
rm program.in
执行该命令,而不先打印它。
一些命令将以开头的参数@
视为指示要从中读取更多参数的文件。这是DOS约定的产生,因为DOS对命令行长度有严格的限制,并且无法将命令的输出内插到命令行中。由于Unix没有这些限制,因此在Unix世界中并不常见。因此,该配方的效果可能与
$(CMD) $(CMDFLAGS) $(OBJECTS)
行中的@前缀抑制行的回显。
默认情况下,在执行之前make
打印每一行Makefile
。当行以开头时@
,这些行将不会被打印。
没有@
:
$ cat > Makefile
hello:
echo hello world
$ make hello
echo hello world
hello world
与@
:
$ cat > Makefile
hello:
@echo hello world
$ make hello
hello world
请注意,仅@
在行的开头会抑制回声。>$@.in
或@$@.in
只是普通的字符串,$@
将在其中进行扩展:
$ cat hello
hello:
@echo @$@.in
$make hello
@hello.in
>$@.in
作为文件模式...但它是在以自己的方式..谢谢cuonglm ...有用