我记录过,假设所有必需的软件包都已通过sudo apt-get install
.我的 BuildRoot 根目录是openwrt
.
随后,我发现如果我重命名文件夹上方的目录openwrt
,并对文件进行细微更改,例如wifi.lua
下一个制作(在openwrt
文件夹中)需要 21 分钟才能成功编译。
但是,如果我不重命名文件夹上方的目录openwrt
,并在同一文件中进行类似的微小更改,则下一个使V=99仅需3分钟即可编译成功。
当我现在重命名上面的目录并再次执行与上面相同的操作时,制作需要21分钟才能编译成功。和使V=99,我可以看到,与我没有重命名顶级目录的情况相比,采取了更多的编译步骤。
我可以看到,如果我不重命名顶层目录,Makefile 编译速度会快得多。
这让我想到了相关的问题:在Linux中,重命名或移动目录会改变子目录中文件的时间吗?
我知道如果目标的修改时间比其所有依赖项更新,则 Makefile 不会再次构建目标。
我还阅读了有关 GNU Makefile 的一些问题: http://www.conifersystems.com/whitepapers/gnu-make/
OpenWrt Makefile 应该比原始的 Linux Makefile 先进得多,它是否解决了部分或全部这些问题?
(为了让 Makefile 编译得更快,我还使用了openwrt/dl
指向主目录中文件夹的符号链接,这样就不需要再次下载用户空间包 tarball。)
答案1
不,它不会更改所包含文件和目录的时间戳,仅更改目录本身的时间戳。但是,如果 Makefile 包含使用绝对路径的目标或依赖项,甚至只是$(src_dir)
重新创建它们,那么它是一个不同的/新的目标。看GNU make 文档有关“标准”目标和变量的约定和建议。
然而,Makefile 无法编译,并且不存在原始 Linux Makefile。创建/维护像 BuildRoot 这样的环境非常复杂,维护人员可能会首先关注如何正确构建它,然后才能有效地构建。如果一个简单的补丁(例如添加符号链接)有助于加快该过程,也许您应该将其作为改进建议发送给上游。
答案2
您可以使用 man make 中的 jobs 选项运行 make:
-j [jobs], --jobs[=jobs]
指定同时运行的作业(命令)数量。如果有多个 -j 选项,则最后一个有效。如果给出的 -j 选项不带参数,make 将不会限制可以同时运行的作业数量。
答案3
执行以下操作: 具有 24 个线程的真正大机器。 128GB 内存。构建一切/dev/shm
。使用make -j22
它就会燃烧。请务必保存您的配置,因为关闭机器后所有内容都会消失。