openwrt是乙個比較完善的嵌入式linux開發平台,在無線路由器應用上已有100多個軟體包。人們可以在其基礎上增加軟體包,以擴大其應用範圍。openwrt在增加軟體方面使用極其方便,按照openwrt的約定就可以很簡單完成。
1、引入檔案
openwrt使用三個makefile的子檔案,分別為:
include $(topdir)/rules.mk
include $(include_dir)/kernel.mk
include $(include_dir)/package.mk
由這些makefile子檔案確立軟體包加入openwrt的方式和方法。$(topdir)/rules.mk一般在makefile的開頭,$(include_dir)/kernel.mk檔案對於軟體包為核心時不可缺少,$(include_dir)/package.mk一般在軟體包的基本資訊完成後再引入。
2、編寫軟體包的基本資訊,這些軟體包的資訊均以pkg_開頭,其意思和作用如下:
pkg_name表示軟體包名稱,將在menuconfig和ipkg可以看到。
pkg_version表示軟體版本號。
pkg_release表示makefile的版本號
pkg_source表示源**的檔名。
pkg_cat表示源**檔案的解壓方法。包括zcat, bzcat, unzip等。
pkg_build_dir表示軟體包編譯目錄。它的父目錄為$(build_dir)。如果不指定,預設為$(build_dir)/$( pkg_name)$( pkg_version)。
還有一些有關原始碼的定義。
pkg_source_subdir
pkg_source_proto
pkg_source_mirror
pkg_mirror_md5sum
pkg_source_version
3、編譯包定義
使用者程式和核心模組的定義不一樣。使用者態軟體包使用package,核心模組使用kernelpackage。
3.1使用者程式編譯包定義
使用者程式的編譯包以package/開頭,然後接著軟體名,在package定義中的軟體名可以與軟體包名不一樣,而且可以多個定義。下面使用$(pkg_name)只是做乙個標示,並非真正使用$(pkg_name)。
package/$(pkg_name)
section表示包的型別,預留。
category表示分類,在menuconfig的選單下將可以找到。
title用於軟體包的簡短描述
description用於軟體包的詳細描述,已放棄使用。如果使用description將會提示「error description:= is obsolete, use package/pkg_name/description」。
maintainer表示維護者,選項。
depends表示與其他軟體的依賴。即如編譯或安裝需要其他軟體時需要說明。如果存在多個依賴,則每個依賴需用空格分開。依賴前使用+號表示預設顯示,即物件沒有選中時也會顯示,使用@則預設為不顯示,即當依賴物件選中後才顯示。
在使用者態的軟體包中沒有核心模組的autoload引數。如果軟體需要在boot時自動執行,則需要在/etc/init.d增加相應的指令碼檔案。指令碼檔案需要start引數,說明在boot時的優先順序,如果在boot過程啟動後在關閉,則需要進一步設定stop引數。如果stop引數存在,其值必須大於start。指令碼檔案需要start()和stop()兩個函式,start()是執行程式,stop()是關閉程式。關閉程式一般需要執行killall命令。由/etc/rc.d/s10boot知道,裝載核心模組的優先順序為10,需要使用自己設計的核心模組的程式其start的值必須大於10. 同樣由/etc/rc.d/s40network知道,使用網路通訊的程式其start的值必須大於40。
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必須引入$(topdir)/rules.mk檔案。
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/$(pkg_name)/preinst
軟體包安裝前處理方法,使用指令碼語言,因此定義的第一行需要下面的格式
#!/bin/sh
呼叫時帶入的引數為嵌入式系統的映象目錄。
package/$(pkg_name)/postinst
軟體包安裝後處理方法,使用指令碼語言。
package/$(pkg_name)/prerm
軟體包刪除前處理方法,使用指令碼語言
package/$(pkg_name)/postrm
軟體包刪除後處理方法,使用指令碼語言
3.2核心模組包定義
linux分為核心態和使用者態。開發者開發的核心部分可以直接加入linux的kernel程式,也可以生成核心模組以便需要時裝入核心。openwrt一般希望開發者生成核心模組,在linux啟動後自動裝載或手工使用insmod命令裝載。核心模組使用kernelpackage開頭,其他與一般軟體包基本相同。
在核心模組定義中增加
submenu表示子選單位置,在$(include)/kernel.mk對核心模組定義了category為kernel modules,所以核心模組在menuconfig中的主選單為kernel modules,然後有下一級子選單$(submenu)。在子選單下可以看到以kmod-$( pkg_name)專案。
default表示直接編入核心或產生核心模組,y表示直接編入核心,m表示產生核心模組。
autoload表示自動裝入核心,一般表示方法為:
autoload:=$(call autoload, $(priority),$(autoload_mods))
autoload的第乙個引數$(priority)為優先順序,01為最優先,99為最後裝載。有關自動裝載可以在/etc/modules.d目錄下看到,第二個引數$(autoload_mods)模組名,每個模組名以空格符分隔。即可同時裝載多個核心模組。
在開發過程最好不要使用自動裝載,經過嚴格除錯後再使用,可以減輕除錯的工作量。
4、使用定義
完成前面定義後,必須使用eval函式實現各種定義。其格式為:
對於一般軟體包
$(eval $(call package,$(pkg_name)))
或對於核心模組
$(eval $(call kernelpackage,$(pkg_name)))
如果乙個軟體包有多個程式,例如:乙個應用程式有自己的核心模組,上面使用的pkg_name需要靈活變通。eval函式可能設計多個。也可以當成多個軟體包處理。
OpenWrt增加軟體包方法
更多參考 openwrt是乙個比較完善的嵌入式linux開發平台,在無線路由器應用上已有100多個軟體包。人們可以在其基礎上增加軟體包,以擴大其應用範圍。openwrt在增加軟體方面使用極其方便,按照openwrt的約定就可以很簡單完成。1 引入檔案 openwrt使用三個makefile的子檔案,...
OpenWrt 增加 package軟體包 1
eg mkdir hello eg vim hello.c include int main void all cc cflags hello.c o hello clean rm o hello makefile for the linux wireless network device driv...
OpenWrt編譯軟體包
首先需要在虛擬機器上搭建好openwrt環境,具體可見我的另一篇文章 openwrt環境搭建和編譯過程 當然少數時候也需要我們自己進行編譯。我這邊以編譯snort nids 為例,列出編譯軟體包的步驟 編譯好交叉工具鏈的前提下 1 進入到openwrt主目錄。2 輸入如下命令 scripts fee...