又到了成胖子每周一博的时间了,本周是第三周.
本周咱们继续了解openwrt
的编译过程,若是还有没写过简单ipk或者编译过openwrt的朋友,能够参见我以前的博客或者网上的其余文章shell
为何我在学习的过程当中,有先学习整个编译过程和Makefile的冲动呢?bash
1.咱们知道电脑的运算速度是很快的.即便如此,一个完整的编译过程每每须要好几个小时.这中间到底发生了些什么?屏幕上一闪而过的像天书同样的东西,我怎么才能有所了解?
2. 经历漫长的等待,咱们获得了一个镜像bin文件.这里面到底包含了什么东西?我能够知道么?
3. 编译单个ipk的时候,我按照模板写的Makefile怎么和我在书上见的长的不太同样呢?
4. 在单个ipk中,怎么包含头文件,动态库,静态库?怎么解决依赖关系?
5. 在输入make menuconfig
以后,又发生了什么?弹出的图形界面中,怎么会有我放在package
目录中的源码的信息?
6. 有的时候,编译报错了.提示信息它认识我,我不认识它.我要怎么排查呢?
…markdown
零零散散的老是有不少疑问困扰着我.我相信有不少刚接触openwrt
的朋友都和我有同感.而全部这些都是能够经过完整学习编译过程来解答的.这样想一想是否是更有学习的动力了呢?工具
咱们知道编译过程是经过Makefile来控制的.这样而言,Makefile的基本语法就必须有所了解.网上有不少零散的资料每每不成体系.推荐阅读一个是陈皓本身写的和翻译的GNU Make的手册.仍是比较全的.英文还凑合的朋友,我推荐仍是尽力读读官方的手册,简介精炼,没事学点英文也是好的.后面的文章,假定读者对Makefile有所了解.学习
Makefile中的执行部分(recipe)是有bash脚本组成的,因此咱们同时应当对bash shell有所了解.flex
有了这两部分的预备知识,咱们将开始咱们的征途.咱们的目标是world.ui
在学习Makefile以前,咱们先对编译的整体过程,有个感性的认识,请看下图:es5
在编译源码以前,咱们必须手动安装一部分工具 .spa
sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev
这部分是在执行编译工做以前的..net
除了咱们在第一步安装的工具,编译过程当中还须要其余一些主机工具.这部分工具将首先编译.
openwrt
自带交叉编译链,固然在编译目标平台软件前,须要先编译.
由于部份内核模块将会生成独立的ipk,因此内核模块须要首先编译.
这里将编译package
目录下的各个软件包,这也是和咱们最为息息相关的.以后的博客将会重点介绍这个部分.
将生成的ipk安装到文件系统之中(好比build_dir/target-XXX/root-ramips目录).
在完成ipk编译以后,将会编译内核,压缩内核.同时使用mkimage工具,在内核前面生成一个用于uboot识别的头部.
在最后一步,将squashfs格式的文件系统和内核链接在一块儿,即生成了目标镜像文件.
本周到此为止,下一篇咱们将介绍根目录下的Makefile,从而知道为何编译的大体过程是上面说起的八步.