本文參考
引入檔案
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一般在軟體包的基本資訊完成後引入
編寫軟體包的基本資訊,這些軟體包的開頭均以pkg_開頭,其意義和作用如下:
編譯包定義
使用者程式和核心模組的定義不一樣。使用者態軟體包使用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詳細描述。
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
:=1pkg_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:=
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之新增OpenWrt軟體包概述
新增軟體包 makefile引入檔案 openwrt 使用三個 makefile 的子檔案,分別為 include topdir rules.mk include include dir kernel.mk include include dir package.mk 由這些 makefile 子檔...
OpenWrt編譯軟體包
首先需要在虛擬機器上搭建好openwrt環境,具體可見我的另一篇文章 openwrt環境搭建和編譯過程 當然少數時候也需要我們自己進行編譯。我這邊以編譯snort nids 為例,列出編譯軟體包的步驟 編譯好交叉工具鏈的前提下 1 進入到openwrt主目錄。2 輸入如下命令 scripts fee...
OpenWrt增加軟體包方法
更多參考 openwrt是乙個比較完善的嵌入式linux開發平台,在無線路由器應用上已有100多個軟體包。人們可以在其基礎上增加軟體包,以擴大其應用範圍。openwrt在增加軟體方面使用極其方便,按照openwrt的約定就可以很簡單完成。1 引入檔案 openwrt使用三個makefile的子檔案,...