添加軟件包 IPK

一個實(shí)際的Makefile

include $(TOPDIR)/rules.mk

PKG_NAME:=capture-data
PKG_RELEASE:=1

PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/capture-data
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=capture-data -- prints a snarky message
    DEPENDS:=+libxxx +xxlib +libxxx +libxxx        # 需要的庫
    
endef

define Package/capture-data/description
        If you can't figure out what this program does, you're probably
        brain-dead and need immediate medical attention.
endef
 
define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Package/capture-data/install
    $(INSTALL_DIR) $(1)/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/capture-data $(1)/bin/
endef

$(eval $(call BuildPackage,capture-data))

引入文件

OpenWrt 使用三個 makefile 的子文件,分別為:

  • include $(TOPDIR)/rules.mk
    • $(TOPDIR)/rules.mk 一般在 Makefile 的開頭,
  • include $(INCLUDE_DIR)/kernel.mk
    • $(INCLUDE_DIR)/kernel.mk 文件對于軟件包為內(nèi)核時是不可缺少链蕊,
  • include $(INCLUDE_DIR)/package.mk
    • $(INCLUDE_DIR)/package.mk 一般在軟件包的基本信息完成后再引入搂抒。

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

編寫軟件包的基本信息

軟件包的信息均以 PKG_開頭寿酌,其意思和作用如下:

  • PKG_NAME 表示軟件包名稱因痛,將在 menuconfig 和 ipkg 可以看到婚苹。
  • PKG_VERSION 表示軟件包版本號。
  • PKG_RELEASE 表示 Makefile 的版本號鸵膏。
  • PKG_SOURCE 表示源代碼的文件名膊升。
  • PKG_SOURCE_URL 表示源代碼的下載網(wǎng)站位置。
    • @SF 表示在 sourceforge 網(wǎng)站谭企,
    • @GNU 表示在 GNU 網(wǎng)站廓译,
    • @GNOME评肆、 @KERNEL。
  • PKG_MD5SUM 表示源代碼文件的效驗(yàn)碼非区。用于核對軟件包是否正確下載瓜挽。
  • PKG_CAT 表示源代碼文件的解壓方法。包括 zcat, bzcat, unzip 等征绸。
  • PKG_BUILD_DIR 表示軟件包編譯目錄久橙。它的父目錄為$(BUILD_DIR)。如果不指定管怠,
    默認(rèn)為$(BUILD_DIR)/$( PKG_NAME)/$( PKG_VERSION)淆衷。
  • 編譯包定義
    應(yīng)用程序和內(nèi)核驅(qū)動模塊的定義不一樣。
    • 應(yīng)用程序軟件包使用 Package渤弛,
    • 內(nèi)核驅(qū)動模塊使用 KernelPackage祝拯。
應(yīng)用程序編譯包定義

應(yīng)用程序的編譯包以 Package/開頭,然后接著軟件名她肯,在 Package 定義中的軟件名
可以與軟件包名不一樣佳头,而且可以多個定義。
下面使用$(PKG_NAME)只是做一個標(biāo)示晴氨,并非真正使用$(PKG_NAME)康嘉,如 Package/$(PKG_NAME)。
1. SECTION 表示包的類型瑞筐,預(yù)留凄鼻。
2. CATEGORY 表示分類腊瑟,在 make menuconfig 的菜單下將可以找到聚假。
3. TITLE 用于軟件包的簡短描述。
4. DESCRIPTION 用于軟件包的詳細(xì)描述闰非,已放棄使用膘格。
如果使用 DESCRIPTION 將會提示“ error DESCRIPTION:= is obsolete, use Package/PKG_NAME/description”。URL 表示軟件包的下載位置财松。
5. MAINTAINER 表示維護(hù)者瘪贱,選項(xiàng)。
6. DEPENDS 表示與其他軟件的依賴辆毡。即如編譯或安裝需要其他軟件時需要說明菜秦。
如果存在多個依賴,則每個依賴需要用空格分開舶掖。
依賴前使用+號表示默認(rèn)為顯示球昨,即對象沒有選中時也會顯示,使用@則默認(rèn)為不顯示眨攘,即當(dāng)依賴對象選中后才顯示主慰。
在用戶空間的應(yīng)用程序軟件包中沒有內(nèi)核驅(qū)動模塊的 AUTOLOAD 參數(shù)嚣州。
如果應(yīng)用軟件需要在 boot 時自動運(yùn)行,則需要在/etc/init.d 中增加相應(yīng)的腳本文件共螺。
腳本文件需要START 參數(shù)该肴,說明在 boot 時的優(yōu)先級, 如果在 boot 過程啟動后再關(guān)閉藐不,則需要進(jìn)一步設(shè)置 STOP 參數(shù)匀哄。
如果 STOP 參數(shù)存在, 其值必須大于 START雏蛮。
腳本文件需要 start()和 stop()兩個函數(shù)拱雏, start()是執(zhí)行程序, stop()是關(guān)閉程序底扳。
關(guān)閉程序一般需要執(zhí)行 killall 命令铸抑。
由/etc/rc.d/S10boot 知道,裝載內(nèi)核驅(qū)動模塊的優(yōu)先級為 10衷模,
需要使用自己設(shè)計的內(nèi)核驅(qū)動模塊的程序其 START 的值必須大于 10鹊汛。
同樣由/etc/rc.d/S40network 知道, 使用網(wǎng)絡(luò)通信的程序其 START 的值必須大于 40阱冶。
Package/$(PKG_NAME)/conffiles
本包安裝的配置文件刁憋,一行一個。如果文件結(jié)尾使用/木蹬,則表示為目錄至耻。
用于備份配置文件說明,在 sysupgrade 命令執(zhí)行時將會用到镊叁。
Package/$(PKG_NAME)/description
軟件包的詳細(xì)描述尘颓,取代前面提到的 DESCRIPTION 詳細(xì)描述。
Build/Prepare
編譯準(zhǔn)備方法晦譬,對于網(wǎng)上下載的軟件包不需要再描述疤苹。對于非網(wǎng)上下載或自行開發(fā)的軟
件包必須說明編譯準(zhǔn)備方法。一般的準(zhǔn)備方法為:

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

