欢迎来到天天文库
浏览记录
ID:6127585
大小:37.52 KB
页数:12页
时间:2018-01-04
《linux 2.6内核makefile浅析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、1 概述Makefile由五个部分组成:·Makefile:根目录Makefile,它读取.config文件,并负责创建vmlinux(内核镜像)和modules(模块文件)。·.config:内核配置文件(一般由makemenuconfig生成)。·arch/$(ARCH)/Makefile:目标处理器的Makefile。·scripts/Makefile.*:所有kbuildMakefile的规则,它们包含了定义/规则等。·kbuildMakefiles:每个子目录都有kbuildMakefile,它们负责生成built-in或模块化目标。(注意:kbuildMak
2、efile是指使用kbuild结构的Makefile,内核中的大多数Makefile都是kbuildMakefile。)2kbuild文件2.1obj-y和obj-m 最简单的kbuildMakefile可以仅包含:obj-$(CONFIG_FOO)+=foo.o 其中$(CONFIG_FOO)可以等于y或m,它的值由.config文件给出。如果$(CONFIG_FOO)既不是y也不是m,那么该文件不会被编译和链接 当$(CONFIG_FOO)等于y时,上面语句等价于obj-y+=foo.o,它告诉kbuild在当前目录下
3、,有一个叫做foo.o的目标文件,它将从foo.c或则foo.S编译得到。 当$(CONFIG_FOO)等于m时,表示foo.o需要被编译成模块。2.1.1obj-y生成built-in.o Kbuild编译所有的$(obj-y)文件,并调用”$(LD)-r”把所有这些文件合并到built-in.o文件。这个built-in.o会被上一级目录的Makefile使用,最终链接到vmlinux中。2.1.2 目标由多个源文件编译得到 如果某个目标由多个源文件编译得到,那么可以通过$(-objs)或$(-y)把这些源文件告诉kb
4、uild。Kbuild能够识别后缀-objs和-y,例如: #drivers/isdn/i4l/Makefile obj-$(CONFIG_ISDN)+=isdn.o isdn-objs:=isdn_net_lib.oisdn_v110.oisdn_common.o Kbuild会编译所有$(isdn-objs)中的对象,并调用"$(LD)-r"把它们链接成isdn.o文件。 下面是一个使用后缀-y的例子。后缀-y的好处是,可以使用CONFIG_XXX符号来决定是否加入某些源文件(.o从对应
5、的.c或.S编译得到): #fs/ext2/Makefile obj-$(CONFIG_EXT2_FS) +=ext2.o ext2-y :=balloc.obitmap.o ext2-$(CONFIG_EXT2_FS_XATTR)+=xattr.o2.1.3 调用子目录Makefile Makefile只负责编译当前目录中的对象。子目录中的对象,由子目录中的Makefile负责。如何让make调用子目录中的Makefile?答案是把
6、子目录包含到obj-y或obj-m中。例如: #fs/Makefile obj-$(CONFIG_EXT2_FS)+=ext2/ 当CONFIG_EXT2_FS为y或m时,kbuild系统会在ext2目录中调用make命令(也即调用ext2目录中的Makefile)2.2lib-y和lib-m 在一个目录下,obj-y所列出的文件,将被编译成built-in.o文件,而lib-y或lib-m所列出的文件,将在当前目录下生成lib.a文件。 注意:一般lib-y或lib-m只用在lib/和ar
7、chlib目录中。 ---3.6目录递归 makefile文件负责编译当前目录下de目标文件,子目录中de文件由子目录中demakefile文件负责编译。编译系统将使用obj-y和obj-m自动递归编译各个子目录中文件。 如果ext2是一个子目录,fs目录下demakefile将使用以下赋值语句是编译系统编译ext2子目录。 例如:#fs/Makefile obj-$(CONFIG_EXT2_FS)+=ext2/ 如果CONFIG_EXT2_FS设置成'y(built-in)或'm'(modular),
此文档下载收益归作者所有