我想知道是否有人知道我的makefile中的独立@符号和'dir'命令在这里做什么(第二和第三行):
$(BUILD)/%.o: %.cpp
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $? -o $@
我理解$ @是什么但是@本身没有列在GNU手册(https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html)中,我所有的搜索都讨论了$ @。
此外,在第三行中,我了解到mkdir -p创建了嵌套目录,但我希望有人能够详细说明$(dir $ @),特别是“dir”部分。
感谢您的时间。
答案 0 :(得分:3)
如果@
启动配方行,则不会回显命令本身。
$(dir $@)
扩展到目标$@
的目录部分。在这种情况下,如果目标是$(BUILD)/rest/path/to/
,则为$(BUILD)/rest/path/to/target.o
。
来自GNU make manual, 5.2 Recipe Echoing:
5.2配方回应
通常'make'会在执行之前打印配方的每一行。 我们称之为“回声”,因为它给人的外观 自己打线。
当一行以'@'开头时,该行的回显是 抑制。在将行传递给之前丢弃'@' 贝壳。通常,您将此选项用于仅起作用的命令 是打印一些东西,比如'echo'命令来指示进度 通过makefile:
@echo About to make distribution files
和same, 8.3 Functions for File Names
8.3文件名的功能
几个内置的扩展功能特别涉及到 拆分文件名或文件名列表。
以下每个功能都执行特定的转换 在文件名上。函数的参数被视为一系列 文件名,由空格分隔。 (领先和尾随 忽略空格。)系列中的每个文件名都被转换 以相同的方式,结果与单个空格连接 他们之间。
'$(dir NAMES ......)' 在NAMES中提取每个文件名的目录部分。该 目录 - 文件名的一部分是通过的所有内容(和 包括)其中的最后一个斜线。如果文件名包含否 斜杠,目录部分是字符串'./'。例如,
$(dir src/foo.c hacks)
生成结果'src / ./'.<< p>
答案 1 :(得分:1)
这是一个消音器。当@
是命令的第一个字符时,执行上述命令而不事先在stdout中打印。
有关其他信息,请参阅Makefile documentation:
通常在执行之前打印配方的每一行。我们称之为回声,因为它给出了您自己键入行的外观。
当一行以'@'开头时,该行的回显被抑制。在将行传递给shell之前,将丢弃'@'。通常,您可以将此命令用于仅打印某些内容的命令,例如echo命令以指示通过makefile的进度:
@echo About to make distribution files
当make被赋予标志'-n'或'--just-print'时,它只回显大多数食谱而不执行它们。请参阅选项摘要。在这种情况下,甚至打印以“@”开头的配方行。这个标志对于找出哪些食谱认为是必要的而不实际执行它们非常有用。
要生成的'-s'或'--silent'标志会阻止所有回显,就好像所有食谱都以'@'开头一样。没有先决条件的特殊目标.SILENT的makefile中的规则具有相同的效果(请参阅特殊内置目标名称)。 .SILENT基本上是过时的,因为'@'更灵活。