如何在目标依赖于多个 linux 构建的地方布局 Makefile

Posted

技术标签:

【中文标题】如何在目标依赖于多个 linux 构建的地方布局 Makefile【英文标题】:How to layout Makefiles where target depends on multiple linux builds 【发布时间】:2012-08-31 13:46:06 【问题描述】:

我有一个基于 Make 的项目,其中顶层目标需要多个 vmlinux 二进制文件(linux 内核)作为先决条件,所以它看起来像:

all: bigfile
bigfile: bigfile.cfg a/vmlinux b/vmlinux c/vmlinux foo bar baz
    sometool -obigfile -ibigfile.cfg # other inputs referenced from within the config

每个 linux 规则看起来或多或少像:

a/vmlinux: a/.config
    $(MAKE) -C $(A_LINUX_SRC) O=$(PWD)/a vmlinux
a/.config
    mkdir -p a
    $(MAKE) -C $(A_LINUX_SRC) O=$(PWD)/a $(A_LINUX_DEFCONFIG)

同样适用于 b 和 c linux 内核。请注意,每个源代码树可能相同或不同,并且几乎可以肯定会有不同的 defconfigs。

这适用于干净的构建,但我不太喜欢递归调用。根据我如何调整上述几行,我似乎最终得到以下任何一种:

即使没有任何变化,不必要的递归也会导致 linux 树(这需要 7 秒才能执行任何操作) 如果我编辑 linux 源代码,除非我明确触摸 .config 或其他内容,否则不会重新生成内核。

理想情况下,我希望我的*** Makefile 能够了解每个 linux 内核的内部依赖关系图,并在所有情况下“做正确的事”。 (即 recursive-make-considered-harmful 论点)。

虽然我预计*** Linux Makefile 不会被其他人包含,尤其是多次使用不同的配置和 src 树! (我对 baz/makefile.inc bar/makefile.inc 有控制权,因此可以将它们编写为在顶层包含时播放得很好)

还是我运气不好,只需要记住触摸 .configs 以触发每个 linux 构建目录的体面?

谢谢, 戴夫

编辑: 进入 linux 树的 7 秒无用体面在我的机器上看起来像这样:

$ time make
make -C /home/davidm/md/tests/linux O=/home/davidm/md/tests/linux_a vmlinux 
make[1]: Entering directory `/home/davidm/linux-2.6.38'
  Using /home/davidm/linux-2.6.38 as source for kernel
  GEN     /home/davidm/md/tests/linux_a/Makefile
  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
make[3]: `include/generated/mach-types.h' is up to date.
  CALL    /home/davidm/md/linux-2.6.38/scripts/checksyscalls.sh
  CHK     include/generated/compile.h
make[1]: Leaving directory `/home/davidm/md/linux-2.6.38'

real    0m6.577s
user    0m2.930s
sys 0m1.360s

【问题讨论】:

你能告诉我们$(A_LINUX_SRC)/Makefile吗?我想其他两个是相似的。 (而且对 Make 的调用需要 7 秒才能执行任何操作,这有点可疑......) 它是标准的 linux makefile,来自上游 tarball。我已经更新了原始问题以显示这 6-7 秒在做什么.. 抱歉,我应该再考虑几秒钟。 【参考方案1】:

为了使其正常工作,您确实必须在每次构建时递归到内核源目录。 7 秒对于检查海量内核树中的任何文件是否已更改确实还不错...

在您的构建中包含内核 makefile 实际上并没有帮助,因为内核构建本身使用递归 make。

大概是这样的:

a/.config
        mkdir -p a
        $(MAKE) -C $(A_LINUX_SRC) O=$(PWD)/a $(A_LINUX_DEFCONFIG)

.PHONY: kernel-a-build
kernel-a-build: a/.config
        $(MAKE) -C $(A_LINUX_SRC) O=$(PWD)/a vmlinux

bigfile: kernel-a-build

由于kernel-a-build 是一个“假”目标(它不对应于物理文件),它将在每次构建时运行,从而允许内核 makefile 注意到源文件的更改。

【讨论】:

谢谢,这就是我在第一个要点中所暗示的。我想我希望有人有一个偷偷摸摸的把戏。当我可能有多达 7 个内核时,这 7 秒加起来,唯一的变化是在 'baz' 中,它会立即重新编译。看起来我只需要吃掉它。但话又说回来,'sometool' 无论如何都需要 40 秒来处理,所以无论如何这不是一个超级快速的迭代工作流程。我会接受这一点,因为它证实了我对 SOL 的怀疑,并且 .phony 的使用比我之前强迫体面的方式更好。谢谢!

以上是关于如何在目标依赖于多个 linux 构建的地方布局 Makefile的主要内容,如果未能解决你的问题,请参考以下文章

在LINUX中Makefile中的依赖文件放在啥地方? 生成的目标文件在啥地方?makefile 是啥类型的文件?

如何在ANT构建中的多个目标“依赖”属性中使用一个目标?

如何使自动布局约束依赖于多个其他锚点?

Django 如何构建依赖于站点的 URL?

makefile

Linux基础项目自动化构建工具——Makefile