按 OpenWrt 的習(xí)慣敛腌,一般把自己設(shè)計的程序全部放在 src 目錄下卧土。
Build/Configure
在 Automake 中需要進(jìn)行./configure,所以本配置方法主要針對需要配置的軟件包而設(shè)計像樊,
一般自行開發(fā)的軟件包可以不在這里說明尤莺。需要使用本定義的情況,可參考dropbear生棍。
Build/Compile 編譯方法颤霎,沒有特別說明的可以不予以定義。
如果不定義將使用默認(rèn)的編譯方法 Build/Compile/Default。
自行開發(fā)的軟件包可以考慮使用下面的定義捷绑。

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

Package/$(PKG_NAME)/install
軟件包的安裝方法韩脑,包括一系列拷貝編譯好的文件到指定位置。
調(diào)用時會帶一個參數(shù)粹污,就是嵌入系統(tǒng)的鏡像文件系統(tǒng)目錄段多,因此$(1)表示嵌入系統(tǒng)的鏡像目錄。
一般可以采用下面的方法:

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
必須引入$(TOPDIR)/rules.mk 文件。
INSTALL_DIR :=install -d -m0755 意思是創(chuàng)建所屬用戶可讀寫和執(zhí)行鸭叙,其他用戶可讀可執(zhí)行的目錄觉啊。
INSTALL_BIN:=install -m0755 意思編譯好的文件存放到鏡像文件目錄。
如果用戶空間的應(yīng)用軟件在 boot 時要自動運(yùn)行沈贝,
則需要在安裝方法說明中增加自動運(yùn)行的腳本文件安裝和配置文件安裝方法杠人。 例如:

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 混在一起宋下,以提高可讀性嗡善。

使用清晰的文件擴(kuò)展名,更方便安裝識別文件学歧。
Package/$(PKG_NAME)/preinst
軟件包安裝前處理方法罩引,使用腳本語言,因此定義的第一行需要下面的格式

#!/bin/sh
調(diào)用時帶入的參數(shù)為嵌入式系統(tǒng)的鏡像目錄枝笨。
Package/$(PKG_NAME)/postinst
軟件包安裝后處理方法袁铐,使用腳本語言。
Package/$(PKG_NAME)/prerm
軟件包刪除前處理方法横浑,使用腳本語言剔桨。
Package/$(PKG_NAME)/postrm
軟件包刪除后處理方法,使用腳本語言伪嫁。
內(nèi)核驅(qū)動模塊包定義

