【发布时间】:2021-03-09 21:43:35
【问题描述】:
Makefile 是这样的。
all: host kernel app;
host: host/kconfig;
kernel: kernel/compile kernel/install;
app: app/busybox app/switch app/wifi;
app/busybox: app/busybox/compile app/busybox/install;
app/switch: app/switch/compile app/switch/install;
app/wifi: app/wifi/compile app/wifi/install;
app/busybox/compile:
make -C busybox
host 目标构建主机工具。 kernel 目标构建内核。 app 目标构建用户空间应用程序和内核模块。
我想支持并行构建。但并行的策略和原因是:
-
主机/内核/应用程序不能并行
仅在构建
host之后构建kernel,仅在构建kernel之后构建app。 但我不希望kernel依赖于host,app依赖于kernel。 因为当我单独构建app时,我不希望构建kernel。 -
某些应用不能并行
switch和wifi是内核模块,所以app/switch/compile和app/wifi/compile不能并行。
现在我将.NOTPARALLEL 添加到 Makefile,所以只有规则中的子 Makefile 是并行的,但某些目标实际上可以是并行的,例如app/busybox app/boa。
如何编写 Makefile 来支持这种灵活的并行构建。
【问题讨论】:
-
@MadScientist 嗨
-
这个向 GNU Make 开发者提出的功能没有被采纳,可以解决我的问题,gnu-make.2324884.n4.nabble.com/About-NOTPARALLEL-td11898.html
-
避免并行的方法都是众所周知的;没有什么神奇的。您必须 (a) 使用 make 的先决条件(考虑仅订购的先决条件是否有助于解决某些问题),或 (b) 使用非并行子 make,或 (c) 在顶级 makefile 中禁用并行性并使用并行子制作。你没有说为什么你不希望
kernel依赖于host,确切地说:如果只是你不希望kernel在host发生变化时重建,那么可以通过各种方式完成. -
主要问题取决于内核,即使内核没有改变,重建也需要很长时间,所以当我单独构建一个小应用程序时会花费很长时间。所以不要依赖内核,而是在内核更改时手动构建内核。 @MadScientist
标签: makefile