阅前声明:此文转至:吵吵博客http://chaochaoblog.com/archives/1011,感谢吵吵博客博主整理
PS:百度无果,遂谷歌,发现此篇奇文,遵原博主规则转之~
我想你大概已经熟悉了在openwrt下方便的安装程序了,即opkg install这个命令已经熟悉了。很多时候我们只会找网上的ipk的包下载下来安装,却不知到这个包到底有什么神秘的地方,如何才能将我们自己写的一个 程序编译成一个ipkg的包呢,或者将linux平台下的其他软件编译成一个ipkg的包呢?再或者,如何将我们的程序编译进固件的镜像文件中去呢,这篇 日志将会给大家一个解答。
在此之前,你需要知道openwrt的基本知识,和交叉编译的知识:
编译 openwrt -dreamBox系统 超详细教程
首先说说ipk包是怎么来的吧,既然作为openwrt的标准的包,就如我们平常在android上的包程序一样,只能被相应的系统识别的,即只能是应用 于openwrt了。那么怎么才能做出这个包来呢,意识可以利用sdk来进行编译,而是当你搭建好了openwrt后直接使用make package/smustar V=99 就可以编译出来我们的包了,还有就是menuconfig中选择M则只会编译出ipk包来但是不会编译进固件中去。
这些个包有什么用呢,为什么不直接像linux中那样用makefile直接解决呢,因为这个路由系统和其它的有点不同么,比如要搞个config文件,ipk包做的其实就是这个事情。
线面我们来看看这么写一个包,并编译出来,以我们的smustar为例。我们先在编译环境文件夹下进入package这个文件夹,翻翻看看就知道,这里面就是其它软件的未编译的包的源文件件了,那么一个源文件的包需要什么呢
1、建立一个文件加smustar,这个当然必要,就如同建立这个包了。
2、下面建立一个src的文件夹,将我们的smustar的c文件都拷贝过去,包括makefile。如果你是想移植一下其它的软件呢,你也可以下载其它软件的源文件防盗这个里面去。
3、建立一个files文件夹,里面装有smustar.conf–用来保存密码的 smustar.init–开机启动的加载脚本。
4、建立makefile文件,这个很重要,menuconfig靠这个makefile来识别并显示出来,而且靠它来编译出我们要的包来:
这是msutar的makefile(不是src里面的,是放在smustar文件夹下的,用来编译ipk的)
include $(TOPDIR)/rules.mk PKG_NAME:=smustar PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk —— define Package/smustar SECTION:=utils CATEGORY:=Utilities TITLE:=smustar — prints a snarky message endef —— define Package/smustar/description If you can’t figure out what this program does, you’re probably brain-dead and need immediate medical attention. endef ———— define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef ———– define Package/smustar/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/sbin/ $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/smustar.init $(1)/etc/init.d/smustar $(INSTALL_DIR) $(1)/etc/config $(INSTALL_CONF) ./files/smustar.conf $(1)/etc/config/smustar endef
我把它分割成了五段:
第一段:以定义一下这个包的一些常规的东西,比如版本啊,名字啊,其实还有下载地址和md5校验值我没写的,你可以到官网看看,一大堆,如果有网址的话它就可以从网上下载源码了,保存在dl文件夹中,我们这里是没有的,自己写的程序哈,没上传到网上就先不写了,。
第二段:这个就是menuconfig显示出这个包来必要的参数了,按照如上定义,你输入 make menuconfig 然后到Utilities中就可以看到我们的smustar包了,然后你可以选择编译、编译到固件中去、或者不编译了。
第三段:一个描述而已,无它。
第四段:这是个准备工作,系统会在编译前先执行prepar的,我做了什么,就是把src文件夹即我们的源码拷贝到编译文件夹下去。这里你也可以定义编译的cc编辑器或者cflag什么的,或者你想做其它的也行。
第五段:这个就是正题了,它做了什么:将编译好的smutar程序拷贝到系统/usr/sbin文件夹下面,这样子程序命令直接打smustar就 行了。将smustar.init拷贝到/etc/init.d/smustar 加载开机启动罗。smustar.conf 拷贝到/etc/config/smustar 这个是程序保存帐号密码的配置文件的。其实这里你可以尽力的写些你需要的,如拷贝个so的库到lib文件夹下去等等,这里你就看出来了为什么要封装ipk 包了,因为有特殊需要是吧。
好了,至此包的源码完成,你可以到menuconfig中看到smustar了,然后果断按y选择编译到固件中去,之后编译…….
falsh后就发现程序已经在/usr/lib下了。当然,在你电脑上的bin/bcm63xx/package下面也有编译好的ipk文件,你可以上传到路由器中并用opkg命令安装。
至此次工作完成,不想搞交叉编译环境的童鞋可以让人发个sdk给你,这样子可以编译出ipk的包来,当然编译不了bin镜像了。sdk怎么弄到,人家有编译环境的在menuconfig中可以选择编译sdk工具的,编译好了出现在bin文件夹下面。
好辛苦,手都打疼了,如果对您有用,动动您的鼠标支持我,你懂得!