Linux内核Makefile文件.doc
《Linux内核Makefile文件.doc》由会员分享,可在线阅读,更多相关《Linux内核Makefile文件.doc(26页珍藏版)》请在咨信网上搜索。
1、Linux内核Makefile文件目录1 概述32 角色分工43 内核编译文件53.1 目标定义53.2 内嵌对象 - obj-y53.3 可加载模块 - obj-m63.4 导出符号目标73.5 库文件 - lib-y73.6 目录递归73.7 编译标记83.9 依赖关系93.10 特殊规则 $(obj)93.11 $(CC)支持功能104 辅助程序124.1 简单辅助程序124.2 组合辅助程序124.3 定义共享库124.4 C+语言使用方法134.5 辅助程序编译控制选项134.6 何时建立辅助程序144.7 使用hostprogs-$(CONFIG_FOO)155 编译清除机制166
2、 体系Makefile文件186.1 变量设置186.2 增加预设置项206.3 目录表206.4 引导映像216.5 编译非内核目标226.6 编译引导映像命令226.7 定制编译命令246.8 预处理连接脚本247 Kbuild变量268 Makefile语言279 Credits2710 TODO271 概述Makefile包括五部分: Makefile 顶层Makefile文件 .config 内核配置文件 arch/$(ARCH)/Makefile 机器体系Makefile文件 scripts/Makefile.* 所有内核Makefiles共用规则 kbuild Makefiles
3、 其它Makefile文件通过内核配置操作产生.config文件,顶层Makefile文件读取该文件的配置。顶层Makefile文件负责产生两个主要的程序:vmlinux (内核image)和模块。顶层Makefile文件根据内核配置,通过递归编译内核代码树子目录建立这两个文件。顶层Makefile文件文本一个名为 arch/$(ARCH)/Makefile的机器体系Makefile文件。机器体系Makefile文件为顶层Makefile文件提供与机器相关的信息。每一个子目录有一个Makefile文件,子目录Makefile文件根据上级目录Makefile文件命令启动编译。这些Makefile
4、使用. config文件配置数据构建各种文件列表,并使用这些文件列表编译内嵌或模块目标文件。scripts/Makefile.*包含了所有的定义和规则,与Makefile文件一起编译出内核程序。2 角色分工人们与内核Makefile存在四种不同的关系:*用户* 用户使用make menuconfig或make命令编译内核。他们通常不读或编辑内核Makefile文件或其他源文件。*普通开发者* 普通开发者维护设备驱动程序、文件系统和网络协议代码,他们维护相关子系统的Makefile文件,因此他们需要内核Makefile文件整体性的一般知识和关于kbuild公共接口的详细知识。*体系开发者* 体系
5、开发者关注一个整体的体系架构,比如sparc或者ia64。体系开发者既需要掌握关于体系的Makefile文件,也要熟悉内核Makefile文件。*内核开发者* 内核开发者关注内核编译系统本身。他们需要清楚内核Makefile文件的所有方面。本文档的读者对象是普通开发者和系统开发者。3 内核编译文件内核中大多数Makefile文件是使用kbuild基础架构的Makefile文件。本章介绍kbuild的Makefile中的语法。3.1节“目标定义”是一个快速导引,后面各章有详细介绍和实例。3.1 目标定义 目标定义是Makefile文件的主要部分(核心)。这些目标定义行定义了如何编译文件,特殊的兼
6、容选项和递归子目录。 最简单的Makefile文件只包含一行: Example: obj-y += foo.o 这行告诉kbuild在该目录下名为foo.o的目标文件(object),foo.o通过编译foo.c或者foo.S而得到。 如果foo.o编译成一个模块,则使用obj-m变量,因此常见写法如下: Example: obj-$(CONFIG_FOO) += foo.o $(CONFIG_FOO)可以代表y(built-in对象)或m(module对象)。如果CONFIG_FOO不是y或m,那么这个文件不会被编译和链接。3.2 内嵌对象 - obj-y Makefile文件将为编译vml
7、inux的目标文件放在$(obj-y)列表中,这些列表依赖于内核配置。 Kbuild编译所有的$(obj-y)文件,然后调用$(LD) -r合并这些文件到一个built-in.o文件中。built-in.o经过父Makefile文件链接到vmlinux。$(obj-y)中的文件 顺序很重要。列表中文件允许重复,文件第一次出现将被链接到built-in.o,后续出现该文件将被忽略。 链接顺序之所以重要是因为一些函数在内核引导时将按照他们出现的顺序被调用,如函数(module_init() / _initcall)。所以要牢记改变链接顺序意味着也要改变SCSI控制器的检测顺序和重数磁盘。 Exam
8、ple: #drivers/isdn/i4l/Makefile # 内核ISDN子系统和设备驱动程序Makefile # 每个配置项是一个文件列表 obj-$(CONFIG_ISDN) += isdn.o obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o3.3 可加载模块 - obj-m $(obj-m)表示对象文件(object files)编译成可加载的内核模块。 一个模块可以通过一个源文件或几个源文件编译而成。Makefile只需简单地它们加到$(obj-m)。 Example: #drivers/isdn/i4l/Makefile obj
9、-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o 注意:在这个例子中$(CONFIG_ISDN_PPP_BSDCOMP)含义是m。 如果内核模块通过几个源文件编译而成,使用以上同样的方法。 Kbuild需要知道通过哪些文件编译模块,因此需要设置一个$(-objs)变量。 Example: #drivers/isdn/i4l/Makefile obj-$(CONFIG_ISDN) += isdn.o isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o 在这个例子中,模块名isdn.o. Kbuild
10、首先编译$(isdn-objs)中的object文件,然后运行$(LD) -r将列表中文件生成isdn.o. Kbuild使用后缀-objs、-y识别对象文件。这种方法允许Makefile使用CONFIG_符号值确定一个object文件是否是另外一个object的组成部分。 Example: #fs/ext2/Makefile obj-$(CONFIG_EXT2_FS) += ext2.o ext2-y := balloc.o bitmap.o ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o 在这个例子中,如果$(CONFIG_EXT2_FS_XATTR)表示y
11、,则ext2.o只有xattr.o组成部分。 注意: 当然,当你将对象文件编译到内核时,以上语法同样有效。因此,如果CONFIG_EXT2_FS=y,Kbuild将先编译ext2.o文件,然后链接到built-in.o。3.4 导出符号目标 在Makefile文件中没有特别导出符号的标记。3.5 库文件 - lib-y obj-*中的object文件用于模块或built-in.o编译。object文件也可能编译到库文件中-lib.a。所有罗列在lib-y中的object文件都将编译到该目录下的一个单一的库文件中。包含在0bj-y中的object文件如果也列举在lib-y中将不会包含到库文件中,
12、因为他们不能被访问。但lib-m中的object文件将被编译进lib.a库文件。 注意在相同的Makefile中可以列举文件到buit-in内核中也可以作为库文件的一个组成部分。因此在同一个目录下既可以有built-in.o也可以有lib.a文件。 Example: #arch/i386/lib/Makefile lib-y := checksum.o delay.o 这样将基于checksum.o、delay.o创建一个lib.a文件。对于内核编译来说,lib.a文件被包含在libs-y中。将“6.3 目录表”。 lib-y通常被限制使用在lib/和arch/*/lib目录中。3.6 目录递
13、归 Makefile文件负责编译当前目录下的目标文件,子目录中的文件由子目录中的Makefile文件负责编译。编译系统将使用obj-y和obj-m自动递归编译各个子目录中文件。 如果ext2是一个子目录,fs目录下的Makefile将使用以下赋值语句是编译系统编译ext2子目录。 Example: #fs/Makefile obj-$(CONFIG_EXT2_FS) += ext2/ 如果CONFIG_EXT2_FS设置成y(built-in)或m(modular),则对应的obj-变量也要设置,内核编译系统将进入ext2目录编译文件。内核编译系统只使用这些信息来决定是否需要编译这个目录,子目
14、录中Makefile文件规定那些文件编译为模块那些是内核内嵌对象。 当指定目录名时使用CONFIG_变量是一种良好的做法。如果CONFIG_选项不为y或m,内核编译系统就会跳过这个目录。3.7 编译标记EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS 所有的EXTRA_变量只能使用在定义该变量后的Makefile文件中。EXTRA_变量被Makefile文件所有的执行命令语句所使用。 $(EXTRA_CFLAGS)是使用$(CC)编译C文件的选项。 Example: # drivers/sound/emu10k1/Makefile
15、 EXTRA_CFLAGS += -I$(obj) ifdef DEBUG EXTRA_CFLAGS += -DEMU10K1_DEBUG endif 定义这个变量是必须的,因为顶层Makefile定义了$(CFLAGS)变量并使用该变量编译整个代码树。 $(EXTRA_AFLAGS)是每个目录编译汇编语言源文件的选项。 Example: #arch/x86_64/kernel/Makefile EXTRA_AFLAGS := -traditional $(EXTRA_LDFLAGS)和$(EXTRA_ARFLAGS)用于每个目录的$(LD)和$(AR)选项。 Example: #arch/m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 内核 Makefile 文件
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。