Openwrt:创建编译IPK软件包

一、概述

  • 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 

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) 代表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添加权限。
  • 更多详情参考文档:

你可能感兴趣的:(OpenWrt)