首页 linux2.6内核Makefile详解+pdf

linux2.6内核Makefile详解+pdf

举报
开通vip

linux2.6内核Makefile详解+pdf linux2.6内核Makefile详解 [转] http://forum.eepw.com.cn/forum/main?url=http%3A%2F%2Fbbs.edw.com.cn%2Fthread%2F1287 30%2F1 熟悉内核的Makefile对开发设备驱动、理解内核代码结构都是非常重要的 linux2.6 内 核 Makefile 的 许 多 特 性 和 2.4 内 核 差 别 很 大 , 在 内 核 目 录 的 documention/kbuild/makefiles.txt中有详...

linux2.6内核Makefile详解+pdf
linux2.6内核Makefile详解 [转] http://forum.eepw.com.cn/forum/main?url=http%3A%2F%2Fbbs.edw.com.cn%2Fthread%2F1287 30%2F1 熟悉内核的Makefile对开发设备驱动、理解内核代码结构都是非常重要的 linux2.6 内 核 Makefile 的 许 多 特 性 和 2.4 内 核 差 别 很 大 , 在 内 核 目 录 的 documention/kbuild/makefiles.txt中有详细的说明。给大家一个中文版的翻译 === 目录 === 1 概述 === 2 用户与作用 === 3 Kbuild文件 --- 3.1 目标定义 --- 3.2 编译进内核 - obj-y --- 3.3 编译可装载模块 - obj-m --- 3.4 输出的符号 --- 3.5 目标库文件 - lib-y --- 3.6 递归躺下访问目录 --- 3.7 编辑标志 --- 3.8 命令行的依赖关系(原文中没有写:-)) --- 3.9 跟踪依赖 --- 3.10 特殊 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf --- 3.11 $(CC) 支持的函数 === 4 本机程序支持 --- 4.1 简单的本机程序 --- 4.2 复合的本机程序 --- 4.3 定义共享库 --- 4.4 使用用 C++编写的本机程序 --- 4.5 控制本机程序的编译选项 --- 4.6 编译主机程序时 --- 4.7 使用 hostprogs-$(CONFIG_FOO) === 5 Kbuild清理 === 6 架构Makefile --- 6.1 调整针对某一具体架构生成的镜像 --- 6.2 将所需文件加到 archprepare 中 --- 6.3 递归下向时要访问的目录列 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf --- 6.4 具体架构的启动镜像 --- 6.5 构造非 Kbuild目标 --- 6.6 构建启动镜像的命令 --- 6.7 Kbuild自定义命令 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. --- 6.8 联接器预处理脚本 === 7 Kbuild 变量 === 8 Makefile语言 === 9 关于作者 === 10 TODO === 1 概述 Linux内核的Makefile分为 5个部分: Makefile 顶层Makefile .config 内核配置文件 arch/$(ARCH)/Makefile 具体架构的Makefile scripts/Makefile.* 通用的规则等。面向所有的 Kbuild Makefiles。 kbuild Makefiles 内核源代码中大约有 500个这样的文件 顶层Makefile阅读的.config文件,而该文件是由内核配置程序生成的。 顶层Makefile负责制作:vmlinux(内核文件)与模块(任何模块文件)。制作的过程主要是 通过递归向下访问子目录的形式完成。并根据内核配置文件确定访问哪些子目录。顶层 Makefile要原封不动的包含一具体架构的Makefile,其名字类似于 arch/$(ARCH)/ Makefile。该架构Makefile向顶层Makefile提供其架构的特别信息。 每一个子目录都有一个 Kbuild Makefile文件,用来执行从其上层目录传递下来的命令。 Kbuild Makefile从.config文件中提取信息,生成 Kbuild完成内核编译所需的文件列表。 scripts/Makefile.*包含了所有的定义、规则等信息。这些文件被用来编译基于 kbuild Makefile的内核。(**有点不通**) === 2 用户与作用 可以将人们与内核Makefile的关系分成 4类。 *使用者* 编译内核的人。他们只是键入"make menuconfig"或"make"这样的命令。一般情况 下是不会读或编辑任何内核Makefile(或者任何的源文件)。 *普通开发人员* 这是一群工作在内核某一功能上的人,比如:驱动开发,文件系统或网络 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 。他们所需要维护的只是他们所工作的子系统的 Kbuild Makefile。为了提高工作的效率, 他们也需要对内核Makefile有一个全面的认识,并且要熟悉 Kbuild的接口 。 *架构开发人员* 这是一些工作在具体架构,比如 sparc 或者 ia64,上面的人。架构开发者 需要在熟悉 kbuild Makefile的同时,也要熟悉他所工作架构的Makefile。 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. *Kbuild开发者* 维护 Kbuild系统的人。他们需要知晓内核Makefile的方方面面。 该文件是为普通开发人员与架构开发人员所写。 === 3 Kbuild文件 大部分内核中的Makefile都是使用 Kbuild组织结构的 Kbuild Makefile。这章介绍了 Kbuild Makefile 的语法。Kbuild 文件倾向于"Makefile"这个名字,"Kbuild"也是可以用的。但如果 "Makefile" "Kbuild"同时出现的话,使用的将会是"Kbuild"文件。 3.1节 目标定义是一个快速介绍,以后的几章会提供更详细的内容以及实例。 --- 3.1 目标定义 目标定义是 Kbuild Makefile的主要部分,也是核心部分。主要是定义了要编 译 的文件,所有的选项,以及到哪些子目录去执行递归操作。 最简单的 Kbuild makefile 只包含一行: 例子: obj-y += foo.o 该例子告诉 Kbuild 在这目录里,有一个名为 foo.o 的目标文件。foo.o 将从 foo.c 或 foo.S文件编译得到。 如果 foo.o要编译成一模块,那就要用 obj-m了。所采用的形式如下: 例子: obj-$(CONFIG_FOO) += foo.o $(CONFIG_FOO)可以为 y(编译进内核) 或 m(编译成模块)。如果 CONFIG_FOO不 是 y和 m,那么该文件就不会被编译联接了。 --- 3.2 编译进内核 - obj-y Kbuild Makefile 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 所有编译进内核的目标文件都存在$(obj-y)列表中。而 这 些列表依赖内核的配置。 Kbuild 编译所有的$(obj-y)文件。然后,调用 "$(LD) -r"将它们合并到一个 build-in.o文件中。稍后,该 build-in.o会被其父Makefile联接进 vmlinux中。 $(obj-y)中的文件是有顺序的。列表中有重复项是可以的:当第一个文件被联接到 built-in.o中后,其余文件就被忽略了。 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 联接也是有顺序的,那是因为有些函数(module_init()/__initcall)将会在启动时按照 他们出现的顺序进行调用。所以,记住改变联接的顺序可能改变你 SCSI控制器的检测顺序, 从而导致你的硬盘数据损害。 例子: #drivers/isdn/i4l/Makefile # Makefile for the kernel ISDN subsystem and device drivers. # Each configuration option enables a list of files. obj-$(CONFIG_ISDN) += isdn.o obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o --- 3.3 编译可装载模块 - obj-m $(obj-m) 列举出了哪些文件要编译成可装载模块。 一个模块可以由一个文件或多个文件编译而成。如果是一个源文件,Kbuild Makefile只需简单的将其加到$(obj-m)中去就可以了。 例子: #drivers/isdn/i4l/Makefile obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o 注意:此例中 $(CONFIG_ISDN_PPP_BSDCOMP) 的值为'm' 如果内核模块是由多个源文件编译而成,那你就要采用上面那个例子一样的 方 法去声明你所要编译的模块。 Kbuild 需要知道你所编译的模块是基于哪些文件,所以你需要通过变量 $(-objs)来告诉它。 例子: #drivers/isdn/i4l/Makefile obj-$(CONFIG_ISDN) += isdn.o isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o 在这个例子中,模块名将是 isdn.o,Kbuild将编译在$(isdn-objs)中列出的所有文件, 然后使用"$(LD) -r"生成 isdn.o。 Kbuild 能够识别用于组成目标文件的后缀 -objs 和后缀 -y。这就让 Kbuild Makefile可以通过使用 CONFIG_ 符号来判断该对象是否是用来组合对象的。 例子: #fs/ext2/Makefile obj-$(CONFIG_EXT2_FS) += ext2.o Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. ext2-y := balloc.o bitmap.o ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o 在这个例子中,如果 $(CONFIG_EXT2_FS_XATTR) 是 'y',xattr.o 将是复合对象 ext2.o的一部分。 注意:当然,当你要将其编译进内核时,上面的语法同样适用。所以,如果你的 CONFIG_EXT2_FS=y,那 Kbuild会按你所期望的那样,生成 ext2.o文件,然后将其联接 到 built-in.o中。 --- 3.4 输出的符号 在Makefile中,没有对模块输出的符号有特殊要求。 --- 3.5 目标库文件 - lib-y 在 obj-* 中所列文件是用来编译模块或者是联接到特定目录中的 built-in.o 。 同样,也可以列出一些将被包含在 lib.a库中的文件。 在 lib-y 中所列出的文件用来组成该目录下的一个库文件。 在 obj-y 与 lib-y 中同时列出的文件,因为都是可以访问的,所以该文件是不会被 包含在库文件中的。 同样的情况, lib-m 中的文件就要包含在 lib.a 库文件中。 注意,一个 Kbuild makefile 可以同时列出要编译进内核的文件与要编译成库的文 件。所以,在一个目录里可以同时存在 built-in.o 与 lib.a 两个文件。 例子: #arch/i386/lib/Makefile lib-y := chechsum.o delay.o 这将由 checksum.o 和 delay.o 两个文件创建一个库文件 lib.a。为了让 Kbuild 真 正认识到这里要有一个库文件 lib.a 要创建,其所在的目录要加到 libs-y 列表中。 还可参考"6.3 递归下向时要访问的目录列表" lib-y 使用一般限制在 lib/ 和 arch/*/lib 中。 --- 3.6 递归向下访问目录 一个 Makefile 只对编译所在目录的对象负责。在子目录中的文件的编译要由其所 在的子目录的 Makefile来管理。只要你让 Kbuild知道它应该递归操作,那么该系统就会在 其子目录中自动的调用 make 递归操作。 这就是 obj-y 和 obj-m 的作用。 ext2 被放的一个单独的目录下,在 fs目录下的Makefile会告诉 Kbuild使用下面的赋值 进行向下递归操作。 例子: Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. #fs/Makefile obj-$(CONFIG_EXT2_FS) += ext2/ 如果 CONFIG_EXT2_FS 被设置为 'y'(编译进内核)或是'm'(编译成模块),相应的 obj- 变量就会被设置,并且 Kbuild 就会递归向下访问 ext2 目录。Kbuild 只是用这些信息 来决定它是否需要访问该目录,而具体怎么编译由该目录中的Makefile来决定。 将 CONFIG_ 变量设置成目录名是一个好的编程习惯。这让 Kbuild 在完全忽略那 些相应的 CONFIG_ 值不是'y'和'm'的目录。 --- 3.7 编辑标志 EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS 所有的 EXTRA_ 变量只在所定义的 Kbuild Makefile 中起作用。EXTRA_ 变量可 以在 Kbuild Makefile中所有命令中使用。 $(EXTRA_CFLAGS) 是用 $(CC) 编译 C源文件时的选项。 例子: # drivers/sound/emu10kl/Makefile EXTRA_CFLAGS += -I$(obj) ifdef DEBUG EXTRA_CFLAGS += -DEMU10KL_DEBUG endif 该变量是必须的,因为顶层 Makefile 拥有变量 $(CFLAGS) 并用来作为整个源代码树 的编译选项。 $(EXTRA_AFLAGS) 也是一个针对每个目录的选项,只不过它是用来编译汇编源代码的。 例子: #arch/x86_64/kernel/Makefile EXTRA_AFLAGS := -traditional $(EXTRA_LDFLAGS) 和 $(EXTRA_ARFLAGS)分别与 $(LD)和 $(AR)类似,只不 过,他们是针对每个目录的。 例子: #arch/m68k/fpsp040/Makefile EXTRA_LDFLAGS := -x CFLAGS_$@, AFLSGA_$@ CFLAGS_$@ 和 AFLAGS_$@ 只能在当前 Kbuild Makefile中的命令中使用。 $(CFLAGS_$@) 是 $(CC) 针对每个文件的选项。$@ 表明了具体操作的文件。 例子: # drivers/scsi/Makefile Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. CFLAGS_aha152x.o = -DAHA152X_STAT -DAUTOCONF CFLAGS_gdth.o = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \ -DGDTH_STATISTICS CFLAGS_seagate.o = -DARBITRATE -DPARITY -DSEAGATE_USE_ASM 以上三行分别设置了 aha152x.o,gdth.o 和 seagate.o的编辑选项。 $(AFLAGS_$@) 也类似,只不是是针对汇编语言的。 例子: # arch/arm/kernel/Makefile AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional --- 3.9 跟踪依赖 Kbuild 跟踪在以下方面依赖: 1) 所有要参与编译的文件(所有的.c 和.h文件) 2) 在参与编译文件中所要使用的 CONFIG_ 选项 3) 用于编译目标的命令行 因此,如果你改变了 $(CC) 的选项,所有受影响的文件都要重新编译。 --- 3.10 特殊规则 特殊规则就是那 Kbuild 架构不能提供所要求的支持时,所使用的规则。一个典型的例 子就是在构建过程中生成的头文件。 另一个例子就是那些需要采用特殊规则来准备启动镜像。 特殊规则的写法与普通Make规则一样。 Kbuild 并不在 Makefile 所在的目录执行,所以所有的特殊规则都要提供参与编译的文 件和目标文件的相对路径。 在定义特殊规则时,要使用以下两个变量: $(src) $(src) 表明Makefile所在目录的相对路径。经常在定位源代码树中的文件时,使用该变 量。 $(obj) $(obj) 表明目标文件所要存储目录的相对路径。经常在定位所生成的文件时,使用该变 量。 例子: #drivers/scsi/Makefile $(obj)/53c8xx_d.h: $(src)/53c7,8xx.scr $(src)/script_asm.pl Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. $(CPP) -DCHIP=810 - < $< | ... $(src)/script_asm.pl 这就是一个特殊规则,遵守着 make所要求的普通语法。目标文件依赖于两个源文件。 用$(obj)来定位目标文件,用$(src)来定位源文件(因为它们不是我们生成的文件)。 --- 3.11 $(CC) 支持的函数 内核可能由多个不同版本的$(CC)编译,而每个版本都支持一不同的功能集与选项集。 Kbuild提供了检查 $(CC) 可用选项的基本功能。$(CC)一般情况下是 gcc编译器,但也可以 使用其它编译器来代替 gcc。 as-option as-option,当编译汇编文件(*.S)时,用来检查 $(CC) 是否支持特定选项。如果第一个 选项不支持的话,可选的第二个选项可以用来指定。 例子: #arch/sh/Makefile cflags-y += $(call as-option,-Wa$(comma)-isa=$(isa-y),) 在上面的例子里,如果 $(CC) 支持选项 -Wa$(comma)-isa=$(isa-y),cflags-y 就会被赋 予该值。 第二个参数是可选的,当第一个参数不支持时,就会使用该值。 ld-option ld-option,当联接目标文件时,用来检查 $(CC) 是否支持特定选项。如果第一个选项 不支持的话,可选的第二个选项可以用来指定。 例子: #arch/i386/kernel/Makefile vsyscall-flags += $(call ld-option, -Wl$(comma)--hash-style=sysv) 在上面的例子中,如果 $(CC)支持选项 -Wl$(comma)--hash-style=sysv,ld-option 就会 被赋予该值。 第二个参数是可选的,当第一个参数不支持时,就会使用该值。 cc-option cc-option,用来检查 $(CC) 是否支持特定选项,并且不支持使用可选的第二项。 例子: #arch/i386/Makefile cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586) 在上面的例子中,如果 $(CC)支持选项 -march=pentium-mmx,cc-option就会被赋予该 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 值,否则就赋 -march-i586。 cc-option的第二个参数是可选的。如果忽略的话,当第一个选项不支持时,cflags-y 不 会被赋值。 cc-option-yn cc-option-yn,用来检查 gcc 是否支持特定选项,返回'y'支持,否则为'n'。 例子: #arch/ppc/Makefile biarch := $(call cc-option-yn, -m32) aflags-$(biarch) += -a32 cflags-$(biarch) += -m32 在上面的例子里,当 $(CC) 支持 -m32 选项时,$(biarch)设置为 y。当$(biarch) 为 y 时,扩展的 $(aflags-y) 和 $(cflags-y)变量就会被赋值为-a32 和 -m32。 cc-option-align gcc版本大于 3.0时,改变了函数,循环等用来声明内存对齐的选项。当用到对齐选项 时,$(cc-option-align) 用来选择正确的前缀: gcc < 3.00 cc-option-align = -malign gcc >= 3.00 cc-option-align = -falign 例子: CFLAGS += $(cc-option-align)-functions=4 在上面的例子中,选项 -falign-funcions=4 被用在 gcc >= 3.00 的时候。对于小于 3.00 时, 使用 -malign-funcions=4 。 cc-version cc-version以数学形式返回 $(CC) 编译器的版本号。 其 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 是:,二者都是数学。比如,gcc 3.41 会返回 0341。当某版本 的 $(CC) 在某方面有缺陷时,cc-version就会很有用。比如,选项 -mregparm=3 虽然会被 gcc 接受,但其实现是有问题的。 例子: #arch/i386/Makefile cflags-y += $(shell \ if [ $(call cc-version) -ge 0300 ] ; then \ echo "-meregparm=3"; fi ;) 在上面的例子中,-mregparm=3 只会在 gcc 的版本号大于等于 3.0 的时候使用。 cc-ifversion Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. cc-ifversion测试 $(CC) 的版本号,如果版本表达式为真,就赋值为最后的参数。 例子: #fs/reiserfs/Makefile EXTRA_CFLAGS := $(call cc-ifversion, -lt, 0402, -O1) 在这个例子中,如果 $(CC) 的版本小于 4.2,EXTRA_CFLAGS 就被赋值 -O1。cc- ifversion 可使用所有的 shell 操作符:-eq,-ne,-lt,-le,-gt,和-ge。 第三个参数可以像上面例子一样是个文本,但也可以是个扩展的变量或宏。 /*这段翻译的不好*/ === 4 本机程序支持 Kbuild 支持编译那些将在编译阶段使用的可执行文件。为了使用该可执行文件,要将编译 分成二个阶段。 第一阶段是告诉 Kbuild存在哪些可执行文件。这是通过变量 hostprogs-y来完成的。 第二阶段是添加一个对可执行文件的显性依赖。有两种方法:增加依赖关系到一个规则中, 或是利用变量 $(always)。 以下是详细叙述. --- 4.1 简单的本机程序 在编译内核时,有时会需要编译并运行一个程序。下面这行就告诉了kbuild,程序bin2hex 应该在本机上编译。 例子: hostprogs-y := bin2hex 在上面的例子中,Kbuild假设 bin2hex是由一个与其在同一目录下,名为 bin2hex.c 的 C语言源文件编译而成的。 --- 4.2 复合的本机程序 本机程序可以由多个文件编译而成。 所使用的语法与内核的相应语法很相似。 $(-objs) 列出了联接成最后的可执行文件所需的所有目标文件。 例子: #scripts/lxdialog/Makefile hostprogs-y := lxdialog lxdialog-objs := checklist.o lxdialog.o 扩展名为.o的文件是从相应的.c文件编译而来的。在上面的例子中, checklist.c 编译成了 checklist.o,lxdialog.c编译成了 lxdialog.o。 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 最后,两个.o文件联接成了一可执行文件,lxdialog。 注意:语法 -y不是只能用来生成本机程序。 --- 4.3 定义共享库 扩展名为 so的文件称为共享库,被编译成位置无关对象。Kbuild也支持共享库,但共 享库的使用很有限。 在下面的例子中,libconfig.so共享库用来联接到可执行文件 conf中。 例子: #scripts/kconfig/Makefile hostprogs-y := conf conf-objs := conf.o libkconfig.so libkcofig-objs := expr.o type.o 共享库文件经常要求一个相应的 -objs,在上面的例子中,共享库 libkconfig是由 expr.o 和 type.o两个文件组成的。 expr.o 和 type.o 将被编译成位置无关码,然后联接成共享库文件 libkconfig.so。C++并不支持共享库。 --- 4.4 使用用 C++编写的本机程序 kbuild 也支持用 C++编写的本机程序。在此专门介绍是为了支持 kconfig,并且在一般 情况下不推荐使用。 例子: #scripts/kconfig/Makefile hostprogs-y := qconf qconf-cxxobjs := qconf.o 在上面的例子中,可执行文件是由 C++文件 qconf.cc 编译而成的,由$(qconf-cxxobjs) 来标识。 如果 qconf是由.c和.cc一起编译的,那么就需要专门来标识这些文件了。 例子: #scripts/kconfig/Makefile hostprogs-y := qconf qconf-cxxobjs := qconf.o qconf-objs := check.o --- 4.5 控制本机程序的编译选项 当编译本机程序时,有可能使用到特殊选项。程序经常是利用$(HOSTCC)编译,其选项 在 $(HOSTCFLAGS)变量中。 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 可通过使用变量 HOST_EXTRACFLAGS,影响所有在 Makefile 文件中要创建的 主机程序。 例子: #scripts/lxdialog/Makefile HOST_EXTRACFLAGS += -I/usr/include/ncurses 为一单个文件设置选项,可按形式进行: 例子: #arch/ppc64/boot/Makefile HOSTCFLAGS_pinggyback.o := -DKERNELBASE=$(KERNELBASE) 同样也可以给联接器声明一特殊选项。 例子: #scripts/kconfig/Makefile HOSTLOADLIBES_qconf := -L$(QTDIR)/lib 当联接 qconf时,将会向联接器传递附加选项 "-L$(QTDIR)/lib"。 --- 4.6 编译主机程序时 Kbuild只在需要时编译主机程序。 有两种方法: (1) 在一具体的规则中显性列出所需要的文件 例子: #drivers/pci/Makefile hostprogs-y := gen-devlist $(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist ( cd $(obj); ./gen-devlist ) < $< 目标 $(obj)/devlist.h 是不会在 $(obj)/gen-devlist 更新之前编译的。注意在该规则中所 有有关主机程序的命令必须以$(obj)开头。 (2) 使用 $(always) 当Makefile要编译主机程序,但没有适合的规则时,使用 $(always)。 例子: #scripts/lxdialog/Makefile hostprogs-y := lxdialog always := $(hostprogs-y) Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 这就是告诉 Kbuild,即使没有在规则中声明,也要编译 lxdialog。 --- 4.7 使用 hostprogs-$(CONFIG_FOO) 一个典型的 Kbuild模式如下: 例子: #scripts/Makefile hostprogs-$(CONFIG_KALLSYMS) += kallsyms Kbuild 知道 'y' 是编译进内核,而 'm' 是编译成模块。所以,如果配置符号是'm',Kbuild 仍然会编译它。换句话说,Kbuild处理 hostprogs-m 与 hostprogs-y 的方式是完全一致的。只是,如果不用 CONFIG,最好用 hostprogs-y。 === 5 Kbuild清理(clean) "make clean"删除几乎所有的在编译内核时生成的文件,包括了主机程序在内。Kbuild 通过 列表 $(hostprogs-y),$(hostprogs-m),$(always),$(extra-y) 和$(targets) 知道所要编译的目 标。这些目标文件都会被 "make clean" 删除。另外,在"make clean"还会删除匹配 "*.[oas]", "*.ko" 的文件,以及由 Kbuild生成的辅助文件。 辅助文件由 Kbuild Makefile 中的 $(clean-files) 指明。 例子: #drivers/pci/Makefile clean-files := devlist.h classlist.h 当执行 "make clean" 时,"devlist.h classlist.h"这两个文件将被删除。如果不使用绝对路径(路 径以'/'开头)的话,Kbuild假设所要删除的文件与Makefile在同一个相对路径上。 要删除一目录: 例子: #scripts/package/Makefile clean-dirs := $(objtree)/debian/ 这就会删除目录 debian,包括其所有的子目录。如果不使用绝对路径(路径以'/'开头)的话, Kbuild假设所要删除的目录与Makefile在同一个相对路径上。 一般情况下,Kbuild会根据 "obj-* := dir/" 递归访问其子目录,但有的时候,Kbuild架构还 不足以描述所有的情况时,还要显式的指明所要访问的子目录。 例子: #arch/i386/boot/Makefile subdir- := compressed/ Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 上面的赋值命令告诉 Kbuild,当执行"make clean"时,要递归访问目录 compressed/。 为了支持在最终编译完成启动镜像后的架构清理工作,还有一可选的目标 archclean: 例子: #arch/i386/Makefile archclean: $(Q)$(MAKE) $(clean)=arch/i386/boot 当"make clean"执行时,make 会递归访问并清理 arch/i386/boot。在 arch/i386/boot 中的 Makefile可以用来提示 make进行下一步的递归操作。 注意 1:arch/$(ARCH)/Makefile 不能使用"subdir-",因为该Makefile被包含在顶层的Makefile 中,Kbuild是不会在此处进行操作的。 注意 2:"make clean" 会访问在 core-y,libs-y,drivers-y 和 net-y 列出的所有目录。 === 6 架构Makefile 在递归访问目录之前,顶层 Makefile 要完成设置环境变量以及递归访问的准备工作。顶层 Makefile 包含的公共部分,而 arch/$(ARCH)/Makefile 包含着针对某一特定架构的配置信 息。所以,要在 arch/$(ARCH)/Makefile 中设置一部分变量,并定义一些目标。 Kbuild执行的几个步驟(大致): 1) 根据内核配置生成文件 .config 2) 将内核的版本号存储在 include/linux/version.h 3) 生成指向 include/asm-$(ARCH) 的符号链接 4) 更新所有编译所需的文件: -附加的文件由 arch/$(ARCH)/Makefile 指定。 5) 递归向下访问所有在下列变量中列出的目录: init-* core* drivers-* net-* libs-*,并编译生成目标文件。 -这些变量的值可以在 arch/$(ARCH)/Makefile 中扩充。 6) 联接所有的目标文件,在源代码树顶层目录中生成 vmlinux。最先联接是在 head-y中 列出的文件,该变量由 arch/$(ARCH)/Makefile 赋值。 7) 最后完成具体架构的特殊要求,并生成最终的启动镜像。 -包含生成启动指令 -准备 initrd 镜像或类似文件 --- 6.1 调整针对某一具体架构生成的镜像 LDFLAGS 一般是 $(LD) 选项 该选项在每次调用联接器时都会用到。 一般情况下,只用来指明模拟器。 例子: #arch/s390/Makefile LDFLAGS := -m elf_s390 注意:EXTRA_LDFLAGS 和 LDFLAGS_$@ 可用来进一步自定义选项。请看第七章。 LDFLAGS_MODULE 联接模块时的联接器的选项 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. LDFLAGS_MODULE 所设置的选项将在联接器在联接模块文件 .ko 时使用。默认值为 "-r",指定输出文件是可重定位的。 LDFLAGS_vmlinux 联接 vmlinux时的选项 LDFLAGS_vmlinux用来传递联接 vmlinux时的联接器的选项。 LDFLAGS_vmlinux需 LDFLAGS_$@ 支持。 例子: #arch/i386/Makefile LDFLAGS_vmlinux := -e stext OBJCOPYFLAGS objcopy 选项 当用 $(call if_changed,objcopy) 来转换(translate)一个.o文件时,该选项就会被使用。 $(call if_changed,objcopy) 经常被用来为 vmlinux生成原始的二进制代码。 例子: #arch/s390/Makefile OBJCOPYFLAGS := -O binary #arch/s390/boot/Makefile $(obj)/image: vmlinux FORCE $(call if_changed,objcopy) 在此例中,二进制文件 $(obj)/image 是 vmlinux 的一个二进制版本。 $(call if_chagned,xxx)的用法稍后描述。 AFLAGS $(AS) 汇编编译器选项 默认值在顶层Makefile 扩充或修改在各具体架构的Makefile 例子: #arch/sparc64/Makefile AFLAGS += -m64 -mcpu=ultrasparc CFLAGS $(CC) 编译器选项 默认值在顶层Makefile 扩充或修改在各具体架构的Makefile。 一般,CFLAGS要根据内核配置设置。 例子: #arch/i386/Makefile cflags-$(CONFIG_M386) += -march=i386 CFLAGS += $(cflags-y) Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. 许多架构Makefile都通过调用所要使用的 C编译器,动态的检查其所支持的选项: #arch/i386/Makefile ... cflags-$(CONFIG_MPENTIUMII) += $(call cc-option,\ -march=pentium2,-march=i686) ... # Disable unit-at-a-time mode ... CFLAGS += $(call cc-option,-fno-unit-at-a-time) ... 第一个例子利用了一个配置选项,当其为'y'时,扩展。 CFLAGS_KERNEL : #arch/i386/Makefile ... cflags-$(CONFIG_MPENTIUMII) += $(call cc-option,\ -march=pentium2,-march=i686) ... # Disable unit-at-a-time mode ... CFLAGS += $(call cc-option,-fno-unit-at-a-time) ... 第一个例子利用了一个配置选项,当其为'y'时,扩展。 CFLAGS_KERNEL 编译进内核时,$(CC) 所用的选项 $(CFLAGS_KERNEL) 包含了用于编译常驻内核代码的附加编译器选项。 CFLAGS_MODULE 编译成模块时,$(CC)所用的选项 $(CFLAGS_MODULE) 包含了用于编译可装载模块的附加编译器选项。 --- 6.2 将所需文件加到 archprepare 中: archprep
本文档为【linux2.6内核Makefile详解+pdf】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_171476
暂无简介~
格式:pdf
大小:60KB
软件:PDF阅读器
页数:22
分类:互联网
上传时间:2011-12-29
浏览量:27