OpenWrt添加軟件包(一)


本文參考https://wiki.openwrt.org/zh-cn/doc/devel/packages
http://blog.csdn.net/teddy99999/article/details/17537545

OpenWrt是一個比較完善的嵌入式Linux開發平台,人們可以在其基礎上增加軟件包,以擴大其應用范圍。OpenWrt在增加軟件方面使用極其方便,按照OpenWrt的約定就可以很簡單完成。
加入的軟件包可以是網上可下載的開源軟件或自行開發的軟件。為加入軟件包需要在package目錄下創建一個目錄,以包含軟件包的各種信息和與OpenWrt建立聯系的文件。然后創建一個Makefile與OpenWrt建立聯系,Makefile需要遵循OpenWrt的約定。另外可以創建一個patchs目錄保存patch文件,對下載的源代碼進行適量修改。下面主要介紹Makefile的基本約定。

  1. 引入文件
    OpenWrt使用三個makefile的子文件,分別為:
    include(TOPDIR)/rules.mk
    include(INCLUDE_DIR)/.kernel.mk
    include(INCLUDE_DIR)/package.mk

    由這些makefile子文件確立軟件包加入Openwrt的方法和方式。

    include(TOPDIR)/rules.mk一般在Makefile的開頭
    include(INCLUDE_DIR)/kernel.mk文件對於軟件包為內核時不可缺少
    include(INCLUDE_DIR)/package.mk一般在軟件包的基本信息完成后引入

  2. 編寫軟件包的基本信息,這些軟件包的開頭均以PKG_開頭,其意義和作用如下:

    -PKG_NAME -軟件包的名字, 在 menuconfig 和 ipkg 顯示
    -PKG_VERSION -軟件包的版本,主干分支的版本正是我們要下載的
    -PKG_RELEASE -這個 makefile 的版本
    -PKG_BUILD_DIR -編譯軟件包的目錄
    -PKG_SOURCE -要下載的軟件包的名字,一般是由 PKG_NAME 和 PKG_VERSION 組成
    -PKG_SOURCE_URL -下載這個軟件包的鏈接,@SF表示在sourceforge網站,@GNU表示在GNU網站
    -PKG_MD5SUM -軟件包的 MD5 值
    -PKG_CAT -解壓軟件包的方法 (zcat, bzcat, unzip)
    -PKG_BUILD_DEPENDS -需要預先構建的軟件包,但只是在構建本軟件包時,而不是運行的時候。它的語法和下面的DEPENDS一樣

  3. 編譯包定義
    用戶程序和內核模塊的定義不一樣。用戶態軟件包使用Package,內核模塊使用KernelPackage。
    用戶程序的編譯包以Package/開頭,然后接着軟件名,在Package定義中的軟件名可以與軟件包名不一樣,而且可以多個定義。下面使用$(PKG_NAME)只是做一個標示,並非真正使用它。

    Package/$(PKG_NAME)
    -SECTION - 軟件包類型 (尚未使用)
    -CATEGORY - menuconfig中軟件包所屬的一級目錄,如Network
    -SUBMENU - menuconfig中軟件包所屬的二級目錄,如dial-in/up
    -TITLE - 軟件包標題
    -DESCRIPTION - 軟件包的詳細說明
    -URL - 軟件的原始位置,一般是軟件作者的主頁
    -MAINTAINER - (optional) 軟件包維護人員
    -DEPENDS - (optional) 依賴項,運行本軟件依賴的其他包,如果存在多個依賴,則每個依賴需用空格分開。依賴前使用+號表示默認顯示,即對象沒有選中時也會顯示,使用@則默認為不顯示,即當依賴對象選中后才顯示。

    Package/$(PKG_NAME)/conffiles
    本包安裝的配置文件,一行一個。如果文件結尾使用/,則表示為目錄。用於備份配置文件說明,在sysupgrade命令執行時將會用到。

    Package/$(PKG_NAME)/description
    軟件包的詳細描述,取代前面提到的DESCRIPTION詳細描述。

    Build/Prepare
    編譯准備方法,對於網上下載的軟件包不需要再描述。對於非網上下載或自行開發的軟件包必須說明編譯准備方法。一般的准備方法為:

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

