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

时间:2012-08-31 13:46:06

标签: 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/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。根据我如何调整以上几行,我似乎最终得到以下任何一个:

  • 不必要的递归进入linux树,即使没有任何变化(这需要7秒钟什么都不做)
  • 如果我编辑linux源代码,除非我明确触摸.config或其他内容,否则不会重新生成内核。

理想情况下,我希望我的顶级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

1 个答案:

答案 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注意到对源文件的更改。