一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令(如在all后加入:echo "hello",但要注意换行后要使用tab键;另外为了使在终端不显示命令,只显示hello,在Makefile中要写成@echo "hello")。使用Makefile整个工程完全自动编译,极大提高了效率。Makefile 有自己的书写格式、关键字、函数。
Linux 内核Makefile 分为 5部分,Kernel Makefile、ARCH Makefile、KBuild Makefile、.config文件以及scripts/Makefile.*
Kernel Makefile :Kernel Makefile 位于Linux 内核源代码的顶层目录,也叫 Top Makefile 。它主要用于指定编译Linux Kernel 目标文件(vmlinux )和模块(module )路径。它根据.config文件决定了内核根目录下哪些文件、子目录被编译进内核。对于内核或驱动开发人员来说,这个文件几乎不用任何修改。
ARCH Makefile:ARCH Makefile 位于ARCH/$(ARCH)/Makefile ,是系统对应平台的Makefile 。Kernel Top Makefile 会包含这个文件来指定平台相关信息。ARCH Makefile同样根据.config文件,决定了ARCH/$(ARCH) 目录下哪些文件、子目录被编译进内核只有平台开发人员会关心这个文件。
Kbuild Makefile:从Linux 内核2.6 开始,Linux 内核的编译采用Kbuild 系统 ,这同过去的编译系统有很大的不同,Kbuild 系统使用Kbuild Makefile 来编译内核或模块。当Kernel Makefile 被解析完成后,Kbuild 会读取相关的Kbuild Makefile 进行内核或模块的编译。Kbuild Makefile 有特定的语法指定哪些编译进内核中、哪些编译为模块、及对应的源文件是什么等。内核及驱动开发人员需要编写这个Kbuild Makefile 文件。
scripts/Makefile.* 通用规则:
Makefile.build :被顶层Makefile所调用,与各级子目录的Makefile合起来构成一个完整的Makefile文件,定义built-in.o、.lib以及目标文件.o的生成规则。这个Makefile文件生成了子目录的.lib、built-in.o以及目标文件.o
Makefile.clean :被顶层Makefile所调用,用来删除目标文件等
Makefile.lib :被Makefile.build所调用,主要是对一些变量的处理,比如说在obj-y前边加上obj目录
1)obj-y用来定义哪些文件被编进(built-in)内核:obj-y中定义的.o文件由当前目录下的.c或.S文件编译生成。
2)obj-m用来定义哪些文件被编译成可加载模块(Loadable module):obj-m中定义的.o文件由当前目录下的.c或.S文件编译生成。
3)lib-y用来定义哪些文件被编成库文件:lib-y中定义的.o文件由当前目录下的.c或.S文件编译生成,它们被打包成当前目录下的一个库文件:lib.a 。
4)obj-y、obj-m还可以指定要进入的下一层子目录:obj-$(CONFIG_JFFS2_FS) += jffs2/