(韦东山——嵌入式Linux 应用开发完全手册)
一、Linux Makefile 分析
(1)Makefile 的作用
a、决定编译哪些文件
b、怎样编译这些文件
c、怎样连接这些文件,最重要的是它们的顺序如何
Linux 内核中有很多个Makefile 文件,下面是 Makefile 文件的五大类:
a、决定编译哪些文件。
Linux 内核的编译过程从顶层 Makefile 开始,然后递归地进入各级子目录调用它们的Makefile,分为3个步骤。
1、顶层 Makefile 决定内核根目录下哪些子目录将被编进内核。
2、arch/$(ARCH)/Makefile 决定arch/$(ARCH) 目录下哪些文件、哪些目录将被编进内核。
3、各级子目录下的Makefile 决定所在目录下哪些文件将被编进内核,哪些文件将被编成模块(即驱动程序),进入哪些子目录继续调用它们的Makefile。
先看步骤1,在顶层Makefile 中可以看到:
由上可知,顶层Makefile 将这13 个子目录分为5类:init-y、drivers-y、net-y、libs-y和 core-y。还有一个arch 它在arch/$(ARCH)/Makefile 包含进内核。
对于非 x86 平台,还需要指定交叉编译工具。
对于步骤2的arch/$(ARCH)/Makefile ,以ARM体系为例,在arch/arm/Makefile 中可以看到如下内容:
第94行:除前面的5类,出现的另一类 head-y,不过它直接以问价名出现。MMUEXT 在arch/arm/Makefile 前面定义,对于没有MMU 的处理器,MMUEXT 的值为 -nommu,使用文件 head-nommu.S;对于有MMU 的处理器,MMUEXT 的值为空,使用文件 head.S。
在arch/arm/Makefile 中类似第171、172、173行的代码进一步扩展了 core-y 的内容,第191 行扩展了 libs-y 的内容,这些都是体系结构相关的目录。第173~175 行中的CONFIG_ARCH_S3C2410 在配置内核时定义,它的值有 3种:y、m或空。y 表示编进内核,m 表示编为模块, 空表示不使用。
编译内核时将依次进入 init-y、core-y、libs-y、drivers-y 和net-y 所列出的目录中执行它们的Makefile, 每个子目录都会生成一个 built-in.o (libs-y 所列目录下,有可能生成lib.a 文件)。最后,head-y 所表示的文件将和这些built-in.o
、lib.a 一起连接成内核映像文件vmlinux。
对于步骤3:
在配置内核时,生成配置文件 .config 。内核顶层Makefile 使用如下语句间接包含 .config文件,以后就根据 .config 中定义的各个变量决定编译哪些文件。所谓“间接”包含,是因为包含的是 include/config/auto.conf 文件,而它只是将 .config 文件中的注释去掉,并根据顶层Makefile 中定义的变量增加了一些变量而已。
在 include/config/auto.conf 文件中,变量的值主要有两类:“ y ” 和 “ m ” 。各级子目录的 Makefile 使用这些变量来决定哪些文件被编进内核中,哪些文件被编成模块,要进入哪些下一级子目录继续编译,这通过 以下4中方法来确定(obj-y、obj-m、lib-y 是Makefile 中的变量)。
obj-y 用来定义哪些文件被编进(built-in)内核
obj-m 用来定义哪些文件被编译成可加载模块(Loadable module)
lib-y 用来定义哪些文件被编译成库文件
obj-y、obj-m 还可以用来指定要进入的下一层子目录
(2)怎样编译这些文件
即编译选项、链接选项是什么。这些选项分为 3 类:全局的,适用于整个内核代码树;局部的,仅适用于某个 Makefile 中的所有文件;个体的,仅适用于某个文件。
(3)怎样连接这些文件,它们是顺序如何