openwrt包的Makefile分析

    xiaoxiao2021-04-18  67

    ***************************************************************************************************** *       一个标准的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,来创建多个包。
    转载请注明原文地址: https://ju.6miu.com/read-675230.html

    最新回复(0)