如何布局目标依赖于多个linux版本的Makefiles
我有一个基于Make的项目,其中顶级目标需要多个vmlinux二进制文件(linux内核)作为先决条件,因此它看起来像:如何布局目标依赖于多个linux版本的Makefiles,makefile,linux-kernel,makefile-project,multiple-makefiles,Makefile,Linux Kernel,Makefile Project,Multiple Makefiles,我有一个基于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/vmlin
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
这适用于干净的构建,但我不太喜欢递归调用。根据我对上述几行的调整方式,我似乎最终得到以下任一行:
- 即使没有任何变化(什么也不做需要7秒),也会在linux树中进行不必要的递归
- 如果我编辑linux源代码,内核不会被重新生成,除非我显式地触摸.config或其他东西
$ 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
为了使其正常工作,您确实必须在每个构建中递归到内核源目录。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注意到源文件的更改。您能给我们看一下$(a_LINUX_SRC)/makefile
吗?我想其他两个是相似的。(而且一个需要7秒钟才能完成的调用有点可疑…)它是标准的linux makefile,来自上游tarball。我已经更新了原来的问题,以显示这6-7秒在做什么。对不起,我应该再考虑几秒钟。谢谢,这是我第一个要点所指的。我想我希望有人耍了一个诡计。这7秒加起来,我可能有多达7个内核,唯一的变化是“baz”立即重新编译。看来我得吃了。但是“sometool”需要40秒来处理,所以这不是一个超级快速的迭代工作流。我会接受这一点,因为它证实了我对自己是索尔的怀疑。虚假的使用比我以前强迫别人得体的方式要好。谢谢