U盘中打造属于自己的Linux (三) :内核编译(上)MakeFile
作者: 西玛哒 分类: IT悟语, Linux, 老西常谈 标签: 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 命令 将遵照以下步骤执行:
- make会在当前目录下找名字 叫“Makefile”或“makefile”的文件。如果找到,它会找文件中的第一个目标文件(target),并把这个文件作为最终的目标文件。
// 为了更好的说明这一点 以刚刚打开的Makefile文件为例,
在第835行 我们找到这样一句:
不出我们所料,是之前讲过的vmlinux 镜像文件,我们编译的产品就是它了。
- 如果vmlinux文件不存在,或是其所依赖的后面的 .o 文件的文件修改时间要比这个文件新,那么,他就会执行后面所定义的命令来生成这个文件。
- 如果所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
- 当然,你的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的窗口出现:
可以看出 我们可以用选项控制内核的编译内容,最后形成一个.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分享到: | |
| |





