逐步地我们已经对kbuild有了一定的了解,知道了kbuild还会有自己定义的函数,以及这些函数会在一个类似c语言的头文件中定义。做了这么多准备,该是时候探索真正的代码编译了。先来看看一个.o文件是如何编译的。
比如我们拿这个文件来做例子:
make mm/memblock.o
找到我们的目标
有了刚才的经验,这次我们顺着之前的思路。先到根目录的Makefile中找找线索。有时候找代码除了经验,还得有点运气。不知道你这次有没有找到呢?
单个文件的目标还是在根目录Makefile文件中。
%.o: %.c prepare scripts FORCE
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
你看,这格式其实和我们平时自己写的规则是差不多的。.o的文件依赖于同名的.c文件,然后执行了一个命令来生成。不过呢,确实还多了些东西,包括一些特殊的依赖条件,以及这个命令长得也有点丑。
俗话说的好,恶人自有恶人磨,长得丑的代码也有丑办法来解读。
把上面这段代码添加一个井号
%.o: %.c prepare scripts FORCE
#$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
再运行一次
$ make mm/memblock.o
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
CHK include/generated/timeconst.h
CHK include/generated/bounds.h
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
# @make -f ./scripts/Makefile.build obj=mm mm/memblock.o
怎么样,通过显示实际执行的命令,是不是你感觉熟悉了些?从显示出的命令来看,生成mm/memblock.o这个目标文件是重新又调用了一次make,而这次使用的是script/Makefile.build这个规则文件,传入的参数是obj=mm,目标还是mm/memblock.o。
你看,