Linux 2.6 kernel 中的makefile 中文翻译

熟悉内核的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 特殊规则
       --- 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 递归下向时要访问的目录列表
       --- 6.4 具体架构的启动镜像
       --- 6.5 构造非Kbuild目标
       --- 6.6 构建启动镜像的命令
       --- 6.7 Kbuild自定义命令
       --- 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。

*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中后,其余文件就被忽略了。

        联接也是有顺序的,那是因为有些函数(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需要知道你所编译的模块是基于哪些文件,所以你需要通过变量
    $(<module_name>-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
          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可以同时列出要编译进内核的文件与要编译成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值