KBuild MakeFile介绍
##Kbuild Makefile
从Linux内核2.6开始,
Linux内核的编译采用Kbui ld系统
,这同过去的编译系统有很大的不同, 尤其对于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的编译选项
Linux内核Makefile分类
· Kernel Makefile
Kernel Makefile位于Linux内核源代码的顶层目录,也叫 Top Makefile。它主要用于指定编译Linux Kernel目标文件(vmlinux)和模块(module)
· Kbuild Makefile
Kbuild系统使用Kbuild Makefile来编译内核或模块。当Kernel Makefile被解析完成后,
· ARCH Makefile
ARCH Makefile位于ARCH/$(ARCH)/
Kbuild Makefile
Kbuild Makefile的文件名不一定是 Makefile ,
· 目标定义
Kbuild Makefile的一个最主要功能就是指定编译什么,
· obj-?
obj-?指定编译什么,怎么编译?其中的“?”可能是“y”
obj-? = $(target).o
target为编译对象的名字。如果没有指定xxx-objs,
· xxx-objs
xxx-objs指定了编译对象需要的文件,
只要包含了这两行,Kbuild Makefile就应该可以工作了。
· 嵌套编译
有时一个对象可能嵌入到另一个对象的目录下,
obj-? = $(sub_target)/
其中“?”可以是“y”或“m”,$(sub_target)
· 编译器选项
尽管在大多数情况下不需要指定编译器选项,
· ccflags-y, asflags-y and ldflags-y
这些编译选项用于指定cc、as和ld的编译选项
编译外部模块
有时候我们需要在内核源代码数的外面编译内核模块, 编译的基本命令是:
make -C $(KERNEL_DIR) M=`pwd` modules
我们可以把这个命令集成到Makefile里, 这样我们就可以只输入“make”命令就可以了。 回想上一章的那个Makefile,它把Normal Makefile 和Kbuild Makefile集成到一个文件中了。 为了区别Kbuild Makefile 和Normal Makefile,这样我们改写Makefile为如下形式, 并且添加Kbuild Makefile - “Kbuild”。
有时候我们需要在内核源代码数的外面编译内核模块,
make -C $(KERNEL_DIR) M=`pwd` modules
我们可以把这个命令集成到Makefile里,
|
|