變數名含義
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 messageendef
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 -m0755INSTALL_DIR:=install -d -m0755INSTALL_DATA:=install -m0644INSTALL_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)endififndef Package/$(1)/descriptiondefine Package/$(1)/description $(TITLE)endefendif $(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")