一、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:=
其中,“
4. 定义软件包的文件安装目录
在openwrtmakefile中,我们可以通过下面的内容来定义软件包的文件安装目录。
define Package//install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/ $(1)/usr/bin/ endef
其中,“
四、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/Prepareendef 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软件包变得更加简单和快捷。