如何在目标依赖于多个 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的主要内容,如果未能解决你的问题,请参考以下文章