Openwrt学习之路-(5-Openwrt package Makefile)

题图:gratisography

Openwrt package Makefile

在"Openwrt main Makefile"章节里面有说道主Makefile会通过include package/Makefile调用package下的Makefile,package下的Makefile又会调用调用$(call subdir,package)遍历package子目录下的Makefile。package下的Makefile是源码里面就提供的,不会修改,但package子目录下的Makefile确是我们经常要打交道的,本章节将对其进行说明。

我们随便打开package下面的子目录,通常会发现几样东西:

  • package/$(PKG_NAME)/Makefile [必备]
  • package/$(PKG_NAME)/src/ [可选]
  • package/$(PKG_NAME)/patches/ [可选]
  • package/$(PKG_NAME)/files/ [可选]

src目录、patches目录、files目录都是可选的,src目录存放的是该功能模块的源代码,pactches目录通常包括bug修复和对可执行文件体积的优化,files目录通常是运行脚本包括配置文件等。你也可能看到其它目录,因为只要在Makefile文件中指明,目录名字是可以任取的。

Makefile文件最关键,一般来说它提供了下载、编译、安装这个软件包的步骤。

当我们打开package子目录的Makefile文件,很难认出这是一个Makefile。它的格式跟一般的Makefile不一样,因为它的功能跟普通Makefile就是不一样的,它是一种编写方便的模板。

这里,以package/bridge/Makefile文件为例:

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_MD5SUM:=9b7dc52656f5cbec846a7ba3299f73bd
PKG_CAT:=zcat

include $(INCLUDE_DIR)/package.mk

define Package/bridge
  SECTION:=base
  CATEGORY:=Network
  DEFAULT:=y
  TITLE:=Ethernet bridging configuration utility
  DESCRIPTION:=Ethernet bridging configuration utility\\\
    Manage ethernet bridging; a way to connect networks together to\\\
    form a larger network.
  URL:=http://bridge.sourceforge.net/
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))

1.包含全局变量


首先在Makefile中的第一行一定要包含下面这个命令,这是Makefile的一些全局变量的相关定义
include $(TOPDIR)/rules.mk

2.软件包变量


建立一个软件包不需要太多工作;大部分工作都隐藏在其它的makefiles中,编写工作被抽象成对几个变量的赋值。

PKG_NAME : 软件包的名字, 在 menuconfig 和 ipkg 显示
PKG_VERSION :软件包的版本,主干分支的版本正是我们要下载的
PKG_RELEASE :这个 makefile 的擦写版本
PKG_BUILD_DIR :编译软件包的目录
PKG_SOURCE :要下载的软件包的名字,一般是由 PKG_NAME 和 PKG_VERSION 组成
PKG_SOURCE_URL :下载这个软件包的链接
PKG_MD5SUM :软件包的 MD5 值
PKG_CAT :解压软件包的方法 (zcat, bzcat, unzip)
PKG_BUILD_DEPENDS :需要预先构建的软件包,但只是在构建本软件包时,而不是运行的时候。它的语法和下面的DEPENDS一样。

3.BuildPackage相关的宏定义


1.描述软件包在menuconfig和ipkg中的信息,可以定义如下变量:

define  Package/< PKG_NAME >
    SECTION : 软件包类型
    CATEGORY :  软件包在menuconfig里的位置,如Network, Utilities
    SUBMENU : menuconfig中软件包所属的二级目录,如dial-in/up
    DEFAULT: 默认的编译模式,m=编译成模块,y=编译到镜像,n或者不加不编译,[依赖
            包 两个之间通过空格分隔 前面加+为默认显示 选中该软件包自动选中依
            赖包 不加+为默认不显示 选中依赖包才显示] 
    TITLE : 软件包标题
    DESCRIPTION : 软件包的详细说明,由于存在bug,现在已经放弃
    URL : 软件的原始位置,一般是软件作者的主页
    MAINTAINER :  (optional) 软件包维护人员
    DEPENDS : (optional) 依赖项,运行本软件依赖的其他包
endif

2.配置说明

define  Build/Configure (可选)
        在Automake中需要进行./configure,所以本配置方法主要针对需要配置的软件
        包而设计,一般自行开发的软件包可以不在这里说明。
 endif

3.软件包安装

