您的位置:

openwrtmakefile的使用与管理

一、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

其中,“ ”是软件包的名称,“

”是软件包所属的部分,“ ”是软件包所属的类别,例如“Utilities”或“Network”,“ ”是软件包的名称,而“ ”是软件包的依赖关系,例如“+libopenssl”或“kmod-usb-serial”等。

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软件包变得更加简单和快捷。