曲径通幽论坛

标题: KBuild MakeFile [打印本页]

作者: 张无忌    时间: 2011-5-15 21:08
标题: KBuild MakeFile
从Linux内核2.6开始,Linux内核的编译采用 Kbuild 系统,这同过去的编译系统有很大的不同,尤其对于 Linux 内核模块的编译。在新的系统下,Linux 编译系统会两次扫描 Linux 的 Makefile :首先编译系统会读取 Linux 内核顶层的 Makefile,然后根据读到的内容第二次读取 Kbuild 的 Makefile 来编译Linux内核。

Linux内核Makefile分类

Kernel Makefile
Kernel Makefile位于Linux内核源代码的顶层目录,也叫 Top Makefile。它主要用于指定编译 Linux Kernel 目标文件(vmlinux)和模块(module)。这编译内核或模块是,这个文件会被首先读取,并根据读到的内容配置编译环境变量。对于内核或驱动开发人员来说,这个文件几乎不用任何修改。

Kbuild Makefile
Kbuild 系统使用 Kbuild Makefile 来编译内核或模块。当 Kernel Makefile 被解析完成后,Kbuild 会读取相关的 Kbuild Makefile 进行内核或模块的编译。Kbuild Makefile 有特定的语法指定哪些编译进内核中、哪些编译为模块、及对应的源文件是什么等。内核及驱动开发人员需要编写这个Kbuild Makefile 文件。

ARCH Makefile
ARCH Makefile位于ARCH/$(ARCH)/Makefile,是系统对应平台的Makefile。Kernel Top Makefile会包含这个文件来指定平台相关信息。只有平台开发人员会关心这个文件。


Kbuild Makefile
Kbuild Makefile 的文件名不一定是 Makefile,尽管推荐使用 Makefile 这个名字。大多的 Kbuild文件 的名字都是 Makefile。为了与其他Makefile文件相区别,你也可以指定Kbuild Makefile的名字为 Kbuild。而且如果 “Makefile” 和 “Kbuild” 文件同时存在,则 Kbuild 系统会使用 “Kbuild” 文件。

目标定义
Kbuild Makefile的一个最主要功能就是指定编译什么,这个功能是通过下面两个对象指定的 obj-? 和 xxx-objs :
obj-?

obj-? 指定编译什么,怎么编译?其中的 “?” 可能是 “y” 或 “m”,“y”指定把对象编译进内核中,“m”指定把对象编译为模块。语法如下;
obj-? = $(target).o
target为编译对象的名字。如果没有指定xxx-objs,这编译这个对象需要的源文件就是$(target).c或$(target).s。如果指定了$(target)-objs,则编译这个对象需要的源文件由$(target)-objs指定,并且不能有$(target).c或$(target).s文件。

xxx-objs

xxx-objs指定了编译对象需要的文件,一般只有在源文件是多个时才需要它。

只要包含了这两行,Kbuild Makefile就应该可以工作了。

嵌套编译
有时一个对象可能嵌入到另一个对象的目录下,那个如何编译子目录下的对象呢?其实很简单,只要指定 obj-? 的对象为子目录的名字就可以了:
obj-? = $(sub_target)/
其中 “?” 可以是 “y” 或 “m”,$(sub_target) 是子目录名字。

编译器选项
尽管在大多数情况下不需要指定编译器选项,有时我们还是需要指定一些编译选项的:
ccflags-y, asflags-y and ldflags-y
这些编译选项用于指定cc、as和ld的编译选项。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2