Linux 分為內(nèi)核空間和用戶空間领炫。
開發(fā)者開發(fā)的內(nèi)核部分可以直接加入 Linux 的 Kernel 程序,也可以生成內(nèi)核模塊以便需要時裝入內(nèi)核张咳。
OpenWrt 一般希望開發(fā)者生成內(nèi)核模塊,在 Linux 啟動后自動裝載或手工使用 insmod 命令裝載似舵。
內(nèi)核模塊使用KernelPackage 開頭脚猾,其他與一般應(yīng)用軟件包基本相同。
在內(nèi)核驅(qū)動模塊定義中增加了:
SUBMENU 表示子菜單位置 砚哗,在 $(INCLUDE)/kernel.mk對內(nèi)核模塊定義了
CATEGORY 為 kernel modules龙助,所以內(nèi)核模塊在 menuconfig 中的主菜單為 kernel
modules , 然 后 有 下 一 級 子 菜 單 $(SUBMENU) 。 在子菜單下可以看到以
kmod-$(PKG_NAME)項(xiàng)目提鸟。
DEFAULT 表示直接編入內(nèi)核或產(chǎn)生內(nèi)核模塊军援,y 表示直接編入內(nèi)核,m 表示產(chǎn)生內(nèi)核模塊称勋。
AUTOLOAD 表示自動裝入內(nèi)核胸哥,一般表示方法為:
AUTOLOAD:=$(call AutoLoad, $(PRIORITY),$(AUTOLOAD_MODS))
AutoLoad 的第一個參數(shù)$(PRIORITY)為優(yōu)先級,01 為最優(yōu)先赡鲜,99 為最后裝載空厌。有
關(guān)自動裝載可以在/etc/modules.d 目錄下看到,第二個參數(shù)$(AUTOLOAD_MODS)模塊
名银酬,每個模塊名以空格符分隔嘲更。即可同時裝載多個內(nèi)核模塊。
在開發(fā)過程最好不要使用自動裝載揩瞪,經(jīng)過嚴(yán)格調(diào)試后再使用赋朦,可以減輕調(diào)試的工作量。

使用定義

完成前面定義后李破,必須使用 eval 函數(shù)實(shí)現(xiàn)各種定義北发。
其格式為:

  • 對于一般應(yīng)用軟件包
    $(eval $(call Package,$(PKG_NAME)))
  • 內(nèi)核驅(qū)動模塊
    $(eval $(call KernelPackage,$(PKG_NAME)))
    如果一個軟件包有多個程序,例如:一個應(yīng)用程序有自己的內(nèi)核驅(qū)動模塊喷屋,上面使用的PKG_NAME 需要靈活變通琳拨。
    eval 函數(shù)可以設(shè)計多個。也可以當(dāng)成多個軟件包處理屯曹。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狱庇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恶耽,更是在濱河造成了極大的恐慌密任,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偷俭,死亡現(xiàn)場離奇詭異浪讳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)涌萤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門淹遵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人负溪,你說我怎么就攤上這事透揣。” “怎么了川抡?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵辐真,是天一觀的道長。 經(jīng)常有香客問我,道長侍咱,這世上最難降的妖魔是什么耐床? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮楔脯,結(jié)果婚禮上撩轰,老公的妹妹穿的比我還像新娘。我一直安慰自己淤年,他們只是感情好钧敞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著麸粮,像睡著了一般溉苛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弄诲,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天愚战,我揣著相機(jī)與錄音,去河邊找鬼齐遵。 笑死寂玲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梗摇。 我是一名探鬼主播拓哟,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伶授!你這毒婦竟也來了断序?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤糜烹,失蹤者是張志新(化名)和其女友劉穎违诗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疮蹦,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诸迟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年跃脊,在試婚紗的時候發(fā)現(xiàn)自己被綠了热押。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡洲拇,死狀恐怖妆毕,靈堂內(nèi)的尸體忽然破棺而出慎玖,到底是詐尸還是另有隱情,我是刑警寧澤笛粘,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響薪前,放射性物質(zhì)發(fā)生泄漏润努。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一示括、第九天 我趴在偏房一處隱蔽的房頂上張望铺浇。 院中可真熱鬧,春花似錦垛膝、人聲如沸鳍侣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倚聚。三九已至,卻和暖如春凿可,著一層夾襖步出監(jiān)牢的瞬間惑折,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工枯跑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惨驶,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓敛助,卻偏偏與公主長得像粗卜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纳击,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 主要思路: 了解openwrt的目錄框架結(jié)構(gòu)续扔,往其中添加所需軟件功能xxx模塊 編寫package/xxx/目錄下...
    jrglinux閱讀 4,267評論 3 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)评疗,斷路器测砂,智...
    卡卡羅2017閱讀 134,626評論 18 139
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,362評論 0 17
  • 晨暉已灑到我的窗邊 我撿起他們 當(dāng)作我的早餐 我也將這份早餐 送到了你的身邊
    凱哥天下第一哥閱讀 121評論 0 0
  • 夜百匆。月黑風(fēng)高砌些。林員外家的后花園中,一條黑影從高高的院墻上躍下加匈,悄無聲息地向林家小姐的閨房那邊掠去存璃。哈!果然中計雕拼!緊...
    離離萱閱讀 323評論 0 0