define Package/install
        软件包的安装方法,包括一系列拷贝编译好的文件到指定位置。調用時會帶一
        個參數,就是嵌入系統的鏡像文件系統目錄,因此$(1)表示嵌入系统的镜像目
        录。一般可以采用下面的方法:
        $(INSTALL_DIR)  $(1)/usr/bin
        $(INSTALL_BIN)  $(PKG_BUILD_DIR)/$(PKG_NAME)  $(1)/usr/bin/
endif

4.其他BuildPackage相关的宏定义

上面列出的三个是在bridge这个模块下面用的宏定义,其他还有很多其他的定义,我们也可以了解下,再其他情况可能也会用到。

1.编译准备

define  Build/Prepare (可选)
    对于网上下载的软件包不需要再描述,对于非网上下载或自行开发的软件包
    必须说明编译准备方法,如下:  
    mkdir -p $(PKG_BUILD_DIR)
    创建编译目录,也就是$(TOPDIR)/build_dir/target-<ARCH>*/$(PKG_NAME)-%(PKG_VERSION)
    $(CP) ./src/* $(PKG_BUILD_DIR)/   
    将软件包的src的源码文件拷贝到编译目录去
endif

2.编译源代码

define  Build/Compile (可选)
    默认是编译源码里面的Makefile,如果你想传递一些参数比如环
    境变量什么的,那就可以定义,编译方法,没有特别说明的可以不予以定义。如果不
    定义将使用默认的编译方法Build/Compile/Default
    自行开发的软件包可以考虑使用下面的定义。
    $(MAKE) -C  $(PKG_BUILD_DIR)    \
                $(TARGET_CONFIGURE_OPTS)  \
                CFLAGS="$(TARGET_CFLAGS)  -I$(LINUX_DIR)/include"
endif

3.安装之前执行的脚本

define  Package/ $(PKG_NAME)/ preinst (可选)
    软件安装之前被执行的脚本,别忘了在第一句加上#!/bin/sh,如果脚本执行完毕要取消 安装过程,直接让它返回false即可。
    #!/bin/sh
    .........
    exit 0
endif

4.安装之后执行的脚本

define  Package/ $(PKG_NAME)/ postinst (可选)
    软件安装之后被执行的脚本,别忘了在第一句加上#!/bin/sh。
    #!/bin/sh
    .........
    exit 0
endif

5.删除之前被执行的脚本

define Package/ $(PKG_NAME)/ prerm (可选)
    软件删除之前被执行的脚本,别忘了在第一句加上#!/bin/sh。如果脚本执行完毕要取消 删除过程,直接让它返回false即可。
    #!/bin/sh
    .........
    exit 0
endif

6.删除之后被执行的脚本

define  Package/ $(PKG_NAME)/ postrm (可选)
    软件删除之后被执行的脚本,别忘了在第一句加上#!/bin/sh。
    #!/bin/sh
    .........
    exit 0
endif

为什么一些定义是"Package/"前缀,另一些定义却是"Build"前缀?这是因为Openwrt支持一个特性:从单个源代码构建多个软件包。OpenWrt工作在一个Makefile对应一个源代码的假设之上,但是你可以把编译生成的程序分割成任意多个软件包。因为编译只要一次,所以使用全局的"Build"定义是最合适的。然后你可以增加很多“Package/"定义,为各软件包分别指定安装方法。

5.软件包的实现


完成前面定义后,必须使用eval函数实现各种定义。这是最为关键的BuildPackage宏,它是在$(INCLUDE_DIR)/package.mk文件里定义的。BuildPackage宏只要求一个参数,即要编译的软件包名,在本例中是"bridge"。

对于一般软件包$(eval $(call Package,$(PKG_NAME)))

对于内核模块$(eval $(call KernelPackage,$(PKG_NAME)))

如果一个软件包有多个程序,eval函数也可以设计多个软件包处理。

在编辑好Makefile文件,并放到指定目录后,这个新的软件包将在下次执行make menuconfig时出现,你可以选择这个软件包,保存退出,编译,就把一个软件包成功移植到OpenWrt中了,具体例子将在“Openwrt add function module to package”章节就行说明。

Openwrt package Makefile的分析就到这边,有感悟时会持续会更新。

注:以上内容都是本人在学习过程积累的一些心得,难免会有参考到其他文章的一些知识,如有侵权,请及时通知我,我将及时删除或标注内容出处,如有错误之处也请指出,进行探讨学习。文章只是起一个引导作用,详细的数据解析内容还请查看Openwrt相关教程,感谢您的查阅。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容