【问题标题】:GNU Make: support some targets not parallel without add dependsGNU Make:支持一些不并行的目标而不添加依赖
【发布时间】: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 目标构建用户空间应用程序和内核模块。

我想支持并行构建。但并行的策略和原因是:

  1. 主机/内核/应用程序不能并行

    仅在构建host 之后构建kernel,仅在构建kernel 之后构建app。 但我不希望kernel 依赖于hostapp 依赖于kernel。 因为当我单独构建app 时,我不希望构建kernel

  2. 某些应用不能并行

    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,确切地说:如果只是你不希望kernelhost 发生变化时重建,那么可以通过各种方式完成.
  • 主要问题取决于内核,即使内核没有改变,重建也需要很长时间,所以当我单独构建一个小应用程序时会花费很长时间。所以不要依赖内核,而是在内核更改时手动构建内核。 @MadScientist

标签: makefile


【解决方案1】:

根据您的评论,您真正想要的是在 kernel 目标重建时重建 app 目标,但您不想在您要求重建时自动重建 kernel 目标app目标。

我不确定这与并行构建有什么关系......??

要做到这一点,只是不要让app 目标完全依赖于kernel 目标。如果您想在更新kernel 时重建app,则让app 依赖于在重建kernel 时更新的某个文件,但没有描述如何构建该文件的make 目标... make 会认为它与任何其他源文件一样。

类似这样的:

app: .build_target
        ...build app...

kernel:
        ....build kernel...
        touch .build_target

或者,如果kernel 目标构建了一些其他文件,您可以让app 依赖于它,而您不需要touch。现在,当您构建 app 时,它只会在 .build_target 较新时重新构建,但它不会尝试构建 kernel(因为 make 不知道如何构建 .build_target),除非您特别说 @987654339 @。

预计到达时间

如果您希望make kernel app 构建两者,您可以这样做:

app: $(filter kernel,$(MAKECMDGOALS))

这样,如果kernel 显示为命令行目标,那么app 将依赖它,如果不是,则不会。

【讨论】:

  • 内核和应用程序是独立的,虽然应用程序依赖于内核,但构建一个不构建另一个,但是如果构建make kernel app -j8,内核应该在应用程序之前构建。 .NOTPARALLEL 满足要求,但它也会在应用构建中禁用并行。
猜你喜欢
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多