OpenWrt增加软件包
阅读原文时间:2023年07月09日阅读:1

变量名含义

SECTION     //包的种类
CATEGORY    //显示在menuconfig的哪个目录下
SUBMENU     //menuconfig子目录
TITLE       //简单的介绍
DESCRIPTION //包的详细介绍
URL         //源码所在的网络路径
MAINTAINER  //维护者
DEPENDS     //依赖包

PKG_NAME        //软件包名称,将在menuconfig和ipkg可以看到
PKG_VERSION     //软件版本号
PKG_RELEASE     //Makefile的版本号
PKG_SOURCE      //源代码的文件名
PKG_MD5SUM      //源代码文件的效验码。用于核对软件包是否正确下载
PKG_CAT         //源代码文件的解压方法 (zcat, bzcat, unzip)
PKG_BUILD_DIR   //软件包编译目录。它的父目录为$(BUILD_DIR)。如果不指定,默认为$(BUILD_DIR)/$( PKG_NAME)$( PKG_VERSION)

Package

define Package/$(PKG_NAME)
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=Helloworld -- prints a snarky message
endef

Build/Prepare

编译准备方法。自己的程序全部放在src目录下。一般的准备方法:

define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

Build/Compile

编译方法。如果不定义将使用默认的编译方法Build/Compile/Default。一般的定义方法:

define Build/Compile
    $(MAKE) -C $(PKG_BUILD_DIR) \
        $(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include"
Endef

Package/$(PKG_NAME)/install

安装方法。举例:

define Package/$(PKG_NAME)/install
    $(INSTALL_DIR) $(1)/etc/init.d/
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/hello $(1)/etc/init.d/
    $(INSTALL_DATA) $(PKG_BUILD_DIR)/configs/hello.config $(1)/etc/
    $(INSTALL_CONF) $(PKG_BUILD_DIR)/configs/hello.config $(1)/etc/
#   $(CP) $(PKG_BUILD_DIR)/tools/{xxx} $(1)/usr/sbin/ //默认权限,而且只是简单复制
endef

INSTALL_xxx:安装到PKG_BUILD_DIR和文件系统目录下

CP:只安装到PKG_BUILD_DIR目录下

INSTALL_xxx变量在$(TOPDIR)/rules.mk中定义

INSTALL_BIN:=install -m0755
INSTALL_DIR:=install -d -m0755
INSTALL_DATA:=install -m0644
INSTALL_CONF:=install -m0600

eval

$(eval <text>)

将text作为Makefile文件中的一部分

call

$(call BuildPackage,$(PKG_NAME))

引用BuildPackage变量中的内容,并将BuildPackage内部的$(1)替换为PKG_NAME

BuildPackage

BuildPackage变量在$(INCLUDE_DIR)/package.mk中定义

define BuildPackage
  $(Build/IncludeOverlay)
  $(eval $(Package/Default))
  $(eval $(Package/$(1)))

ifdef DESCRIPTION
$$(error DESCRIPTION:= is obsolete, use Package/PKG_NAME/description)
endif

ifndef Package/$(1)/description
define Package/$(1)/description
    $(TITLE)
endef
endif

  $(foreach FIELD, TITLE CATEGORY PRIORITY SECTION VERSION,
    ifeq ($($(FIELD)),)
      $$(error Package/$(1) is missing the $(FIELD) field)
    endif
  )

  $(call shexport,Package/$(1)/description)
  $(call shexport,Package/$(1)/config)

  $(if $(DUMP), \
    $(Dumpinfo/Package), \
    $(foreach target, \
      $(if $(Package/$(1)/targets),$(Package/$(1)/targets), \
        $(if $(PKG_TARGETS),$(PKG_TARGETS), ipkg) \
      ), $(BuildTarget/$(target)) \
    ) \
  )
  $(if $(PKG_HOST_ONLY)$(DUMP),,$(call Build/DefaultTargets,$(1)))
endef

正确的编译过程

# make menuconfig
# make -j   //自动选择cpu数量,一般编译会出错
# make
# make package/$(PKG_NAME)/install

必须先make成功,才能执行install,否则会提示依赖库警告

注意

如果你增加的包需要交叉编译的,记得在CMakeLists.txt设置交叉编译器

SET(CMAKE_C_COMPILER "mipsel-openwrt-linux-uclibc-gcc")