吵吵   2011-12-05  阅读:12,818

我想你大概已经熟悉了在openwrt下方便的安装程序了,即opkg install这个命令已经熟悉了。很多时候我们只会找网上的ipk的包下载下来安装,却不知到这个包到底有什么神秘的地方,如何才能将我们自己写的一个程序编译成一个ipkg的包呢,或者将linux平台下的其他软件编译成一个ipkg的包呢?再或者,如何将我们的程序编译进固件的镜像文件中去呢,这篇日志将会给大家一个解答。

在此之前,你需要知道openwrt的基本知识,和交叉编译的知识:
ubuntu下搭建openWrt的编译环境
首先说说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文件夹下面。

好辛苦,手都打疼了,如果对您有用,动动您的鼠标支持我,你懂得!

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

7条回应:“编译自写程序smustar到openwrt固件中去”

  1. 邯郸seo说道:

    文章很喜欢,支持博主!

  2. 大学便民网说道:

    考研都快到了 你怎么还有时间折腾这个呢?

  3. 古美人说道:

    这个openWrt真的很好哦 支持博主

  4. jingle说道:

    根据博主提供的方法,我也成功的编译了ipk文件。
    这里有个问题请教博主,我想将/etc/config/network这个配置文件编译到固件中。在openwrt的wiki上
    http://wiki.openwrt.org/doc/howto/buildroot.exigence
    说,将配置文件放置到如下目录:
    /files/etc/config
    也就是说我在openwrt的源码根目录创建
    files/etc/config/network,然后直接编译固件,就可以了吗?
    对于其他的包我了解,比如transmission包,我知道修改package/feeds/packages/transmission/files下的配置文件就可以。但是network我不清楚这个包在什么位置。
    请问博主如何处理这个问题。多谢

  5. Nedved.YY说道:

    hi 你好,请问你们接受 open wrt的外包吗?如有兴趣,请email我: nedved.yang@gmail.com谢谢杨先生

发表评论

电子邮件地址不会被公开。 必填项已用*标注