按OpenWrt的習慣,一般把自己設計的程序全部放在src目錄下。

Build/Configure
在Automake中需要進行./configure,所以本配置方法主要針對需要配置的軟件包而設計,一般自行開發的軟件包可以不在這里說明。需要使用本定義的情況,可參考dropbear。

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

軟件包的安裝方法,包括一系列拷貝編譯好的文件到指定位置。調用時會帶一個參數,就是嵌入系統的鏡像文件系統目錄,因此$(1)表示嵌入系統的鏡像目錄。一般可以采用下面的方法:

define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ $(PKG_NAME) $(1)/usr/bin/
endef

INSTALL_DIR、INSTALL_BIN在 $(TOPDIR)/rules.mk文件定義,所以本Makefile必須引入該文件
INSTALL_DIR :=install -d -m0755 意思創建所屬用戶可讀寫即執行,其他用戶可讀可執行的目錄。
INSTALL_BIN:=install -m0755意思編譯好的文件到鏡像文件目錄。
如果用戶態軟件在boot時要自動運行,則需要在安裝方法說明中增加自動運行的腳本文件安裝和配置文件安裝方法
例如:

define Package/mountd/install
$(INSTALL_DIR) $(1)/sbin/ $(1)/etc/config/ $(1)/etc/init.d/
$(INSTALL_BIN) $(PKG_BUILD_DIR)/mountd $(1)/sbin/

$(INSTALL_DATA) ./files/mountd.config $(1)/etc/config/mountd
$(INSTALL_BIN) ./files/mountd.init $(1)/etc/init.d/mountd
endef

安裝文件放在files子目錄下,不要和源代碼文件目錄src混在一起,以提高可讀性。
使用清晰的文件擴展名,更方便安裝識別文件。

Package/preinst

軟件安裝之前被執行的腳本,別忘了在第一句加上#!/bin/sh。如果腳本執行完畢要取消安裝過程,直接讓它返回false即可。

Package/postinst

軟件安裝之后被執行的腳本,別忘了在第一句加上#!/bin/sh。

Package/prerm

軟件刪除之前被執行的腳本,別忘了在第一句加上#!/bin/sh。如果腳本執行完畢要取消刪除過程,直接讓它返回false即可。

Package/postrm

軟件刪除之后被執行的腳本,別忘了在第一句加上#!/bin/sh。

OK,對於軟件包的定義已經講完啦,現在我們來看一個例子:

include $(TOPDIR)/rules.mk

PKG_NAME:=bridge
PKG_VERSION:=1.0.6
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/bridge-utils-$(PKG_VERSION)
PKG_SOURCE:=bridge-utils-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=@SF/bridge
PKG_MD5SUM:=9b7dc52656f5cbec846a7ba3299f73bd
PKG_CAT:=zcat

include $(INCLUDE_DIR)/package.mk

define Package/bridge
SECTION:=base
CATEGORY:=Network
TITLE:=Ethernet bridging configuration utility
#DESCRIPTION:=This variable is obsolete. use the Package/name/description define instead!
URL:=http://bridge.sourceforge.net/
endef

define Package/bridge/description
Ethernet bridging configuration utility
Manage ethernet bridging; a way to connect networks together to
form a larger network.
endef

define Build/Configure
$(call Build/Configure/Default,--with-linux-headers=$(LINUX_DIR))
endef

define Package/bridge/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/brctl/brctl $(1)/usr/sbin/
endef

$(eval $(call BuildPackage,bridge))

是不是很容易就看懂了呢?接下來就是創建自己想要的軟件包了,下一篇我們會說一下Openwrt創建內核模塊軟件包的方法。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com