2

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

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

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

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

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

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

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

4

2 回答 2

6

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

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

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

首先,即使您运行make -nmake -q或,也会调用该配方make -t

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

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

于 2018-05-24T14:38:48.623 回答
1

在某些系统上,调用 make 的可执行文件不会被调用make。例如,非 GNU 系统通常有一个make不是 GNU Make 的命令,gmake如果用户想要使用为 GNU Make 设计的 Makefile,则必须运行。如果您make在这些系统上进行递归调用,则递归调用将不会调用与用户键入的顶级可执行文件相同的可执行文件。使用$(MAKE)确保递归调用将使用与顶层相同的“make”。

于 2018-05-24T13:12:48.673 回答