一、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/zh-tw/n/251716.html