makefile 中的文件函数采用以“@”符号为前缀的参数

makefile 中的文件函数采用以“@”符号为前缀的参数

此代码摘自 GNU makefile 手册第 8.6 章。

@什么意思[电子邮件受保护]makefile 中的文件函数 arg 是什么意思?为什么像 rm 这样的 shell 命令以“@”符号为前缀

program: $(OBJECTS)
     $(file >[email protected],$^)
     $(CMD) $(CMDFLAGS) @[email protected]
     @rm [email protected]

文件函数语法为

$(file op filename[,text])

答案1

这里有三个不相关的用途@

在 中$@,该字符@是一个名称自动变量可以在规则中使用。该变量的值是规则正在构建的目标。

@在配方(命令行)行的最开头使用时,紧接在制表符之后,它会导致命令不打印当它即将被执行时。

其他地方的角色@并不特别。

因此,在您的示例中,要构建program

  1. file功能被调用。它将目标($^自动变量)的依赖项写入文件program.in
  2. 变量中存储的任何命令CMD都会被执行,参数存储在变量中CMDFLAGS,加上额外的参数@program.in。这做什么取决于CMD是什么。

  3. 该命令rm program.in被执行,而不先打印它。

一些命令将以 开头的参数视为@指示从中读取更多参数的文件。这是 DOS 约定,它的出现是因为 DOS 对命令行长度有严格的限制,并且无法将命令的输出插入到命令行中。这在 Unix 世界中并不常见,因为 Unix 没有这些限制。因此,该配方的效果可能与

$(CMD) $(CMDFLAGS) $(OBJECTS)

答案2

@ 字首在线抑制回声的线。

默认情况下,在执行之前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

请注意,仅@在行开头会导致抑制回声。或者只是普通的字符串,并且在其中将被扩展:>[email protected]@[email protected]$@

$ cat hello
hello:
    @echo @[email protected]
$make hello
@hello.in

相关内容