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

时间:2018-05-24 13:10:13

标签: makefile gnu-make parallel-builds

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

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

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

我读过的所有文献都说'#34;总是使用$(MAKE)" (O' Reilly预订,stackoverflow.com上的5+解决方案来自10-40K以上的人)。

在您的文件中,为什么总是使用$(MAKE)代替make

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

是否还有$(MAKE)make进行简单替换?

2 个答案:

答案 0 :(得分:2)

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

最好的办法是阅读与使用MAKE变量相关的GNU make manual section

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

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

其次,为了与其子品牌进行通信(例如,为了使作业服务器正常工作),make维护一组打开的文件描述符(用于管道)。对于“正常”(非递归)配方make会在产生配方之前关闭这些文件描述符(这样(a)配方不会意外地搞砸了那个通信,并且(b)因为某些程序/脚本被编写为期望特定的文件描述符未使用)。对于确定为递归调用的配方,make将不会关闭这些文件描述符。

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

答案 1 :(得分:1)

在某些系统上,可执行调用make不会被称为[Arguments] ${url} ${apikey} ${authtoken} ${elasticsearch} 。例如,非GNU系统通常具有不是GNU Make的make命令,如果用户想要使用为GNU Make设计的Makefile,则必须运行make。如果在这些系统上以gmake进行递归调用,则递归调用将不会调用与用户键入的顶级调用相同的可执行文件。使用make确保递归调用将使用相同的" make"作为顶级。