编译自己的程序到openwrt固件中去

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

首先说说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文件夹下面。

你可能感兴趣的:(Linux)