OpenWrt固件编译
一.准备阶段
1.首先你先得有个Linux环境,我使用的是Ubuntu14.04系统。然后把系统的下载源更新一下,这样接下来下载软件会快很多。
更新源参考: http://chenrongya.blog.163.com/blog/static/8747419620143185103297/
2.安装一下辅助用的必需软件包
sudo apt-get install g++
sudo apt-get install libncurses5-dev
sudo apt-get install zlib1g-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install unzip
sudo apt-get install autoconf
sudo apt-get install gawk
sudo apt-get install make
sudo apt-get install gettext
sudo apt-get install gcc
sudo apt-get install binutils
sudo apt-get install patch
sudo apt-get install bzip2
sudo apt-get install libz-dev
sudo apt-get install asciidoc
sudo apt-get install subversion
sudo apt-get install sphinxsearch
sudo apt-get install libtool
sudo apt-get install sphinx-common
sudo apt-get install mercurial
二. 下载openwrt 源码并且编译
这一步是最关键的,无论是固件编译或者是软件包Ipk的编译都要经过这一步。当然,这一步也是最复杂的最容易出错的。
1.下载源码
源码分为好几个版本,有开发板Trunk和稳定版本,新手强烈建议用稳定版,因为Trunk版有bug容易出错。这里使用的是14.07 branch (Barrier Breaker) ¶
下载链接见:https://dev.openwrt.org/wiki/GetSource
mkdir openwrt
cd openwrt
git clone git://git.openwrt.org/14.07/openwrt.git
下载完的源码大概如下图所示:
2.更新扩展,安装扩展
./scripts/feeds update -a
./scripts/feeds install -a
3.检查编译环境
make defconfig
4.进入配置界面定制固件和组件
这个步骤是最容易困惑新手的 ,下边会详细介绍细节。
make menuconfig
运行上边这条命令之后,便会弹出一个配置界面,在这个配置界面,用户可以自定义勾选自己所需要的组件,像Web管理界面--->Luci,像抓包工具--->iwcap,像网卡管理工具--->iw,等等;除此之外,用户还可以勾选是否编译开发可以用到的SDK包,还可以选择平台的芯片等等。
在每个选项前,勾选M表示编译但不固化到固件里边,勾选*表示编译并且固化到固件里边。
例如下图,我是在 TP-LINK TL-WR703N上做开发,
于是我的Target System 选择了(Atheros AR7XXX/AR9XXX),Subtarget选了Generic,Target Profile 选了 TP-LINK TL-WR703N;
另外,由于我想用到SDK,所以顺便也勾选了Build the Openwrt SDK ;
同时,由于需要用到web管理界面,所以我在LuCI下边也勾选了luci;
需要用到抓包工具iwcap,所以在Utilities下勾选了
总之,按照自己的需要去勾选相应的选项就是了。
5.开始编译
编译是一个漫长曲折的过程,期间需要从网上下载大量的软件源码到本地,要命的是这些软件源码都是国外的网站上的,没办法只能翻墙了。怎么翻墙这个你懂的。
编译你可以直接
make 或者 make V=s 或者 make V=99 (他们的区别无意深究)
或者编译并且打印一些log信息 (建议)
make -j1 V=99
第一次编译一般要花两到三个小时,第二次之后就快了,因为软件包都下载好了= = 。
编译过程往往遇到很多问题,注意看编译中断后打印的log信息,一般会提示一些error,然后自己寻藤摸瓜看看问题,一般都是系统少了某个软件(例如hg)、网络太差、VPN断了等等原因。。。
上边说的是标准的编译流程,下边说点投机取巧的事儿。
其实为啥编译耗时这么长,无非就是下载软件包太特么慢了。而所有的软件包都是放在源码的dl目录的。所以,你可以做这些事:
1)编译成功后及时备份自己的dl目录,以后要编译什么就省事啦;
2)自己手动新建dl目录,然后直接复制别人的dl目录过来用,他山之石可以攻玉 = =
6.编译结束
等你最后看到这个画面,恭喜你成功了~~
然后你所需要的固件在 openwrt/bin/下边,包括 xxxxx.factory.bin 和 xxxxx.sysupgrade.bin 两个包,至于这两个包怎么刷进板子上,网上这种教程一大把。
另外你所需要的SDK包也在 openwrt/bin目录下边,是一个 xxxxx.tar.bz2 的压缩包。
另外你所需要的软件安装包IPK文件也在这个目录下,具体自己搜索下就可以找到了。说了这么多废话。。。
如图:
两个固件包和SDK包
ipk包
下边再细说下 软件安装包ipk的编译方法
方法主要有两种:1) SDK编译 2)源码编译
1.SDK编译软件安装包IPK
从上边的教程我们已经可以看到怎么去获得SDK包了,然后怎么使用这个包,看教程:
http://my.oschina.net/hevakelcj/blog/410633
这个教程已经详实地介绍了编译的步骤,步骤是没有问题的。但是!SDK编译比较坑,就算你完全正确,他就是给你报错,我就死在了下图这个错误上:
意思是makefile 32行前边少了个Tab,但是无论是怎么改,他就是报错 = = 所有努力都是徒劳无意义的。
同样的代码同样的makefile,在用源码编译的方法是完全可行的。
所以,强烈采用源码编译而不是SDK编译。
2.源码编译软件安装包IPK
前边的教程已经讲到怎么编译出ipk包了,其实就是那个步骤,下边讲讲怎么写自己package,下边以helloworld为例:
先创建自己的包目录,以及外层makefile:
mkdir helloworld
cd helloworld
mkdir src
vi makefile
然后在这个makefile里边填写如下内容,(内容可以参考官网的说明)
include $(TOPDIR)/rules.mk
# Name and release number of this package
PKG_NAME:=helloworld
PKG_RELEASE:=1
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/helloworld
SECTION:=utils
CATEGORY:=Utilities
TITLE:=helloworld -- prints a snarky message
endef
# Uncomment portion below for Kamikaze and delete DESCRIPTION variable above
define Package/helloworld/description
It is Duval`s demo.
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
#define Build/Compile
# $(MAKE) -C $(PKG_BUILD_DIR) \
# $(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include"
#endef
define Package/helloworld/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin/
endef
$(eval $(call BuildPackage,helloworld))
然后 进入src,去编写helloworld.C
cd src
vi helloworld.c
helloworld.c 里边填写
#include<stdio.h>
int main(void)
{
printf("yyyy\n");
return 0;
}
为helloworld.c编写makefile
vi makefile
makefile 里边填写
# build helloworld executable when user executes "make"
helloworld: helloworld.o
$(CC) $(LDFLAGS) helloworld.o -o helloworld
helloworld.o: helloworld.c
$(CC) $(CFLAGS) -c helloworld.c
# remove object files and executable when user executes "make clean"
clean:
rm *.o helloworld
然后把 这个helloworld的package包拷贝到源码的./package目录下边。
然后运行
make defconfig
make menuconfig
然后在 menuconfig的菜单中找到helloworld,具体是菜单那里,就看你外层makefile怎么写的。然后找到后在前边勾选M ,表示仅编译不固化到固件中。
然后运行编译
make -j1 V=s
最后在bin目录下可以找到自己要的ipk包。