西格玛向量™

U盘中打造属于自己的Linux (三) :内核编译(上)MakeFile

作者: 西玛哒   分类: IT悟语, Linux, 老西常谈   标签:    评论: 0

# 接上文:我们已经了解了内核文件的作用并且下载了整个的内核源码树,现在我们相当于有了一堆积木,可以建造自己心目中的“城堡”了。但是搭积木也是需要技巧的,咱们一步步的了解下内核的编译过程。

  环境声明:

##

#pwd

#/home/你/kernel/linux-XXXXXX-X/

  ls

………  Makefile  ………..

  有这个文件就对了 之前我们说过  编译内核是要用到makefile的,那么 makefile 是个什么呢?

########### 知道的不用看##################

回想一下,我们编写一个简单的.c程序,在gcc编译器下如何编译?

gcc helloworld.c -o helloworld

对于一个文件   -o 编译 会产生一个.o 的临时中间文件,随后看是否有需要连接其他.o文件或库的地方,最后生成可执行文件 helloworld ,而中间的.o文件被删除。

多个c文件同理,我们可以选择先编译为.o文件 之后再连接为可执行文件。

但是 ,如果有N千个.c源文件,最可恶的是,很多时候由不同的程序员编写,其中不乏像我这样的入门级…. 程序的关系和作用很难理清,如果分布形成,一条条的编译连接,那么一但一步有错,则会前功尽弃。

于是,就有了makefile这种方式。(如果你想到一些IDE 那么证明你被windows宠坏了….)

   makefile说白了,就是定义了整个工程的编译规则的文件。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规 则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,对于写过linux脚本的童鞋来说,可以把makefile看成一个Shell脚本,其中也可以执行操作系统的命令。

    我们大胆的把makefile文件打开看看

# vi Makefile

// N多千行     

  大体可以看到很多条件控制语句 用于控制编译的顺序, 文件的存放位置, 还有一些变量 用于控制编译时到底调用哪些文件。这也是我们裁剪内核的基础。

#################################

makefile已经为我们规定了一些规则,用这些“原厂”的规则,我们就可以进行编译了,makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,make命令由宿主机提供,它根据makefile的指示,调用本机的编译工具链,将一大堆不知道是啥的源文件汇聚成看得到的内核。

  了解了makefile文件之后,我们大体了解一下make的指令技巧。

#######

// make 的使用:

     一、make命令的执行规则:

      在一个目录下输入make 命令 将遵照以下步骤执行:

  1. make会在当前目录下找名字 叫“Makefile”或“makefile”的文件。如果找到,它会找文件中的第一个目标文件(target),并把这个文件作为最终的目标文件。

         // 为了更好的说明这一点 以刚刚打开的Makefile文件为例,

       在第835行 我们找到这样一句:

     U盘中打造属于自己的Linux (三) :内核编译(上)MakeFile

       不出我们所料,是之前讲过的vmlinux 镜像文件,我们编译的产品就是它了。

    1. 如果vmlinux文件不存在,或是其所依赖的后面的 .o 文件的文件修改时间要比这个文件新,那么,他就会执行后面所定义的命令来生成这个文件。
    2. 如果所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
    3. 当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件声明make的终极任务,也就是执行文件vmlinux了。

      二、 make命令的使用规则:

       make命令通过参数调节对makefile文件的使用方式。

       make命令有许多 可以通过

      # man make

      来查看官方说明书,这里不详述功能,只介绍有用的几个;

       现在我们还一次都没有编译过,但是之后我们可能出现编译的不好 希望重新编译的情况,这就需要使用以下命令:

      #make clean

       建议大家编译前执行 此命令可以检查你的环境细节,包括工具是否都安装了,并且清理掉之前编译的冗余信息,保证源码处于最新版本。

      还有一条类似的命令:

    # make mrproper —–删除不必要的文件和目录.

    //——————–

      由于内核编译需要很多不同的编译器和库,因此必然需要其他很多软件的辅助,大部分的linux发行版有相关的包,只要安装后就可以正常编译了;

      #apt-get install build-essential  bin86 kernel-package  

      #apt-get install libqt3-headers libqt3-mt-dev

    执行make指令时候会有提示 是否缺少相关文件,大家使用apt-get install 直接下载安装就可以了。

    //———————

      保证环境之后就可以进入make的设置部分了

      之前提到,makefile文件中有一些用于控制选择性编译的量,我们可以规定一个config文件来控制 到底编译哪些文件以及编译的规则,这是我们需要用到make config :

    这个命令有兄弟四个:

      #make config (基于文本的最为传统的配置界面)

      #make menuconfig (基于文本选单的配置界面)

       #make xconfig (基于图形窗口模式的配置界面)

       #make oldconfig (如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)

      老大知音很少,不知道你敢当不。老二用的最多,老三华而不实,外相好而已,老四最有用了,可以大大提高你的效率。

      我们推荐使用:

      #make menuconfig

      你可以试一下,如果你的编译环境没有什么问题,那么在刷了一会儿屏后,就会有一个神似BIOS的窗口出现:

     U盘中打造属于自己的Linux (三) :内核编译(上)MakeFile

       可以看出  我们可以用选项控制内核的编译内容,最后形成一个.config 文件,用来控制之后make时的流程。

      关于内核设置,我们下文中叙述,此处pause;

    当然 我们也可以用默认的一些config:

    #make defconfig            //常用  默认设置;

    #make allyesconfig       // 全选 汗

    #make allnoconfig         //全不选 更汗 

    后两个不要随便用啊….. 高手就不用理我了…

    设置好配置文件后,就可以进行编译了。

    //一下步骤强烈不建议现在使用 仅作介绍,最好看完后文步骤后在进行。因为内核编译十分的费时间+空间(Disk空间)

    #make zImage     编译小内核

    #make bzImage   编译大内核

    #make modules   编译内核中选择的模块

    #make module_install 编译好的模块转移到标准位置

    #make install        安装内核

    # make                  完整编译

    //————————————————————-

    到此 Makefile的相关内容就介绍完了,其实Makefile很强大 我们甚至可以自己写Makefile文件 详细的请参考引用的参考文献:

    本文的很多内容无耻的引用于此:

      http://www.stlchina.org/twiki/bin/view.pl/ScriptProgram/LearnMakefile#saUhuTfg0njOg

      请大家多去参观。

    anyShare分享到: U盘中打造属于自己的Linux (三) :内核编译(上)MakeFile
              
    05-28
    2009
    loading...