一、Makefile的基本知识
Makefile是一种可以执行程序自动化编译的工具,它通过对文件和源代码的依赖性关系来确定需要重新编译的文件,从而提高了编译和构建的效率。
Makefile文件包含一系列的规则,每条规则定义了一个目标文件、依赖文件和如何生成目标文件的指令。其中,目标文件是所需要生成的文件,依赖文件是目标文件生成所需要的文件或者是其他目标文件。
例如,下面是一个简单的Makefile文件的示例:
target: dependency1 dependency2
command1
command2
其中,“target”是目标文件,依赖文件是“dependency1”和“dependency2”,“command1”和“command2”是生成目标文件的指令。
二、openwrtmakefile的基本结构
openwrtmakefile是基于Makefile的一种扩展,它专门用于编译和构建OpenWrt软件包。
下面是一个openwrtmakefile的基本结构示例:
include $(TOPDIR)/rules.mk
PKG_NAME:=example
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
PKG_SOURCE_URL:=http://example.com
PKG_SOURCE:=example-$(PKG_VERSION).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_MD5SUM:=0123456789abcdef0123456789abcdef
include $(INCLUDE_DIR)/package.mk
define Package/example
SECTION:=utils
CATEGORY:=Utilities
TITLE:=Example package
DEPENDS:=+libopenssl
endef
define Package/example/description
This is an example package for OpenWrt.
endef
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) $(DL_DIR)/$(PKG_SOURCE) $(PKG_BUILD_DIR)/$(PKG_SOURCE)
cd $(PKG_BUILD_DIR) && tar xzf $(PKG_SOURCE)
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
endef
define Package/example/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_SOURCE_SUBDIR)/example $(1)/usr/bin/
endef
$(eval $(call BuildPackage,example))
其中,第1行引用了OpenWrt的rules.mk文件,第3-7行定义了软件包的名称、版本号、发布号等基本信息,第9-14行定义了软件包的基本信息和依赖关系。之后的define语句分别定义了软件包不同阶段的操作。
通过openwrtmakefile,我们可以轻松地定义软件包各个阶段的操作,如编译、安装、打包等。
三、openwrtmakefile中常用的内容
1. 定义软件包信息
在openwrtmakefile中,我们可以通过define语句来定义软件包的基本信息和依赖关系。
define Package/ SECTION:=CATEGORY:= TITLE:= DEPENDS:= endef
其中,“”是软件包的名称,“
2. 定义软件包的编译、安装、删除等阶段操作
在openwrtmakefile中,我们可以通过define语句来定义软件包在不同阶段的操作。
define Build/Prepare # 编译前的操作 endef define Build/Compile # 编译操作 endef define Package//install # 安装操作 endef define Package//uninstall # 删除操作 endef
3. 定义软件包的源代码信息和下载地址
在openwrtmakefile中,我们可以通过下面的内容来定义软件包的源代码信息和下载地址。
PKG_SOURCE_URL:= PKG_SOURCE:= PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_MD5SUM:=
其中,“”是软件包的下载地址,“”是下载的文件名,“”是文件的MD5校验值。
4. 定义软件包的文件安装目录
在openwrtmakefile中,我们可以通过下面的内容来定义软件包的文件安装目录。
define Package//install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ $(1)/usr/bin/
endef
其中,“”是编译后所生成的文件,例如“example”。
四、openwrtmakefile的实际应用
下面我们以实际的openwrtmakefile为例,来介绍它的应用。
1. 配置文件的生成
define Package//conffiles /etc/.conf endef define Package//preinst #!/bin/sh if [ -e /etc/.conf ]; then cp /etc/.conf /tmp/.conf fi endef define Package//postinst #!/bin/sh if [ ! -e /etc/.conf ]; then cp /tmp/.conf /etc/.conf fi endef define Package//prerm #!/bin/sh rm -f /tmp/.conf endef define Package//postrm endef
在上面的示例中,我们定义了软件包的配置文件和四个不同阶段的操作,包括“conffiles”、“preinst”、“postinst”、“prerm”和“postrm”。
其中,“conffiles”是软件包的配置文件,“preinst”表示在安装之前的操作,“postinst”表示在安装之后的操作,“prerm”表示在卸载之前的操作,而“postrm”表示在卸载之后的操作。
2. 安装脚本的生成
define Build/Prepare
endef
define Package//postinst
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
/etc/init.d/ enable
/etc/init.d/ start
fi
endef
define Package//prerm
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
/etc/init.d/ stop
/etc/init.d/ disable
fi
define Package//install
#安装脚本
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/ $(1)/etc/init.d/
chmod +x $(1)/etc/init.d/
#常规文件
$(CP) ./files/* $(1)/
$(RM) $(1)/files/
endef
上面的示例中,我们可以看到“postinst”和“prerm”脚本,它们在安装和卸载软件包时分别运行。在“postinst”脚本中,我们启用并启动一个服务,而在“prerm”脚本中,我们停止并禁用该服务。另外,在“install”操作中,我们安装了脚本和常规文件。
3. 附加命令的生成
define Package//install
# 安装命令
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ $(1)/usr/bin/
# 附加命令
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) files/ $(1)/usr/sbin/
endef
在上面的示例中,我们安装了一个命令,它对应着编译中生成的文件,而另一个附加命令则是通过安装一些脚本来实现的。
五、总结
本文介绍了openwrtmakefile的基本知识、结构和常用内容,以及一些实际应用的示例。通过openwrtmakefile,我们可以灵活地管理和控制OpenWrt的软件包构建和编译过程。
Makefile本身是一种强大而高效的工具,而openwrtmakefile则为OpenWrt提供了更为便捷的软件包编译和打包功能,使得开发和维护OpenWrt软件包变得更加简单和快捷。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/251716.html
微信扫一扫
支付宝扫一扫