2017-08-16 75 views
0

我想知道有没有人知道我的makefile的独立的@符号和“dir”命令在这里所做的(第二&第三行):makefile文件独立@符号和dir关键字

$(BUILD)/%.o: %.cpp 
    @mkdir -p $(dir [email protected]) 
    $(CC) $(CFLAGS) -c $? -o [email protected] 

我明白然而@ $本身没有列在GNU手册(https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html)中,我所有的搜索都是关于$ @的。

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

谢谢您的时间。

+0

您应该删除C++,symbols和symbol标签,因为这个问题完全是以GNU make为中心的。 – Krom

+0

可能的重复[做什么@, - 和+作为前缀到Make中的配方行?](https://stackoverflow.com/questions/3477292/what-do-and-do-as-prefixes-to-recipe -line-in-make) –

+0

如果不是带有'dir'关键字的部分,那么我会重复那个重复的标志。 – Krom

回答

3

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

$(dir [email protected])展开到目标部分[email protected]。在这种情况下,如果目标是$(BUILD)/rest/path/to/target.o,则为$(BUILD)/rest/path/to/

GNU make manual, 5.2 Recipe Echoing

5.2配方呼应

通常 '制作' 在执行之前打印的配方的每一行。 我们称之为“呼应”,因为它给人的感觉是你自己在打字线上是 。

当一行以'@'开头时,该行的回显为 被抑制。在将行传递到 shell之前,将丢弃'@'。通常,你会使用这对于其唯一的作用 是打印的东西,如“回声”命令,通过makefile文件来显示进度 命令:

@echo About to make distribution files 

,并从same, 8.3 Functions for File Names

8.3文件名称的功能

几个内置的扩展功能与 专门相关,它们将文件名或fil列表e名称。

以下每个函数都会对文件名执行特定转换 。该函数的参数被认为是由空格分隔的文件名的系列 。 (忽略空白的前导和尾随 )。以同样的方式将系列中的每个文件名转换为 ,结果与它们之间的单个空格 连接。

'$(dir NAMES ...)' 在NAMES中提取每个文件名的目录部分。目录部分的文件名是 ,其中包含最后一个斜杠(包括 )。如果文件名不包含 斜杠,则目录部分是字符串'./'。例如,

 $(dir src/foo.c hacks) 

产生结果'src/./'。

1

这是一个消音器。当@是命令的第一个字符时,所述命令被执行而没有事先打印在标准输出中。

,了解更多信息,请参见Makefile documentation

在执行之前通常进行打印配方的每一行。我们称之为回声,因为它给人的感觉是你自己正在输入线条。

当一行以'@'开始时,该行的回显被抑制。在将行传递给shell之前,将丢弃'@'。通常,你会使用这对于其唯一的作用就是打印的东西,如echo命令指示在生成文件进度的命令:

@echo About to make distribution files 

当make给出标志“-n”或“--just它只会回应大多数食谱,而不会执行它们。请参阅选项摘要。在这种情况下,即使以“@”开头的配方行也会打印出来。这个标志对于找出哪些食谱使其认为有必要而不需要真正做到这一点很有用。

'-s'或'--silent'标志可防止所有回显,就像所有食谱以'@'开头一样。特殊目标.SILENT的makefile中没有先决条件的规则具有相同的效果(请参阅特殊内置目标名称)。 .SILENT实质上已经过时,因为'@'更加灵活。