OpenWRT开发之——研究包的Makefile

更新时间:2023-07-19 05:38:24 阅读: 评论:0

OpenWRT开发之——研究包的Makefile 本⽂将带⼤家⼀起深⼊地学习⼀下OpenWrt包的 Makefile。我们不仅要知其然,还要知其所以然。
在上篇博⽂⾥,包⾥的 Makefile 内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31include $(TOPDIR)/rules.mk
PKG_NAME:=helloworld
血浆凝血酶原时间
PKG_RELEASE:=1五班班徽
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/helloworld
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Helloworld -- prints a snarky message
endef
define Package/helloworld/description
It's my first package demo.
endef
define Build/Prepare
echo"Here is Package/Prepare"
mkdir-p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Package/helloworld/install
echo"Here is Package/install"
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld$(1)/bin/ endef
$(eval$(call BuildPackage,helloworld))
⼤概我们可以将简代为如下的结构:
1 2 3 4 5 6 7 8 9include $(TOPDIR)/rules.mk
# 这⾥定义⼀系列的 PKG_XX include $(INCLUDE_DIR)/package.mk # 定义各种 Package, Build 宏$(eval$(call BuildPackage,包名))
下⾯,我们来⼀⼀拆解。
include $(TOPDIR)/rules.mk
⾸先,include $(TOPDIR)/rules.mk,也就是将 SDK/rules.mk ⽂件中的内容导⼊进来。TOPDIR就是SDK的路径。
在 SDK/rules.mk ⽂件中,定义了许多变量。
我们可以看出,在Makefile中,赋值是⽤ := ,⽽不是等号。
⽐如上⾯的 BUILD_DIR, INCLUDE_DIR 等,都在这⾥定义。还有:
还有关于 TARGET_CC, TARGET_CXX 等⾮常有⽤的变量定义。
消火栓还有 TAR, FIND, INSTALL_BIN, INSTALL_DIR, INSTALL_DATA等等⾮常重要的变量定义。
⾃定义 PKG_XXXX 变量
官⽹上指定有如下变量需要设置:
PKG_NAME        - The name of the package, as en via menuconfig and ipkg
PKG_VERSION    - The upstream version number that we're downloading
PKG_RELEASE    - The version of this package Makefile
PKG_LICENSE    - The licen(s) the package is available under, SPDX form.
PKG_LICENSE_FILE- file containing the licen text
PKG_BUILD_DIR  - Where to compile the package
PKG_SOURCE      - The filename of the original sources
PKG_SOURCE_URL- Where to download the sources from (directory)
PKG_MD5SUM      - A checksum to validate the download
PKG_CAT        - How to decompress the sources (zcat, bzcat, unzip)
PKG_BUILD_DEPENDS - Packages that need to be built before this package, but are not required at runtime. Us the same syntax as DEPENDS below.
PKG_INSTALL    - Setting it to "1" will call the package's original "make install" with prefix t to PKG_INSTALL_DIR
牛角鱼
PKG_INSTALL_DIR - Where "make install" copies the compiled files
PKG_FIXUP      -
PKG_SOURCE_PROTO - the protocol to u for fetching the sources (git, svn)
PKG_REV        - the svn revision to u, must be specified if proto is "svn"
PKG_SOURCE_SUBDIR - must be specified if proto is "svn" or "git", e.g. "PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)"
PKG_SOURCE_VERSION - must be specified if proto is "git", the commit hash to check out
PKG_CONFIG_DEPENDS - specifies which config options depend on this package being lected
include $(INCLUDE_DIR)/package.mk
跟上⾯的 include $(TOPDIR)/rules.mk 是⼀样的。就是把这个⽂件包含进来。
INCLUDE_DIR这个变量在 rules.mk ⾥已经定义了:
越南鱼露那就是 SDK/include/package.mk ⽂件了,打开看看。
主要有以下⼏个功能:
(1)它会配置默认的变量
如果某个变量我们没有在上⼀部分⾥定义,那⾥在这个⽂件⾥,它就会被指定为默认值,⽐如:
上⾯的⽤ ?= 来表⽰给未定义的变量赋默认值。⽐如,如果没有指定 PKG_MD5SUM,那么就默认为 unknow。2004年欧洲杯
(2)推导其它变量
根据上部分⽤户⾃定义的 PKG_XXXX 变量推导出更多相关的变量。
⽐如:
虽然我没有看过相关的⼿册,根据多年的从业经验也能看出上⾯的意思来。
1 2 3 4 5 6 7 8 9 10 11 12 13#如果定义了宏,就...
ifdef 宏名
...
endif
#如果宏相等
ifeq (宏1,宏2)
...
endif
strip $宏名    #将宏对应的值去除前后的空⽩字符VAR += xxxx    #在变量 VAR 后⾯追加 xxxx
我猜⼤概就是这样,如果不对请指正。
再⽐如如下:
就这样,它为我们提供了⼤量有价值的变量。(3)包含其它mk⽂件
(4)定义默认宏
在 Makefile 中,宏的定义格式是:
1 2 3define XXX/xxxx    <;宏的实体...> endef
package.mk会把⼤部分需要的宏都定义好。理想情况下,⽤户只需要定义好了 PKG_XXX 之后,不需要再⾃定义宏,默认的宏就可以满⾜需求。⽐如Build/Prepare/Default的定义:
Build/Prepare宏是在编译前进⾏的,是准备⼯作。
可以看出,它分了两种情况:
A,定义了 USE_GIT_TREE,则按git的⽅式定义。
B,定义了 USB_SOURCE_DIR,则按源码在本地的⽅案定义。
(5)BuildPackage宏
最重要的⼀个宏是 BuildPackage。它会在 Makefile 的最后⼀⾏被引⽤。它的实现也就是在 package.mk ⽂件⾥。如下为其源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39define BuildPackage
$(Build/IncludeOverlay)
$(eval$(Package/Default))    #定义在package-defaults.mk⽂件⾥
$(eval$(Package/$(1)))      #调⽤⽤户⾃定义的 Package/<;包名> 宏
ifdef DESCRIPTION
$$(error DESCRIPTION:= is obsolete, u Package/PKG_NAME/description)
endif
#检查有没有定义 Package/<;包名>/description宏,如果没有定义,则以TITLE默认定义⼀个
ifndef Package/$(1)/description
define Package/$(1)/description
$(TITLE)
endef
endif
BUILD_PACKAGES += $(1)
$(STAMP_PREPARED): $$(if$(QUILT)$(DUMP),,$(call find_library_dependencies,$(DEPENDS)))
#检查 TITLE, CATEGORY, SECTION, VERSION 是否定义,如果没有定义则报错
$(foreach FIELD, TITLE CATEGORY SECTION VERSION,
ifeq ($($(FIELD)),)
$$(error Package/$(1) is missing the $(FIELD) field)
黑板的拼音
endif
)
#如果有定义DUMP,那就引⼊Dumpinfo/Package宏的内部。
#如果没有,那么就引⽤ Packaget/<;包名>/targets⾥⾯的每⼀个target,如果没有定义Packaget/<;包名>/targets宏,那么将PKG_TARGETS⾥的每个target取出来,
#如果也没有定义PKG_TARGETS,那就默认ipkg作为target。将每⼀个target,引⽤ BuildTarget/$(target)。
$(if$(DUMP), \
$(Dumpinfo/Package), \
$(foreach target, \
$(if$(Package/$(1)/targets),$(Package/$(1)/targets), \
$(if$(PKG_TARGETS),$(PKG_TARGETS), ipkg) \
), $(BuildTarget/$(target)) \
) \
)
$(if$(PKG_HOST_ONLY)$(DUMP),,$(call Build/DefaultTargets,$(1)))
endef
总结⼀下语法:
$() 表⽰要执⾏的⼀条语句
$(if 条件, 成⽴执⾏, 失败执⾏)        if条件分⽀$(foreach 变量, 成员列表, 执⾏体)  成员遍历语句可以看出,语句是可以嵌套使⽤的。
$(N)  表⽰第N个参数
⾃定义宏
必须定义的宏
我定要为我们的package定义特定的宏:
Package/<;包名>    #包的参数
在 Package/<;包名> 宏中定义与包相关的信息。如Package/helloworld宏:
1 2 3 4 5define Package/helloworld
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Helloworld -- prints a snarky message endef
除了上⾯所列的 SECTION,CATEGORY,TITLE变量外,还可以定义:
SECTION    - 包的种类
CATEGORY    - 显⽰在menuconfig的哪个⽬录下
TITLE      -  简单的介绍
DESCRIPTION - (deprecated) 对包详细的介绍
URL - 源码所在的⽹络路径
MAINTAINER  - (required for new packages) 维护者是谁(出错了联系谁)
DEPENDS    - (optional) 需要依事的包,See for the syntax.
USERID      - (optional) a urname:groupname pair to create at package installation time.
沙滩婚礼可选定义的宏
其它的宏可以选择性地定义,通常没必要⾃⼰重写。但有些情况,package.mk中默认的宏不能满⾜我们的需求。这时,我们就需要⾃⼰重定义宏。
⽐如,我们在为helloworld写Makefile时,我们要求在编译之前,将 SDK/package/helloworld/src/ 路径下的⽂件复制到 PKG_BUILD_DIR 所指定的⽬录下。
于是我们重新定义Build/Prepare宏:
1 2 3 4define Build/Prepare
mkdir-p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/ endef
如此以来,在我们 make V=s 时,make⼯具会在编译之前执⾏ Build/Prepare 宏⾥的命令。再⽐如,我们要指定包的安装⽅法:
1 2 3define Package/helloworld/install
$(INSTALL_DIR) $(1)/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld$(1)/bin/

本文发布于:2023-07-19 05:38:24,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1087357.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:定义   变量   没有   需要   默认   编译   看出   进来
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图