openWRT自学---基于backfire版本,分析其Make命令的执行过程和各阶段的主要产物
准备阶段:从SVN下载backfire的编译环境(位置是:svn co svn://svn.openwrt.org/openwrt/branches/backfire),然后按照openWRT的要求,下载一堆编译用到的工具(通过make defconfig可以发现自己的OS缺啥,然后就补啥)。这样得到的是一个编译环境,在openWRT中,这个环境就是BuildRoot。
我们进入这个编译环境(简称:TOPDIR),接下来就是一步步的编译过程了:
1.构建“Package种子”,即
./scripts/feeds update -a ---- 这一步的结果是:产生$(TOPDIR)/feeds目录,存放的就是执行feeds.conf.default文件后的结果:从指定svn中下载的文件。
和
./scripts/feeds install -a ---- 这一步的结果是:在package目录中多了一个feeds目录,里面存放的子目录是到$(TOPDIR)/feeds目录的链接
两步动作
注意:在TOPDIR/Makefile中,有如下定义:
# update all feeds, re-create index files, install symlinks
package/symlinks:
$(SCRIPT_DIR)/feeds update -a
$(SCRIPT_DIR)/feeds install -a
那么,可以想见,上述两个也可以合并为一步,即make package/symlinks
2.make menuconfig,这一步就是我们熟悉的选择模块的可视化界面了。其对应的脚本是:toplevel.mk中的“menuconfig:” 目标
由于我编译的是针对BRCM53xx,故选择Target System为BRCM47xx/53xx。在目标平台选择好后,
下一步一定要先对Luci进行选择:选择要支持哪些配置页面。因为对Luci的选择就会一并将该页面对应的模块功能一起选择了(这是我在编译中总结的经验,防止模块之前的依赖关系出现偏差)。
其他的就自己选择吧。最后是save。
--- 这一步的结果是:产生了TOPDIR/.config文件(这是一个隐藏文件)。这个config文件中主要定义了:目标平台选择,linux内核版本选择(CONFIG_LINUX_2_6_32=y),一些default功能,目标文件系统(CONFIG_TARGET_ROOTFS_SQUASHFS=y),基本编译方法(Gcc的版本,uClibc的版本,BINUTILS的版本,等等),其他基本都是针对TOPDIR/package目录中实际选择要编译的各个package的选择定义了。可见,这个.config文件将用户态的东西都包括了,但是没有内核态的东西。内核态的config文件在哪里呢?
3.make kernel_menuconfig
首先,这不是openWRT编译固件的过程中必须要配置的一步。其对应的脚本是:toplevel.mk中的“kernel_menuconfig:”目标
这一步产生的是针对内核的配置界面,可以配置内核相关的功能。配置的结果,保存在:build_dir/linux-brcm47xx/linux-2.6.32.27/.config中
4.也是最后一个命令:make
这一步会执行一个N长时间的编译过程,其主要工作包括:
compile the toolchain -- 编译工具链
then crosscompile the sources with this toolchain --- 然后,利用编译出的工具链,来交叉编译源文件
create opkg-packages --- 创造可以通过opkg命令传入到CPE的软件包
generate a firmware image file ready to be flashed. --- 产生一个用于烧入CPE的firmware(疑问:这个firmare本身不带bootloader吧?)
上述过程,主要是通过主Makefile中的world: 目标来实现的
最新文章
- Asp.Net 操作XML文件的增删改查 利用GridView
- 订餐系统之微信支付,踩了官方demo的坑
- mysql - 数据库、表 的创建
- iOS网络-01-NSURLRequest与NSURLConnection
- linux编译中的常见问题
- pip error: command 'gcc' failed with exit status 1
- BZOJ 2301 Problem b(莫比乌斯反演+分块优化)
- ImageMagick wrapper for php
- 求刷Kindle Fire HD的方法
- 使用ArcGIS API for Silverlight + Visifire绘制地图统计图
- hash冲突随笔
- 读书笔记-你不知道的JS中-函数生成器
- Useful Git Commands for me
- mybatis基础(上)
- JavaScript学习-4——DOM对象、事件
- windows7安装flask-mysqldb遇到的坑
- Python 高级编程 ——观察者模式
- Markdown语法学习(二)
- Oracle 与Sql Server常用函数对比
- iOS开发多线程篇—GCD简介