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或$(tar
get).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的编译选项