该文章所涉及到的知识都来自OpenWrt Wiki官网。OpenWrt的软件编译模板系统使软件移植到OpenWrt变得非常简单,如果在一个典型的package目录下,我们可以发现3个东西:package/Makefile,package/patches,package/files。
package/patches:目录不是必须的,一般是为了bug修复和减少目标文件的尺寸。
package/Makefile:是必须存在的,它提供了下载和编译package实际所需的步骤。
package/files:package需要用到的文件(不是.c和.h文件)。
例子如下:
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_HASH:=9b7dc52656f5cbec846a7ba3299f73bd
include $(INCLUDE_DIR)/package.mk
define Package/bridge
SECTION:=base
CATEGORY:=Network
TITLE:=Ethernet bridging configuration utility
#DESCRIPTION:=This variable is obsolete. use the Package/name/description define instead!
URL:=http://bridge.sourceforge.net/
endef
define Package/bridge/description
Ethernet bridging configuration utility Manage ethernet bridging; a way to connect networks together to form a larger network.
endef
define Build/Configure
$(call Build/Configure/Default,--with-linux-headers=$(LINUX_DIR))
endef
define Package/bridge/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/brctl/brctl $(1)/usr/sbin/
endef
$(eval $(call BuildPackage,bridge))
package的名称。避免在包名称中使用下划线,否则可能导致难以发现的错误,导致编译失败。
我们要下载的package的版本号。
package的Makefile的版本。
编译package的路径。
原始源的文件名,一般是tarball包。
从什么地方下载源文件。
下载源的checksum,用来校验该包是否是官方的。
解压源的方式(zcat,bzcat,unzip)。
需要在此包之前构建的包,如果需要确保包在生成时有权访问另一个包,要使用该选项,指定目录名称(例如openssl),而不是二进制包(libopenssl)。此构建变量仅建立构建时依赖项。使用DEPENDS建立运行时依赖项。
指定哪些配置选项会影响生成配置,并应触发Build/Configure的重新运行
SECTION:软件包的类型,当前未被使用。
CATEGORY:出现在menuconfig中的哪个菜单。
TITLE:软件包的简短描述。
DESCRIPTION:(已弃用)包的详细描述。
URL:下载原始软件包的链接。
MAINTAINER:软件包的维护者。
DEPENDS:可选的,编译该软件包前哪个软件包必须被编译和安装。
EXTRA_DEPENDS:可选的,运行时依赖项,不构建,仅添加到CONTROL文件中。
此包安装的配置文件列表,每行一个文件。文件列表部分不应缩进:部分中没有前导制表符或空格。
软件包的描述。
一组解压或patch源的命令,你可以放心地将其保留为未定义。
如果源不使用配置或具有正常的配置脚本,则可以将其保留为未定义。否则你可以在此处放置configure命令或使用$(call Build/Configure/Default)。
如何编译源代码,在大多数情况下,应该将其设置为未定义。
如何安装已编译的源代码。
针对编译软件包(静态库,头文件)所需的文件,但在目标设备上没有用。
对于要清理过程中需要清除的东西。
一组命令,用于将文件复制到由 $(1)目录表示的 ipkg 中。作为源代码,您可以使用将从解压缩和编译的源代码安装的相对路径,或者$(PKG_INSTALL_DIR),这是上面步骤中Build/Install的文件结束的地方。
某些定义以"Package/"为前缀,而其他定义只是"Build"的原因是可以从单个源生成多个包。OpenWrt在假设每个包Makefile一个源的情况下工作,但你可以根据需要将该源拆分为任意数量的包。由于你只需要编译一次源代码,所以有一个全局集合"Build"定义,但你可以通过向BuildPackage添加额外的调用来添加任意数量的"Package/"定义 - 参见dropbear包的例子。
本文总结了OpenWrt BuildPackage的变量和宏以及他们的详细的使用方法。