如何布局目标依赖于多个linux版本的Makefiles

如何布局目标依赖于多个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

我有一个基于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

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

  • 即使没有任何变化(什么也不做需要7秒),也会在linux树中进行不必要的递归
  • 如果我编辑linux源代码,内核不会被重新生成,除非我显式地触摸.config或其他东西
理想情况下,我希望我的顶级Makefile能够了解每个linux内核的内部依赖关系图,并在所有情况下“做正确的事情”。(即递归的make被认为是有害的参数)

尽管我希望顶级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

为了使其正常工作,您确实必须在每个构建中递归到内核源目录。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秒来处理,所以这不是一个超级快速的迭代工作流。我会接受这一点,因为它证实了我对自己是索尔的怀疑。虚假的使用比我以前强迫别人得体的方式要好。谢谢