OpenWrt 是一個比較完善的嵌入式 Linux 開發平臺,在 OpenWrt 中增長軟件包極其方便,按照 OpenWrt 的約定就能夠很簡單的完成。軟件包須要在 package 目錄下建立一個目錄,以包含該軟件包的各類信息和與 OpenWrt 創建聯繫的文件。而後建立一個Makefile 與 OpenWrt 創建聯繫, Makefile 須要遵循 OpenWrt 的約定。下面就簡單的說明一下具體的建立和測試過程。linux
1、源碼編譯使用模塊,用戶自定義安裝,卸載bash
一、在package下新建文件夾,其名稱通常爲你要添加的軟件包的名稱,此處爲測試特地使用別的名稱,按 OpenWrt 的習慣,通常把本身設計的程序所有放在 src 目錄下。因此,文件結構以下app
myapp/ ├── Makefile └── src ├── Makefile └── myabcd.c
二、編寫src文件下的文件內容函數
1)、myabcd.c 內容以下工具
1 #include <stdio.h> 2 #include <unistd.h> 3 4 int main(int argc, const char argv) 5 { 6 int i = 0; 7 FILE *fs; 8 fs = fopen("/dev/console", "w+"); 9 for (i = 0; ; i++) 10 { 11 fprintf(fs, "[ %02d ] This is /dev/console Test\n", i); 12 sleep(1); 13 } 14 return 0; 15 }
2)、Makefile內容以下post
1 all: mycode 2 mycode: 3 $(CC) $(CFLAGS) -o $@ myabcd.c -Wall 4 5 clean: 6 rm -f myabcd
三、上級 Makefile的寫法測試
1 ############################################## 2 # 3 # OpenWrt Makefile for mycode program 4 # 5 ############################################## 6 include $(TOPDIR)/rules.mk 7 include $(INCLUDE_DIR)/kernel.mk 8 9 PKG_NAME := mycode 10 PKG_VERSION := 0.1 11 PKG_RELEASE := 1 12 13 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) 14 15 include $(INCLUDE_DIR)/package.mk 16 17 define Package/$(PKG_NAME) 18 SECTION:=utils 19 CATEGORY:=Songshuai Package 20 SUBMENU:=Software Testing modules 21 TITLE:=This is SongShuai's test project. 22 MAINTAINER:=Songshuai 23 endef 24 25 define Package/$(PKG_NAME)/description 26 If you can't figure out what this program does, you're probably 27 brain-dead and need immediate medical attention. 28 endef 29 30 define Build/Prepare 31 mkdir -p $(PKG_BUILD_DIR) 32 $(CP) ./src/* $(PKG_BUILD_DIR)/ 33 endef 34 35 define Build/Configure 36 endef 37 38 define Build/Compile 39 $(MAKE) -C $(PKG_BUILD_DIR) \ 40 ARCH="$(LINUX_KARCH)" \ 41 CC="$(TARGET_CC)" \ 42 CFLAGS="$(TARGET_CFLAGS) -Wall" \ 43 LDFLAGS="$(TARGET_LDFLAGS)" 44 endef 45 46 define Package/$(PKG_NAME)/install 47 $(INSTALL_DIR) $(1)/app 48 $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/app/ 49 endef 50 51 $(eval $(call BuildPackage,$(PKG_NAME)))
OpenWrt 使用三個 Makefile 的子文件,分別爲:網站
1 $(TOPDIR)/rules.mk # 通常在 Makefile 的開頭, 2 $(INCLUDE_DIR)/kernel.mk # 文件對於軟件包爲內核時是不可缺乏, 3 $(INCLUDE_DIR)/package.mk # 通常在軟件包的基本信息完成後再引入。
由 這 些 Makefile 子 文 件 確 立 軟 件 包 加 入 OpenWrt 的 方 式 和 方 法 。ui
說明1、軟件包的信息均以 PKG_開頭,其意思和做用以下:this
1 PKG_NAME:示軟件包名稱,將在 menuconfig 和 ipkg 能夠看到。 2 PKG_VERSION:表示軟件包版本號。 3 PKG_RELEASE:表示 Makefile 的版本號。 4 PKG_SOURCE:表示源代碼的文件名。 5 PKG_SOURCE_URL:表示源代碼的下載網站位置。 @SF 表示在 sourceforge 網站,@GNU 表示在 GNU 網站,還有@GNOME、 @KERNEL。 6 PKG_MD5SUM:表示源代碼文件的效驗碼。用於覈對軟件包是否正確下載。 7 PKG_CAT:表示源代碼文件的解壓方法。包括 zcat, bzcat, unzip 等。 8 PKG_BUILD_DIR:表示軟件包編譯目錄。它的父目錄爲$(BUILD_DIR)。若是不指定,默認爲$(BUILD_DIR)/$( PKG_NAME)/$( PKG_VERSION)
說明2、應用程序的編譯包以 Package/ 開頭,而後接着軟件名稱,在 Package 定義中的軟件名稱能夠與軟件包名稱不同,並且能夠多個定義
1 SECTION:表示包的類型,預留。 2 CATEGORY:表示分類,在 make menuconfig 的菜單下將能夠找到。 3 TITLE:用於軟件包的簡短描述。 4 URL:表示軟件包的下載位置。 5 MAINTAINER:表示維護者,選項。 6 DEPENDS:表示與其餘軟件的依賴。即如編譯或安裝須要其餘軟件時須要說明。若是有多個依賴,則每一個依賴須要用空格分開。依賴前使用+號表示默認爲顯示,即對象沒有選中時也會顯示,使用@則默認爲不顯示,即當依賴對象選中後才顯示。
說明3、在Makefile中,package定義的說明
1 Package/$(PKG_NAME)/conffiles 本包安裝的配置文件,一行一個。若是文件結尾使用 / ,則表示爲目錄。用於備份配置文件說明,在 sysupgrade 命令執行時將會用到。 2 Package/$(PKG_NAME)/description 軟件包的詳細描述,取代 DESCRIPTION 詳細描述。 3 Build/Prepare 編譯準備方法,對於網上下載的軟件包不須要再描述。對於非網上下載或自行開發的軟件包必須說明編譯準備方法。 4 Build/Configure 在 Automake 中須要進行./configure,因此本配置方法主要針對須要配置的軟件包而設計,通常自行開發的軟件包能夠不在這裏說明。 5 Build/Compile 編譯方法,沒有特別說明的能夠不予以定義。若是不定義將使用默認的編譯方法 Build/Compile/Default。 6 Package/$(PKG_NAME)/install 軟件包的安裝方法,包括一系列拷貝編譯好的文件到指定位置。調用時會帶一個參數,就是嵌入系統的鏡像文件系統目錄,所以 $(1) 表示嵌入系統的鏡像目錄。能夠用戶自定義目錄,本例中使用的是app目錄。
INSTALL_DIR、 INSTALL_BIN 在 $(TOPDIR)/rules.mk 文件定義,基本不要額外關注。其中:
1 INSTALL_DIR :=install -d -m0755 意思是建立所屬用戶可讀寫和執行,其餘用戶可讀可執行的目錄。 2 INSTALL_BIN:=install -m0755 意思編譯好的文件存放到鏡像文件目錄。
說明:
若是用戶空間的應用軟件在 boot 時要自動運行, 則須要在安裝方法說明中增長自動運行的腳本文件安裝和配置文件安裝方法。後續在更新程序自啓動中詳細說明。
完成前面定義後,必須使用 eval 函數實現各類定義。其格式爲:
對於通常應用軟件包
$(eval $(call BuildPackage,$(PKG_NAME)))
若是一個軟件包有多個程序,例如:一個應用程序有本身的內核驅動模塊,上面使用的PKG_NAME 須要靈活變通。 eval 函數能夠設計多個。也能夠當成多個軟件包處理。
四、進行編譯,首先進行 make menuconfig 進行選擇
Songshuai Package --> Software Testing modules
這裏選擇爲 M,表示安裝成 ipk 模塊, 也能夠選擇 y 將其編譯進固件。
如今能夠單獨編譯該軟件包, 執行以下命令
$ make package/myapp/compile V=99
編譯完成後注意下生成的ipk文件的位置
或者也可使用
find . -name "mycode*"
來查找一下。
五、將編譯完成後生成的ipk傳到開發板上(如何傳請自行解決 ^^_^^ ),進行下一步的安裝和測試操做。
# opkg install mycode_0.1-1_mipsel_24kc.ipk Installing mycode (0.1-1) to root... Configuring mycode.
安裝完成後能夠將 mycode_0.1-1_mipsel_24kc.ipk 刪除了,而後進入到安裝目錄 app目錄下
測試完成,能夠經過指令卸載
# opkg remove mycode Removing package mycode from root...
卸載完成後,在/app/目錄下,也會刪除mycode可執行程序文件。
好奇心促使下面的內容誕生:
在網上看到大佬們一直在說preinst、postinst、prerm、postrm的,由於不知道具體的實際使用的場合,此處也是知足一下本身的好奇心,特地試了一下,在上面的 Makefile 中 $(eval $(call BuildPackage,$(PKG_NAME))) 以前添加以下內容
1 define Package/$(PKG_NAME)/preinst 2 #!/bin/bash 3 echo 'installing $(PKG_NAME)' 4 endef 5 6 define Package/$(PKG_NAME)/postinst 7 #!/bin/bash 8 echo '$(PKG_NAME) installed successed !' 9 endef 10 11 define Package/$(PKG_NAME)/prerm 12 #!/bin/bash 13 echo 'removeing $(PKG_NAME)' 14 endef 15 16 define Package/$(PKG_NAME)/postrm 17 #!/bin/bash 18 echo '$(PKG_NAME) remove successed !' 19 endef
說明:
由於筆記的開發板上支持bash,因此此處使用的bash,可是Openwrt默認是使用ash,能夠將bash替換成ash進行測試。
而後 編譯、上傳到開發板,以後進行安裝
1 # opkg install mycode_0.1-1_mipsel_24kc.ipk 2 Installing mycode (0.1-1) to root... 3 installing mycode 4 Configuring mycode. 5 mycode installed successed ! 6 # ls /app/ 7 mycode 8 # opkg remove mycode 9 Removing package mycode from root... 10 removeing mycode 11 mycode remove successed !
含義說明:
1 Package/$(PKG_NAME)/preinst 軟件包安裝前處理方法,使用腳本語言,調用時帶入的參數爲嵌入式系統的鏡像目錄。 2 Package/$(PKG_NAME)/postinst 軟件包安裝後處理方法,使用腳本語言。 3 Package/$(PKG_NAME)/prerm 軟件包刪除前處理方法,使用腳本語言。 4 Package/$(PKG_NAME)/postrm 軟件包刪除後處理方法,使用腳本語言。
2、編譯源碼,直接編譯到內核中
進行 make menuconfig 進行選擇 y 將其編譯進固件。
此時須要進行整個openwrt的全編譯,使用
$ make V=99
進行編譯,編譯完成後,從新燒寫內核文件便可,內核啓動完成,能夠直接在/app/目錄下看到 mycode 可執行程序的文件。
3、不使用源碼編譯
固然 ,若是不想這麼麻煩的編輯Makefile,那麼關於用戶自定義添加的軟件包的方法,還有另一種比較省事情的方法,就是將經過交叉編譯(個人交叉編譯工具鏈爲mipsel-openwrt-linux-gcc)完成的可執行程序文件 (好比本歷程中的 mycode )直接放置在目錄下package/base-files/files/app/,而後編譯內核文件,再進行燒寫便可,以後,可執行程序文件mycode也存在/app/下。
具體步驟以及指令可使用:
1 $ mipsel-openwrt-linux-gcc myabcd.c -o mycode 2 $ cp mycode ~/openwrt/package/base-files/files/app/ 3 $ make V=99
此效果與上面的 二 的效果同樣。