我通常使用像cmake
这样的高级构建系统来构建我的C / C ++代码。但是对于各种原因我使用的是直接GNU make
。
我正在进行递归构建,其中每个目录都有一个makefile。
我最近不得不将所有makefile从使用make
更改为$(MAKE)
,然后并行构建开始工作。
我读过的所有文献都说'#34;总是使用$(MAKE)
" (O' Reilly预订,stackoverflow.com上的5+解决方案来自10-40K以上的人)。
在您的文件中,为什么总是使用$(MAKE)
代替make
?
(显然有一个原因是因为$(MAKE)
以某种方式启用了并行构建。)
是否还有$(MAKE)
与make
进行简单替换?
答案 0 :(得分:2)
Matthieu的回答是正确的,但并不完整。
最好的办法是阅读与使用MAKE
变量相关的GNU make manual section。
除了使用正确的make
可执行文件(这是足够的理由)之外,GNU还尝试了解哪些配方调用make的递归实例。任何这样做的食谱都会通过以下几种方式进行特殊处理:
首先,即使您运行make -n
,make -q
或make -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"作为顶级。