Linux内核Makefile浅析

来源:互联网 发布:诛仙多玩数据库 编辑:程序博客网 时间:2024/05/26 08:43

Makefile:顶层Makefile,整个内核配置、编译的总体控制文件。

.config:内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果(如 make config)。

arch/*/Makefile:位于各种CPU体系目录下的Makefile,如arch/arm/Makefile,是针对特定平台的Makefile。

各个子目录下的Makefile:比如drivers/Makefile,负责所在子目录下源代码的管理。

Rules.make:规则文件,被所有的Makefile使用。

用户通过make config配置后,产生了.config。顶层Makefile读入.config中的配置选择。顶层Makefile有两个主要的任务:产生vmlinux文件和内核模块(module)。为了达到此目的,顶层Makefile递归的进入到内核的各个子目录,分别调用位于这些子目录中的Makefile。至于到底进入到哪些子目录,取决于内核的配置。

在顶层Makefile中,有一句:include arch/$(ARCH)/Makefile,包含了特定CPU体系结构下的Makefile,这个Makefile中包含了平台相关的信息。

位于各个子目录下的Makefile同样也根据.config给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有include $(TOPDIR)/Rules.make。

 Rules.make 文件起着非常重要的作用,它定义了所有 Makefile 共用的编译规则。比如,如果需要将本目录下所有的 c 程序编译成汇编代码,需要在 Makefile 中有以下的编译规则:

%.s: %.c
$(CC) $(CFLAGS) -S $
有很多子目录下都有同样的要求,就需要在各自的 Makefile 中包含此编译规则,这会比较麻烦。而 Linux内核中则把此类的编译规则统一放置到 Rules.make 中,并在各自的 Makefile 中包含进了 Rules.make(include Rules.make),这样就避免了在多个 Makefile 中重复同样的规则。对于上面的例子,在 Rules.make 中对应的规则为:
%.s: %.c
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F)) $(CFLAGS_$@) -S $

 

原创粉丝点击