*****************************************************************************************************
* 一个标准的Makefile包大概可以简化为如下结构: *
* include $(TOPDIR)/rules.mk *
* # 这里定义一系列的 PKG_XX *
* include $(INCLUDE_DIR)/package.mk *
* # 这里定义各种Package、Build宏 *
* $(eval $(call BuildPackage,包名)) *
*****************************************************************************************************
1. include $(TOPDIR)/rules.mk 就是将openwrt顶层目录下的rules.mk文件中的内容导入进来
其中 TOPDIR := $(CURDIR) # 该赋值式定义在openwrt顶层目录下的Makefile中,而CURDIR是Makefile的预定义变量,表示当前路径.
rules.mk文件中定义了许多重要变量,常用的有以下这些:
INCLUDE_DIR := $(TOPDIR)/include
BUILD_DIR := $(TOPDIR)/build_dir/target-arm_cortex-a7+neon_musl-1.1.11_eabi
STAGING_DIR := $(TOPDIR)/staging_dir/target-arm_cortex-a7+neon_musl-1.1.11_eabi
INSTALL_BIN := install -m0755
INSTALL_DIR := install -d -m0755
INSTALL_DATA := install -m0644
TARGET_CC:=$(TARGET_CROSS)gcc
2. PKG_XXX系列变量
PKG_NAME -软件包的名字, 在 menuconfig 和 ipkg 显示
PKG_VERSION -软件包的版本
PKG_RELEASE -这个 makefile 的版本
# 对于从git上下载的软件包,以下这些变量定义是必须的
PKG_REV -要下载的软件包在svn/git上的版本号
PKG_SOURCE -要下载的软件包的名字,一般是由 PKG_NAME 和 PKG_VERSION 组成
PKG_SOURCE_URL -下载这个软件包的链接
PKG_SOURCE_SUBDIR -源代码目录名
PKG_SOURCE_VERSION -源代码版本号,用于对从git下载的源代码进行MD5检查
PKG_SOURCE_PROTO -源代码的下载方式,即svn/git
PKG_CONFIG_DEPENDS -定义了选择这个软件包时指定的配置选项
PKG_BUILD_DIR -真正编译当前软件包的目录
3. include $(INCLUDE_DIR)/package.mk 就是将$(TOPDIR)/include目录下的package.mk文件中的内容导入进来
package.mk文件的功能主要是以下几个方面:
a). 配置变量的默认值
对于那些没有在上一部分中定义的变量,那么在这个文件里将被赋予默认值
b). 推导其他变量
根据上一部分中用户自定义的PKG_XXX变量,这里会推导出更多后面会用到的相关变量
c). 包含其他mk文件
d). 定义默认的宏
其中最重要的一个宏BuildPackage就是在package.mk中实现的,BuildPackage宏只要求一个参数,即要编译的软件包名,
其他所有信息都通过宏来获得,和BuildPackage相关的自定义宏有以下这些:
Package/包名 - 这个是必须定义的宏,注意包名和PKG_NAME定义的不一定相同
- 描述软件包在menuconfig和ipkg中的信息,可以定义如下变量
SECTION - 软件包类型
CATEGORY - menuconfig中软件包所属的一级目录
SUBMENU - menuconfig中软件包所属的二级目录
TITLE - 软件包标题
DESCRIPTION - 软件包的详细说明(这种格式已经放弃使用,改用"Package/包名/description"宏单独定义)
URL - 软件的原始位置,一般是软件作者主页
MAINTAINER - 维护者
DEPENDS - 运行本软件依赖的其他包
Package/包名/description - 软件包的详细说明,取代了前面提到的DESCRIPTION
Build/Prepare - 编译之前的准备动作,对于网上下载的软件包不需要定义该宏,但对于非网上下载或自行开发的软件包必须定义该宏
一般的准备动作就是:
#define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
#endef
Build/Configure - 如果源代码编译前需要configure或调用配置脚本,就定义这个宏,否则不需要
Build/Compile - 源代码编译规则,默认已经设置好,一般不需要自定义,只有当需要指定一些特殊的规则时采用到
Package/包名/install - 软件包的安装方法,主要就是将一系列编译好的文件、启动脚本、UCI配置文件等拷贝到指定位置,
一般的类似写法就是:
#define Package/包名/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/包名 $(1)/usr/sbin/
$(INSTALL_DATA) ./files/配置文件 $(1)/etc/config/配置文件
$(INSTALL_BIN) ./files/启动脚本 $(1)/etc/init.d/启动脚本
#endef
其中$(1)表示嵌入式系统的镜像目录
备注: 之所以有些宏是以"Package/"开头,有的又以"Build/",是因为openwrt支持从单个源码构建出多个软件包。
OpenWrt默认认为一个Makefile里定义一个软件包,但我们也可以根据需要将其拆分成多个。
因为编译只要一次,那么只要有一系列全局的"Build/"的宏定义就可以了。
然后通过添加多个"Package/"宏定义为各个软件包分别定义安装方法,并调用 BuildPackage,来创建多个包。
* 一个标准的Makefile包大概可以简化为如下结构: *
* include $(TOPDIR)/rules.mk *
* # 这里定义一系列的 PKG_XX *
* include $(INCLUDE_DIR)/package.mk *
* # 这里定义各种Package、Build宏 *
* $(eval $(call BuildPackage,包名)) *
*****************************************************************************************************
1. include $(TOPDIR)/rules.mk 就是将openwrt顶层目录下的rules.mk文件中的内容导入进来
其中 TOPDIR := $(CURDIR) # 该赋值式定义在openwrt顶层目录下的Makefile中,而CURDIR是Makefile的预定义变量,表示当前路径.
rules.mk文件中定义了许多重要变量,常用的有以下这些:
INCLUDE_DIR := $(TOPDIR)/include
BUILD_DIR := $(TOPDIR)/build_dir/target-arm_cortex-a7+neon_musl-1.1.11_eabi
STAGING_DIR := $(TOPDIR)/staging_dir/target-arm_cortex-a7+neon_musl-1.1.11_eabi
INSTALL_BIN := install -m0755
INSTALL_DIR := install -d -m0755
INSTALL_DATA := install -m0644
TARGET_CC:=$(TARGET_CROSS)gcc
2. PKG_XXX系列变量
PKG_NAME -软件包的名字, 在 menuconfig 和 ipkg 显示
PKG_VERSION -软件包的版本
PKG_RELEASE -这个 makefile 的版本
# 对于从git上下载的软件包,以下这些变量定义是必须的
PKG_REV -要下载的软件包在svn/git上的版本号
PKG_SOURCE -要下载的软件包的名字,一般是由 PKG_NAME 和 PKG_VERSION 组成
PKG_SOURCE_URL -下载这个软件包的链接
PKG_SOURCE_SUBDIR -源代码目录名
PKG_SOURCE_VERSION -源代码版本号,用于对从git下载的源代码进行MD5检查
PKG_SOURCE_PROTO -源代码的下载方式,即svn/git
PKG_CONFIG_DEPENDS -定义了选择这个软件包时指定的配置选项
PKG_BUILD_DIR -真正编译当前软件包的目录
3. include $(INCLUDE_DIR)/package.mk 就是将$(TOPDIR)/include目录下的package.mk文件中的内容导入进来
package.mk文件的功能主要是以下几个方面:
a). 配置变量的默认值
对于那些没有在上一部分中定义的变量,那么在这个文件里将被赋予默认值
b). 推导其他变量
根据上一部分中用户自定义的PKG_XXX变量,这里会推导出更多后面会用到的相关变量
c). 包含其他mk文件
d). 定义默认的宏
其中最重要的一个宏BuildPackage就是在package.mk中实现的,BuildPackage宏只要求一个参数,即要编译的软件包名,
其他所有信息都通过宏来获得,和BuildPackage相关的自定义宏有以下这些:
Package/包名 - 这个是必须定义的宏,注意包名和PKG_NAME定义的不一定相同
- 描述软件包在menuconfig和ipkg中的信息,可以定义如下变量
SECTION - 软件包类型
CATEGORY - menuconfig中软件包所属的一级目录
SUBMENU - menuconfig中软件包所属的二级目录
TITLE - 软件包标题
DESCRIPTION - 软件包的详细说明(这种格式已经放弃使用,改用"Package/包名/description"宏单独定义)
URL - 软件的原始位置,一般是软件作者主页
MAINTAINER - 维护者
DEPENDS - 运行本软件依赖的其他包
Package/包名/description - 软件包的详细说明,取代了前面提到的DESCRIPTION
Build/Prepare - 编译之前的准备动作,对于网上下载的软件包不需要定义该宏,但对于非网上下载或自行开发的软件包必须定义该宏
一般的准备动作就是:
#define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
#endef
Build/Configure - 如果源代码编译前需要configure或调用配置脚本,就定义这个宏,否则不需要
Build/Compile - 源代码编译规则,默认已经设置好,一般不需要自定义,只有当需要指定一些特殊的规则时采用到
Package/包名/install - 软件包的安装方法,主要就是将一系列编译好的文件、启动脚本、UCI配置文件等拷贝到指定位置,
一般的类似写法就是:
#define Package/包名/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/包名 $(1)/usr/sbin/
$(INSTALL_DATA) ./files/配置文件 $(1)/etc/config/配置文件
$(INSTALL_BIN) ./files/启动脚本 $(1)/etc/init.d/启动脚本
#endef
其中$(1)表示嵌入式系统的镜像目录
备注: 之所以有些宏是以"Package/"开头,有的又以"Build/",是因为openwrt支持从单个源码构建出多个软件包。
OpenWrt默认认为一个Makefile里定义一个软件包,但我们也可以根据需要将其拆分成多个。
因为编译只要一次,那么只要有一系列全局的"Build/"的宏定义就可以了。
然后通过添加多个"Package/"宏定义为各个软件包分别定义安装方法,并调用 BuildPackage,来创建多个包。