我有一个基于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内核。注意每个可能具有相同或不同的源树,并且几乎肯定会有不同的defconfig。
这适用于干净的构建但我不太喜欢递归调用make。根据我如何调整以上几行,我似乎最终得到以下任何一个:
理想情况下,我希望我的顶级Makefile能够了解每个Linux内核的内部依赖图,并在所有情况下“做正确的事情”。 (即递归 - 考虑 - 有害的论点)。
虽然我希望顶级Linux Makefile不会被其他人包括在内,特别是多次使用不同的配置和src树! (我可以控制baz / makefile.inc bar / makefile.inc,所以当它们被顶层包含时,它们可以编写得很好)
或者我运气不好,只需要记得触摸.configs来触发每个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
答案 0 :(得分:2)
为了使其正常工作,您确实必须在每次构建时进入内核源目录。对于检查大规模内核树中的任何文件是否发生了变化,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注意到对源文件的更改。