配色: 字号:
【智能路由器】openwrt创建用户软件包
2016-09-22 | 阅:  转:  |  分享 
  
【智能路由器】openwrt创建用户软件包

openwrt根目录



先看看openwrt初次编译好后的目录结构:



如上图所示:

arvik_note:本人更改软件包记录笔记,不必理会。

include:存放.mk文件

build_dir:建立工具链时的临时目录,解压、编译、补丁等文件存放点

staging_dir:工具链的安装位置

target:平台相关代码及配置文件

dl:下载目录,编译期间从网上下载的数据包都会放在此目录,数据包会解压到build_dir目录下

package:包含了我们在配置文件里设定懂得所有编译好的软件包

feeds:执行./srcipts/feedsinstall后的缓存文件存放点

bin:对应平台编译好的二进制文件以及相关ipk文件



创建软件包



↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓以下内容摘自官方WIKI↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓



构建方法



openwrt靠Makefile文件来添加软件,Makefile文件最关键,一般来说它提供了下载、编译、安装这个软件包的步骤。

这里Makefile的格式跟一般的Makefile不一样,因为它的功能跟普通Makefile就是不一样的。它是一种编写方便的模板。

以package/bridge/Makefile文件为例:



include$(TOPDIR)/rules.mk



PKG_NAME:=bridge

PKG_VERSION:=1.0.6

PKG_RELEASE:=1



PKG_BUILD_DIR:=$(BUILD_DIR)/bridge-utils-$(PKG_VERSION)

PKG_SOURCE:=bridge-utils-$(PKG_VERSION).tar.gz

PKG_SOURCE_URL:=@SF/bridge

PKG_MD5SUM:=9b7dc52656f5cbec846a7ba3299f73bd

PKG_CAT:=zcat



include$(INCLUDE_DIR)/package.mk



definePackage/bridge

SECTION:=base

CATEGORY:=Network

TITLE:=Ethernetbridgingconfigurationutility

#DESCRIPTION:=Thisvariableisobsolete.usethePackage/name/descriptiondefineinstead!

URL:=http://bridge.sourceforge.net/

endef



definePackage/bridge/description

Ethernetbridgingconfwww.sm136.comigurationutility

Manageethernetbridging;awaytoconnectnetworkstogetherto

formalargernetwork.

endef



defineBuild/Configure

$(callBuild/Configure/Default,--with-linux-headers=$(LINUX_DIR))

endef



definePackage/bridge/install

$(INSTALL_DIR)$(1)/usr/sbin

$(INSTALL_BIN)$(PKG_BUILD_DIR)/brctl/brctl$(1)/usr/sbin/

endef



$(eval$(callBuildPackage,bridge))



软件包变量



建立一个软件包不需要太多工作;大部分工作都隐藏在其它的makefiles中,编写工作被抽象成对几个变量的赋值。



PKG_NAME-软件包的名字,在menuconfig和ipkg显示

PKG_VERSION-软件包的版本,主干分支的版本正是我们要下载的

PKG_RELEASE-这个makefile的版本

PKG_BUILD_DIR-编译软件包的目录

PKG_SOURCE-要下载的软件包的名字,一般是由PKG_NAME和PKG_VERSION组成

PKG_SOURCE_URL-下载这个软件包的链接

PKG_MD5SUM-软件包的MD5值

PKG_CAT-解压软件包的方法(zcat,bzcat,unzip)

PKG_BUILD_DEPENDS-需要预先构建的软件包,但只是在构建本软件包时,而不是运行的时候。它的语法和下面的DEPENDS一样。

PKG_变量定义了从何处下载这个软件包;@SF是表示从sourceforge网站下载的一个特殊关键字。md5sum用来检查从网上下载的软件包是否完好无损。PKG_BUILD_DIR定义了软件包源代码的解压路径。



注意到上面示例文件底部的最后一行吗?这是最为关键的BuildPackage宏。它是在$(INCLUDE_DIR)/package.mk文件里定义的。BuildPackage宏只要求一个参数,即要编译的软件包名,在本例中是”bridge”。所有其他信息都通过宏来获得,这提供了一种内在的简洁性。比如BuildPackage需要软件包的一大串描述信息,我们并不要向它传递冗长的参数,因为我们已经约定描述信息定义在DESCRIPTION宏,BuildPackage从里面读取就可以了。



BuildPackage相关的宏



Package/

描述软件包在menuconfig和ipkg中的信息,可以定义如下变量:

SECTION-软件包类型(尚未使用)

CATEGORY-menuconfig中软件包所属的一级目录,如Network

SUBMENU-menuconfig中软件包所属的二级目录,如dial-in/up

TITLE-软件包标题

DESCRIPTION-软件包的详细说明

URL-软件的原始位置,一般是软件作者的主页

MAINTAINER-(optional)软件包维护人员

DEPENDS-(optional)依赖项,运行本软件依赖的其他包



Package/conffiles(可选)



软件包需要复制的配置文件列表,一个文件占一行



