gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:07:48 28 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

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

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

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

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

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

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

关于Makefile:为什么总是使用 `$(MAKE)` 而不是 `make` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50510278/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com