Makefile:为什么总是使用 `$(MAKE)` 而不是 `make`?

Tre*_*ith 1 makefile gnu-make parallel-builds

我通常使用高级构建系统cmake来构建我的 C/C++ 代码。但出于各种原因,我使用的是直接的 GNU make

我正在做递归构建,其中每个目录都有一个 makefile。

我最近不得不将我所有的 makefile 从 using 更改make$(MAKE),然后并行构建开始工作。

我读过的文献都说“总是使用$(MAKE)”(O'Reilly 的书,stackoverflow.com 上超过 10-40K 点的人提供了 5 个以上的解决方案)。

在你的 makefile 中,为什么总是使用$(MAKE)而不是make

(显然一个原因是因为$(MAKE)以某种方式启用了并行构建。)

除了简单的替换$(MAKE)with之外,还有更多的事情发生make吗?

Mad*_*ist 5

马修的回答是正确的,但并不完整。

最好的办法是阅读与使用变量相关的GNU make 手册部分MAKE

除了使用正确的make可执行文件(这已经足够了),GNU make 还尝试了解哪些配方调用了 make 的递归实例。任何这样做的食谱都会以几种方式进行特殊处理:

首先,即使您运行、 或make -n,也会调用该配方。make -qmake -t

其次,为了与其子组件通信(例如,为了让作业服务器正常工作)make维护一组打开的文件描述符(用于管道)。对于“正常”(非递归)配方,make 将在生成配方之前关闭这些文件描述符(以便 (a) 配方不会意外弄乱该通信,以及 (b) 因为某些程序/脚本被编写为期望特定的文件描述符未使用)。对于确定为递归调用的配方,make不会关闭这些文件描述符。

GNU make 使用两种不同的方法来检测配方是否是递归 make。其中之一是您可以将+特殊字符添加到配方的开头。第二个是配方中存在$(MAKE)(或${MAKE})变量引用。