openwrt包的Makefile分析

*****************************************************************************************************
*       一个标准的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,来创建多个包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值