Build/Prepare(可选)



一组解包源代码和打补丁的命令,一般不需要。



Build/Configure(可选)



如果源代码编译前需要configure且指定一些参数,就把这些参数放在这儿。否则可以不定义。



Build/Compile(可选)



编译源代码命令。



Package/install



软件安装命令,主要是把相关文件拷贝到指定目录,如配置文件。



Package/preinst



软件安装之前被执行的脚本,别忘了在第一句加上#!/bin/sh。如果脚本执行完毕要取消安装过程,直接让它返回false即可。



Package/postinst



软件安装之后被执行的脚本,别忘了在第一句加上#!/bin/sh。



Package/prerm



软件删除之前被执行的脚本,别忘了在第一句加上#!/bin/sh。如果脚本执行完毕要取消删除过程,直接让它返回false即可。



Package/postrm



软件删除之后被执行的脚本,别忘了在第一句加上#!/bin/sh。



为什么一些定义是”Package/”前缀,另一些定义却是”Build”前缀?这是因为我们支持一个特性:从单个源代码构建多个软件包。OpenWrt工作在一个Makefile对应一个源代码的假设之上,但是你可以把编译生成的程序分割成任意多个软件包。因为编译只要一次,所以使用全局的”Build”定义是最合适的。然后你可以增加很多“Package/”定义,为各软件包分别指定安装方法。建议你去看看dropbear包,这是一个很好的示范。



提示:



对于所有在pre/post,install/removal脚本中使用的变量,都应该使用"$$"代替"$"。这是告诉make暂时不要解析这个变量,而是把它当成普通字符串以及用"$"代替"$$"。



在编辑好Makefile文件,并放到指定目录后,这个新的软件包将在下次执行makemenuconfig时出现,你可以选择这个软件包,保存退出,用make编译。现在就把一个软件成功移植到OpenWrt中了!



↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑以上内容摘自官方WIKI↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑



创建软件包arvik_hello



按照如下命令步骤:

先建一个软件集合的目录arvik_app



cd./packet

mkdirarvik_app

1

2

在arvik_app目录下建立arvik_hello目录



cd./arvik_app

mkdirarvik_hello



接着在arvik_hello中建立src目录和Makefile文件



cd./arvik_hello

mkdirsrc

touchMakefile



该处Makefile文件内容如下,可参照上面软件包变量读懂每句含义,在此不赘述。需要注意的是代码里每行行末是没有空格的,否则可能会出错。好了,openwrt就靠这个Makefile来添加我们的arvik_hello软件包了。



#########################################

#author:arvik

#email:1216601195@qq.com

#csdn:http://blog.csdn.net/u012819339

#########################################



include$(TOPDIR)/rules.mk





ARVIK_APP_DIR:=arvik_app



PKG_NAME:=arvik_hello



PKG_VERSION:=1.0.0



PKG_RELEASE:=1



PKG_BUILD_DIR:=$(BUILD_DIR)/$(ARVIK_APP_DIR)/$(PKG_NAME)



include$(INCLUDE_DIR)/package.mk



definePackage/$(PKG_NAME)

SECTION:=Utilities

CATEGORY:=Arvik_Applications

TITLE:=aTestProgramofferbyarvik

MAINTAINER:=arvik

endef



definePackage/$(PKG_NAME)/description

ThisisatestprogramthatprovidesaMAkefiletemplate!

endef



defineBuild/Prepare

mkdir-p$(PKG_BUILD_DIR)

$(CP)./src/$(PKG_BUILD_DIR)/

endef



defineBuild/Configure

endef



definePackage/$(PKG_NAME)/install

$(INSTALL_DIR)$(1)/usr/bin

$(INSTALL_BIN)$(PKG_BUILD_DIR)/$(PKG_NAME)$(1)/usr/bin/

endef



$(eval$(callBuildPackage,$(PKG_NAME)))



下面就进入src目录来建立我们软件源文件和Makefile文件了。



cd./src

touchhello.c

touchMakefile

1

2

3

hello.c内容如下:



#include



intmain()

{

printf("arvikhelloworld!\n");



return0;

}



此处Makefile文件内容如下:



#########################################

#author:arvik

#email:1216601195@qq.com

#csdn:http://blog.csdn.net/u012819339

#########################################



EXEC:=arvik_hello

SRC:=hello.c



all:$(EXEC)

$(EXEC):$(SRC)

$(CC)$(CFLAGS)$(LDFLAGS)-o$@$(SRC)$(LDLIBS)



.PHONY:clean

clean:

-rm-f$(EXEC).elf.gdb.o



检验软件包



makemenuconfig



退回openwrt根目录,执行makemenuconfig,找到Arvik_Applications选项,进入



重新编译一次即可(或者单独只编译一次arvik_hello即可,命令makepackage/arvik_app/arvik_hello/compileV=99)。



运行arvik_hello



root@OpenWrt:/#arvik_hello

arvikhelloworld!



成功!



献花(0)
+1
(本文系网络学习天...首藏)