makefile 独立@符号和dir关键字

ham*_*amr 2 symbols gnu makefile

我想知道是否有人知道我的 makefile 中的独立 @ 符号和 'dir' 命令在这里的作用(第二行和第三行):

$(BUILD)/%.o: %.cpp
    @mkdir -p $(dir $@) 
    $(CC) $(CFLAGS) -c $? -o $@
Run Code Online (Sandbox Code Playgroud)

我明白 $@ 是什么,但是 @ 本身并没有在 GNU 手册(https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html)中列出,并且我所有的搜索都讨论了 $ @。

此外,在第三行中,我知道 mkdir -p 创建嵌套目录,但我希望有人可以详细说明 $(dir $@) 特别是“dir”部分。

感谢您的时间。

typ*_*ris 5

如果@启动配方行,则不会回显命令本身。

$(dir $@)扩展到目标的目录部分$@。在这种情况下,$(BUILD)/rest/path/to/如果目标是$(BUILD)/rest/path/to/target.o

来自GNU make 手册,5.2 配方回显

5.2 配方回显

通常,“make”会在执行之前打印配方的每一行。我们称其为“回显”,因为它给人的感觉就像是您自己键入的行。

当一行以“@”开头时,该行的回显将被抑制。在该行传递到 shell 之前,“@”将被丢弃。通常,您会将其用于唯一效果是打印某些内容的命令,例如用于指示 makefile 进度的“echo”命令:

 @echo About to make distribution files
Run Code Online (Sandbox Code Playgroud)

以及相同的 8.3 文件名函数

8.3 文件名函数

几个内置扩展函数专门与分解文件名或文件名列表相关。

以下每个函数对文件名执行特定的转换。该函数的参数被视为一系列由空格分隔的文件名。(忽略前导和尾随空格。)系列中的每个文件名都以相同的方式进行转换,并且结果之间用单个空格连接。

'$(dir NAMES...)' 提取 NAMES 中每个文件名的目录部分。文件名的目录部分是直到(并包括)最后一个斜杠的所有内容。如果文件名不包含斜杠,则目录部分是字符串“./”。例如,

      $(dir src/foo.c hacks)
Run Code Online (Sandbox Code Playgroud)

产生结果“src/./”。