一、概述
- openwrt 一个比较重要的特点就是它采用 ipk 包的形式安装软件。有点像是 windows 下面的安装包一样,用户只需用简单的命令就可以将 ipk 安装包安装到 openwrt 系统中,非常方便。
- ipk软件包编译固件两种方式:
① 与固件捆绑:所编译出的软件包直接捆绑在固件中,不用独立安装。
② 模块软件包:所编译出的软件包不捆绑在固件中,需要通过OPKG命令进行安装。
- 获取ipk软件包两种方式:
① 官网下载 opkg update 或 https://archive.openwrt.org/chaos_calmer/15.05.1/ramips/
② 自己创建
二、常用OPKG命令
- 安装ipk包
opkg install xxxxx.ipk
- 卸载ipk包
opkg remove xxxx.ipk
- 从官网更新可以安装的ipk软件列表
opkg update
- 列出可以安装的ipk包
opkg list
- 列出已经安装ipk包
opkg list-installed
- 更多详情参考
opkg --help
三、IPK软件包创建编译
3.1 简单目录文件创建(参考网上例程)
- ./src/Makefile
all: hello_world
hello_world: hello_world.o
$(CC) $(LDFLAGS) hello_world.o -o hello_world
helloworld.o: hello_world.c
$(CC) $(CFLAGS) -c hello_world.c
clean:
rm *.o hello_world
- ./src/hello_world.c
#include <stdio.h>
int main(char argc, char *argv[])
{
int i = 1;
while(1) {
//1~10 循环
printf("Hello world!!!%d\n",i); //打印内容
if (i < 10) {
i++;
} else {
i = 1;
}
sleep(1);// 一秒钟打印一次
}
return 0;
}
3.1.1 顶层Makefile设计
# 引入头文件 rules.mk
include $(TOPDIR)/rules.mk
# 设置PKG_*变量
PKG_NAME:=hello_world
PKG_VERSION:=1.0
PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)
# 引入头文件 package.mk
include $(INCLUDE_DIR)/package.mk
# 定义hello_world信息
define Package/hello_world
SECTION:=base
CATEGORY:=Utilities
TITLE:=Hello world -prints a hello world message
endef
# 定义hello_world说明
define Package/hello_world/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
# 定义hello_world安装什么
define Package/hello_world/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/hello_world $(1)/bin/
endef
# hello_world脚本处理完毕,调用
$(eval $(call BuildPackage,hello_world))
- PKG_* 作用:
- 检测软件包是否被选中。
- 软件包如果有需要下载的源码,按PKG_SUORCE_URL 进行下载。
- 检测本地dl/目录是否包含了源码文件 PKG_SOURCE。
- 如果需要检验源码,就执行PKG_MD5SUM。
- 解压缩源码。
- 常用变量:
- PKG_NAME: 软件包名称,在菜单项中将看见,必须与目录名称一致。
- PKG_VERSION:软件包版本,如果软件包的源码是在线下载的,版本号要与服务器上的一致。
- PKG_RELEASE: 软件包的Makefile版本,自己设定。
- PKG_BUILE_DIR:软件包的编译过程目录名字,这个要与源码解压完以后生成的目录名字一样,否则就找不到源码了。
- PKG_SOURCE:软件包源码文件的名字。
- PKG_SUORCE_URL: 软件包源码的下载地址,若为空则从dl/目录下寻找。
- PKG_MD5SUM:对下载的软件包进行校验。
- PKG_CAT:指定使用哪个解压工具(zcat,bzcat,unzip)。
- PKG_BUILD_DEPENDS:软件包编译的时候依赖哪个其他软件包。
- PKG_SOURCE_PROTO:通过代码仓库获得代码git,svn。
- PKG_REV:如果是通过svn获得代码,这表示svn版本号。
- 定义Build/* 作用:
- 定义的预处理方法。
- 配置时的处理方法。
- 编译时的处理方法。
- 编译安装时的处理方法。
- 安装库文件的处理方法。
- Build选项:
*Build/Prepare:用于解包及打补丁的命令
*Build/Configure:如果源代码不需要configure来生成Makefie或者是通用的
- configure脚本,就不需要这部分。否则就需要你自己的命令脚本或使用$(call Build/Configure/Default, FOO=bar) 增加额外的参数传递给configure 脚本
- *Build/Compile:编译源代码,在大多数情况下应该不用定义而使用默认值。如果你想传递给make特定的参数,可以使用$(call Build/Compile/Default, FOO=bar)
- *Build/Install:安装编译后的文件,默认是调用make install, 如果需要传递指定的参数,使用$(call Build/Install/Default, install install-foo)。注意你需要传递的参数,要增加在 install
参数后面,不要忘了 install 参数- *Build/InstallDev: 例如静态库和头文件等
- 定义Package/* 作用:
描述软件包的一些情况,用于菜单选项使用。
定义软件包安装在设备上的时候安装哪些软件。 安装之前的处理脚本。 安装之后的处理脚本。 卸载之前的处理脚本。 卸载之后的处理脚本。
常用变量: SECTION:软件包的类型,如:network、Sound、Utilities、Multimedia等 GATEGORY:
软件包所属的菜单项选项中的菜单,值既可以是已经有的分类,也可以是自己的一个新分类。已经有的分类可以参考同类别软件包的GATEGORY写法。
TITLE:软件包显示的名称。 URL:软件包来源公司网站。 MAINTAINER:软件包的维护者信息。
DEPENDS:软件包依赖哪些软件包,被依赖的软件包会自动选中。 USERID:软件包安装的时候生成账号和组。格式为:账号/值。
Package包选项: Package/<>: 定义软件包的描述信息,例如网站地址和menuconfig中的菜单的分类等
Package/<>/description: 软件包的详细描述 Package/<>/install: 复制文件到ipkg目录中,使用 ( 1 ) 代表 i p k g 目录,在源码中使用相对目录。编译生成的安装文件同 (1) 代表ipkg目录,在源码中使用相对目录 。编译生成的安装文件同 (1)代表ipkg目录,在源码中使用相对目录。编译生成的安装文件同(PKG_INSTAALL_DIR)目录下
*Package/<>/Default: 软件包的默认选项
*Package/<>/config: 根据软件包的选择对编译选项进行定义
*Package/<>/conffiles: 定义本软件包的运行配置文件列表,一行一个文件
*Package/<>/preinst: 安装前执行的脚本(记得添加 #!/bin/sh)
*Package/<>/postinst: 安装后执行的脚本(记得添加 #!/bin/sh)
*Package/<>/prerm: 删除前执行的脚本(记得添加 #!/bin/sh)
*Package/<>/postrm: 删除后执行的脚本(记得添加 #!/bin/sh)
注: * 表示 可选,其他表示 必选。
3.2 编译安装
- ① 在openwrt源码根目录,执行
- make menuconfig
- 在执行make
menuconfig的时候,openwrt机制(有兴趣可以阅读源码的一些相关Makefile,了解编译机制)会自动去搜寻package/utils/
所有文件,然后根据hello_wolrd顶层Makefile中的信息自动将hello_world添加进入菜单中。 - ② 在菜单中选中 ,保存退出
Utilities--->
<M> hello_world.................... Hello world -prints a hello world message
- 注: 将软件编译成ipk包,单独存放在openwrt/bin/ramips/packages/base/* 目录下;<*>将软件包编译进入内核固件中。
- ③ 编译生成ipk包:
- 全部编译: make V=s (速度慢,时间长);
- 单独编译: make package/utils/hello_world/compile V=s(时间短,方便调试)
- ④ 拷贝ipk包到板子上,执行:
opkg install /拷贝目录/hello_world_1.0_ramips_24kec.ipk
- ⑤ 安装完成后,在串口终端输入:
hello_world
- 注:如果未执行成功,查看hello_world是否有可执行权限,没有则用chmod +x hello_world添加权限。
- 更多详情参考文档: