创建 package 指南
openwrt 的软件系统大多以 package 的形式构建,通过一个个的 package 将所需的软件集成到 openwrt 系统中。openwrt 定义了一套 package Makefile 模板,各软件按照模板定义自己的信息,如软件包的版本、下载地址、编译方式、安装地址等,来指导该软件源码的获取,编译,安装等工作,如果要添加自己开发的软件,或者移植 openwrt 没有的软件,就需要添加对应的 package 将其集成到 openwrt 中,以下是创建 package的方法:
在 package 目录下新建要添加的包的目录,可以放在子目录下,最多支持 3 级子目录。一个 package 必须包含 Makefile,可能有 Config.in,patches 目录,files 目录,src 目录等。
1 Makefile:
1.1 在第一行包含 rules.mk,这是 Makefile 的一些全局变量的相关定义include $(TOPDIR)/rules.mk
1.2 软件包的基本信息 PKG_NAME : 软件包的名字, 在 menuconfig 和 ipkg 显示 PKG_VERSION : 软件包的版本 PKG_RELEASE : 该 makefile 的版本 PKG_BUILD_DIR : 软 件 包 的 编 译 目 录 , 默 认 在 build_dir 下 , 名 字 为 PKG_NAME+PKG_VERSION PKG_SOURCE :要下载的软件包的名字,一般是由 PKG_NAME 和 PKG_VERSION 组成 PKG_SOURCE_URL :下载这个软件包的链接 PKG_MD5SUM :软件包的 MD5 值 PKG_CAT : 解压软件包的方法 (zcat, bzcat, unzip) PKG_BUILD_DEPENDS :需要预先构建的软件包,但只是在构建本软件包时,而不是运行的时候。它的语法和下面的 DEPENDS 一样。
1.3 包含 package.mk,定义了 package 的编译目标和规则
include $(INCLUDE_DIR)/package.mk
1.4 如果 package 源码使用 cmake 来生成编译脚本,则还要包含:
include $(INCLUDE_DIR)/cmake.mk
1.5 BuildPackage 相关的宏,使用 define 来定义: Package/<PKG_NAME> TITLE : 软件包标题 SECTION : 软件包类型(没有使用) CATEGORY : menuconfig 中软件包的位置 SUBMENU : menuconfig 中软件包所属的二级目录 DEPENDS : 依赖项,运行本软件依赖的其他包 URL : 软件的原始位置,一般是软件作者的主页 MAINTAINER : 软件包维护人员
Package/<PKG_NAME>/description 软件包描述信息
Build/Prepare 编译准备,默认调用Build/Prepare/Default将dl目录的源码包解压到PKG_BUILD_DIR,并为源码打 patch,对于非下载或自行开发的软件包要说明编译准备方法,比如将源码拷贝到 PKG_BUILD_DIR
Build/Configure 编译配置,没有特定的配置方法不需要定义,默认情况调用 Build/Configure/Default,如果源码存在 configure 文件,则会执行 configure 配置交叉编译参数,如果需要自定义配置选项,填写 CONFIGURE_ARGS 即可
Build/Compile 编译方法,没有特定的编译方法不需要定义,默认情况调用 Build/Compile/Default,执行源码中的 Makefile 或 cmake 来进行编译,自行开发的软件包如果有特定的编译方法可以在此定义
Build/InstallDev 将编译的结果,一般是库(.so,.a)和头文件,安装到 openwrt 编译环境的 rootfs 中,即 staging_dir/target-xxx,供其他 package 编译链接使用
Package/<PKG_NAME>/install 将目标文件,比如编译生成的可执行文件,动态库,配置文件等,安装到运行环境,即最终固件使用的 rootfs 中
1.6 软件包的实现 完成前面各项定义后调用 BuildPackage 宏实现完整 package 的定义,BuildPackage在$(INCLUDE_DIR)/package.mk 文件里定义,该宏只要求一个参数,即要编译的软件包名
$( eval $(call Package,<PKG_NAME>))
2 Config.in
Package 可以使用 Config.in 扩展编译配置选项,并通过 make menuconfig 来配置。按 Kconfig 语法编写 Config.in,并在 package 的 Makefile 引用:
define Package/<PKG_NAME>/config
source "$(SOURCE)/Config.in"
Endef
3 patches 目录
如果要修改源码,比如 bugfix 或者特定的优化,可以使用 quilt 创建 patch 文件放到 patches 目录下,在编译 package 时 openwrt 会将 patch 打到源码上
安装已有 patch: quilt push -a
创建新 patch,名称以数字开头,数字要比现有的 patch 都大,-后为描述信息: quilt new 001-new-patch.patch
编辑: quilt edit xxx.cc
查看 diff:quilt diff
更新修改到当前目录 patches/001-new-patch.patch,没有目录会自动创建: quilt refresh
Patch 创建好后,将其拷贝到 package 的 patches 目录即可。
4 files 目录
可以根据具体需求,在此存放配置文件,启动脚本,资源文件等,需在 Makefile 的 package/<PKG_NAME>/install 中拷贝到目标 rootfs
5 src 目录
自行开发的软件源码可以放在该目录,需要在 Makefile 的 Build/Prepare 中将源码拷贝到 PKG_BUILD_DIR,即 build_dir 目录下