这个 makefile 规则中的大括号是做什么用的?

What are the braces in this makefile rule for?

我正在读取 Qt 创建的项目的 makefile,它具有以下内容:

{backend}.cpp{release\}.obj::
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -Forelease\ @<<
    $<  
<<

(上面的代码使用 \t 作为配方,如 makefile 中所写)

规则和食谱都让我感到困惑。

我将从规则中的 {backend} 开始。显然 {release} 也有同样的困惑。我假设这是对名为 backend 的特定子目录的引用。我猜 ..\backend\release\bar.obj 会被发现为合法目标?但是 make 的哪一部分说这是合法的语法,这里到底发生了什么?

FWIW:这是在注释为:##### implicit rules 的部分中。 版本:GNU Make 4.2.1 Built for x86_64-unknown-cygwin

奖励积分:

解释 @<<<< 在食谱中的用法...(是的,我缺乏 bash shell 技巧...)。这是用 $< 引用第一个先决条件并静默重定向它吗?为什么不是 $$<

谢谢。

这是一个 NMAKE 批处理模式规则

https://docs.microsoft.com/en-us/cpp/build/batch-mode-rules?view=vs-2017

等效的 GNU Make 规则类似于

backend/%.obj: release/%.cpp:

不同之处在于,顾名思义,这些规则将只为所有有效目标调用一次它们的配方,并期望规则使用 $< 宏一次性创建所有目标。

<< 语法是 NMAKE 的内联文件功能

https://docs.microsoft.com/en-us/cpp/build/inline-files-in-a-makefile?view=vs-2017

这会展开并捕获尖括号之间的所有内容,并将其保存到一个文件中,在本例中是一个临时文件,因为括号后没有指定文件名。然后该文件通过 @ 选项作为配方第一行的响应文件传递给编译器。