一、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
微信掃一掃
支付寶掃一掃