|
一個(gè)RPM的軟件包描述文件,可以僅生成一個(gè)父包或一個(gè)子包,也可以生成一個(gè)父包和多個(gè)子包。通過設(shè)定子包選項(xiàng),可以使生成的子包采用"軟件名-子包名"的標(biāo)準(zhǔn)命名,也可使生成的子包采用自己的名字。一個(gè)子包,通常是按照其包含的文件的用途或類型來歸并文件進(jìn)而打成包裹的。象前面的LZE描述文件很簡單,它將所有文件都包含進(jìn)了父包中。我們也可以將文件分類作成子軟件包,如可分成執(zhí)行程序子包(lze-bin),配置文件子包(lze-config)和說明文檔包(lze-doc)。我們還可以只分出一個(gè)配置文件子包(lze-config),其余文件均打入父包中(lze)。通過這樣詳細(xì)地分類,有助于用戶管理軟件包,避免安裝多余的東西,同時(shí)也有助于升級。
要想創(chuàng)建子軟件包,必須描述以下內(nèi)容: 1. %package : 用此段創(chuàng)建一個(gè)子包。其名字由子包選項(xiàng)控制。子包選項(xiàng)為"[-n] 子包名",不選-n時(shí),生成的子包文件為"軟件名-子包名-版本號-釋出號.體系.rpm";選-n時(shí),生成的子包文件為"子包名-版本號-釋出號.體系.rpm"。其應(yīng)用格式為:
2. Summary 此域必須在%package下面,它定義子包功能簡介(一句話說明)。格式為:
3. Group 此域必須在%package下面,其定義子包所屬軟件類別(軟件類別請參見<<精通RPM之五——查詢篇>>)。格式為:
4. %description : 此描述段的內(nèi)容是較為詳細(xì)的子包功能介紹,介紹為文本形式,格式不作要求,可任意換行或分段。格式為:
5. %files : 此文件段的內(nèi)容是子包所要包含的文件列表。文件列表中,一個(gè)文件占用一行,還可使用多種文件修飾符。(詳見<<精通RPM之七——制作篇(上)>>) 段名應(yīng)用格式為:
注意: 上述%description與%files段所用的子包選項(xiàng)形式,必須與%package所用的子包選項(xiàng)形式一致,否則的話,它們定義的不是同一個(gè)子包,RPM檢查時(shí)將報(bào)錯(cuò)退出。如定義過%package name后,描述段名須用%description name,文件段名須用%files name方可。而用%description -n name則不行,%files -n name也不行。 子軟件包也可使用%pre,%post,%preun,%postun,%triggerin,%triggerun和%triggerpostun等七個(gè)可選的功能段,因?yàn)樗鼈兌伎墒褂米影x項(xiàng)。當(dāng)使用子包選項(xiàng)時(shí),它們的段內(nèi)容就是用來管理子軟件包的腳本程序。要注意的是,這些段使用的子包選項(xiàng)形式也必須與%package段使用的子包選項(xiàng)形式一致。 條件語句的使用 在軟件包描述文件中,可以靈活地使用條件語句,位置不限制。這些語句,用于當(dāng)前體系與操作系統(tǒng)的判斷,當(dāng)條件為真或?yàn)榧贂r(shí),RPM均會(huì)引用其相應(yīng)的描述內(nèi)容。 條件語句有兩種格式:
注: {}所括內(nèi)容必選其中之一,[]所括為可選項(xiàng),各個(gè)值之間以空格分隔,%endif表示條件語句結(jié)束。 此語句的含義是: 1) 使用%ifarch時(shí),表示如果當(dāng)前體系為值1或值2...,則引用描述內(nèi)容。 2) 使用%ifnarch時(shí),表示如果當(dāng)前體系不為值1或值2...,則引用描述內(nèi)容。 3) 使用%ifos時(shí),表示如果當(dāng)前操作系統(tǒng)為值1或值2...,則引用描述內(nèi)容。 4) 使用%ifnos時(shí),表示如果當(dāng)前操作系統(tǒng)不為值1或值2...,則引用描述內(nèi)容。 如果想在LZE包描述文件的文件段增加只適用于sparc體系的文件/etc/sparc.lze和 /etc/sparc.ime,則可在文件段內(nèi)加入如下語句:
這樣做以后,如果當(dāng)前體系為sparc,則RPM在打包時(shí)會(huì)加入這兩個(gè)文件。
注: {}所括內(nèi)容必選其中之一,[]所括為可選項(xiàng),各個(gè)值之間以空格分隔,%else表示另外一種情況,%endif表示條件語句結(jié)束。 此語句的含義是: 1) 使用%ifarch時(shí),表示如果當(dāng)前體系為值1或值2...,則引用描述內(nèi)容1,否則引用描述 內(nèi)容2。 2) 使用%ifnarch時(shí),表示如果當(dāng)前體系不為值1或值2...,則引用描述內(nèi)容1,否則引用描述內(nèi)容2。 3) 使用%ifos時(shí),表示如果當(dāng)前操作系統(tǒng)為值1或值2...,則引用描述內(nèi)容1,否則引用描述內(nèi)容2。 4) 使用%ifnos時(shí),表示如果當(dāng)前操作系統(tǒng)不為值1或值2...,則引用描述內(nèi)容1,否則引用描述內(nèi)容2。 如果想根據(jù)當(dāng)前操作系統(tǒng)來確定LZE包的名字,則可在描述文件頭使用如下語句定義Name域:
本例中使用了嵌套的條件語句,它說明的情況是:如果操作系統(tǒng)為linux,則軟件名定為lzeforlinux,如果操作系統(tǒng)為aix,則軟件名定為lzeforaix,如果不是上述兩個(gè)操作系統(tǒng),則將軟件名定為lzeforothersys。 如何在描述文件中使用宏(macros) 1. 宏是什么? 學(xué)過C語言的人都知道,宏是用來實(shí)現(xiàn)文本替換的,即定義了宏名與宏體后,文件中所有有宏名的地方在預(yù)處理時(shí)將被宏體替換掉。使用宏可以減少文字的錄入量,方便了編程人員。在軟件包描述文件中使用宏,也是基于這個(gè)目的,只不過這個(gè)宏與C語言的宏定義格式不同而已。 2. 宏的定義 描述文件中宏的定義格式為:
注: []所括為可選項(xiàng)。<name>為宏名,宏名可用字母,數(shù)字和下劃線(_),并且其長度最小為3。opts為一個(gè)或多個(gè)選項(xiàng),各選項(xiàng)之間無分隔,選項(xiàng)采用getopt函數(shù)要求的形式,即選項(xiàng)為單個(gè)字符,如果某個(gè)選項(xiàng)需要參數(shù),則需要在這個(gè)選項(xiàng)后加個(gè)冒號(:)。<body>為宏體,它周圍的空字符將被刪掉。宏體的內(nèi)容須在一行上。 如沒有選項(xiàng)的宏定義:
如僅有一個(gè)選項(xiàng)的宏定義:
3. 宏的使用 宏的使用格式為:
或
注: []所括為可選項(xiàng);<name>為所應(yīng)用的宏名,宏名可以用{}括住;opt1,opt2...為選項(xiàng),均須以減號(-)開頭,并且如果選項(xiàng)需要參數(shù),則必須提供一個(gè)選項(xiàng)參數(shù);arg1,arg2...則為宏的參數(shù)。 如上面定義的xxx宏,可這樣使用:
例子中,xxx宏使用一個(gè)選項(xiàng)-p,zhsoft為-p選項(xiàng)的參數(shù),還有兩個(gè)宏的參數(shù)hello和world。 注意: 宏使用時(shí)最好多換一行(即宏下面空一行),因?yàn)楹暝跀U(kuò)展后并不換行,這樣如果不多換行,則下面一行若有內(nèi)容的話,宏擴(kuò)展后的內(nèi)容將和下面一行的內(nèi)容合并在一起,極容易出現(xiàn)錯(cuò)誤。這也是筆者發(fā)現(xiàn)RPM宏的問題之一。還有一個(gè)問題,如果注釋行上存在宏,則這個(gè)宏也將擴(kuò)展,錯(cuò)矣!因?yàn)樽⑨尡緛砭褪且雎缘舻?有宏也不必再擴(kuò)展了。這兩個(gè)問題都需要引起RPM開發(fā)者的注意,并切實(shí)加以解決。 4. 宏體專用的宏 宏體中可使用如下專用的宏:(類似SHELL形式的宏) 1) %0 : 表示所在宏的宏名; 2) %* : 表示宏的所有參數(shù); 3) %# : 表示宏的參數(shù)個(gè)數(shù); 4) %{-f} : 表示如果宏使用了-f選項(xiàng),則它表示-f及其選項(xiàng)參數(shù); 5) %{-f*} : 表示如果宏使用了-f選項(xiàng),則它表示-f所帶的參數(shù); 6) %{-f:X} : 表示如果宏使用了-f選項(xiàng),則它表示X; 7) %{!-f:Y} : 表示如果宏沒有使用-f選項(xiàng),則它表示Y; 8) %1,%2,... : 表示宏的參數(shù)1,參數(shù)2... 如,上例中xxx宏執(zhí)行時(shí),若宏體中有上述專用的宏,則專用宏將會(huì)擴(kuò)展為: 1) %0擴(kuò)展為xxx; 2) %*擴(kuò)展為hello world; 3) %#擴(kuò)展為2; 4) %{-p}擴(kuò)展為-p zhsoft; 5) %{-p*}擴(kuò)展為zhsoft; 6) %{-p:good}擴(kuò)展為good; 7) %{!-Z:bad}擴(kuò)展為bad; (因?yàn)閤xx宏未使用-Z選項(xiàng)) 8) %1為hello,%2為world,沒有其它參數(shù)。 5. 系統(tǒng)內(nèi)置的宏 系統(tǒng)內(nèi)置的宏可分如下三類: 5.1 定義類 1) %define ... : 定義一個(gè)宏;(原來,%define也是一個(gè)宏啊) 2) %undefine ... : 取消一個(gè)宏;(宏取消后,此語句下面的描述文件就不能再使用這個(gè)宏了,即使使用,該宏也不會(huì)被擴(kuò)展了) 5.2 調(diào)試類 1) %trace : 打印宏擴(kuò)展前后的調(diào)試信息; 2) %dump : 打印活動(dòng)的宏(宏名及宏體); 3) %{echo:...} : 打印...到標(biāo)準(zhǔn)錯(cuò)誤設(shè)備; 4) %{warn:...} : 打印...到標(biāo)準(zhǔn)錯(cuò)誤設(shè)備; 5) %{error:...} : 打印...到標(biāo)準(zhǔn)錯(cuò)誤設(shè)備,并且返回BADSPEC值; 5.3 特殊類 這類宏的默認(rèn)值通常放在/usr/lib/rpm/macros文件中,用戶通過編輯自己主目錄(HOME)下的.rpmmacros文件(~/.rpmmacros),可重定義這類宏,改變其默認(rèn)值,以供RPM在軟件包制作,安裝及查詢時(shí)使用自己的定義。 這類宏的定義格式為:
注: <name>為宏名,<body>為宏體。 1) %packager,%vendor,%distribution : 這三個(gè)宏用于定義描述文件中Packager,Vendor,Distribution三個(gè)可選域的默認(rèn)的域值,即如果這三個(gè)域中有哪個(gè)未在描述文件中定義,且其相對應(yīng)的宏有定義,則RPM會(huì)采用其對應(yīng)的宏的宏體。 如我的~/.rpmmacros文件中有這樣三行:
這樣,軟件包描述文件中再也不用定義那三個(gè)域了,由此制作出來的軟件包在查詢時(shí),其打包者(Packager),銷售商(Vendor)及發(fā)行版(Distribution)均自動(dòng)搞定了,一勞永逸。 2) %buildroot,%_provides : 這兩個(gè)宏定義軟件包建包時(shí)用的根目錄及軟件包所提供的功能。它們在打包時(shí)不會(huì)象 上面那三個(gè)宏一樣主動(dòng)被RPM采用,而是必須在描述文件中寫那么幾行。即:
3) %_topdir,%_builddir,%_rpmdir,%_sourcedir,%_specdir,%_srcrpmdir : 這六個(gè)宏都是RPM制作軟件包時(shí)要用的,它們在/usr/lib/rpm/macros文件中的默認(rèn)值為:
%_topdir宏定義的是RPM制作軟件包時(shí)所用目錄的頂層目錄,一般為/usr/src/dist(%{_usrsrc} 宏的值為/usr/src)。在頂層目錄下面,又有五個(gè)子目錄:
同時(shí),在此宏定義的目錄下面建立了RPM所需的子目錄,使用命令為:
命令中的i386是RPM默認(rèn)的體系名,RPM生成的執(zhí)行程序包是存放在“RPMS/體系名”目錄下面的。這么做以后,我就可以在自己的目錄下制作RPM軟件包了,象超級用戶一樣自由。 4)%_excludedocs,%_ftpport,%_ftpproxy,%_httpport,%_httpproxy,%_netsharepath : 這六個(gè)宏對RPM軟件包的安裝和查詢起作用。
這種宏的用法是:
它的結(jié)果是取指定的SHELL命令的標(biāo)準(zhǔn)輸出的結(jié)果作為描述文件內(nèi)容的一部分。如軟件包描述文件的某個(gè)部分需要加上當(dāng)前日期,則可以用:
執(zhí)行后,該宏將擴(kuò)展為類似2001-10-31的日期數(shù)據(jù)。用戶不妨在自己的描述文件的預(yù)處理段(%prep)內(nèi)加上這么兩行試試:
注: exit 1用于中止RPM的執(zhí)行。 描述文件模板 以下所有描述文件模板均以LZE軟件包制作為例,以源程序現(xiàn)場編譯后產(chǎn)生的文件為準(zhǔn)生成軟件包。描述文件中一般只描述必要的部分。另外,如果文件段的所有文件已存在于系統(tǒng)中,并且想直接利用打包,則可以去掉Source域,去掉RPM建包用功能段(%prep,%build,%install,%clean)。 1. 只有父包,沒有任何子包: 此描述文件見<<精通RPM之七——制作篇(上)>>。此文件中還可以去掉幾個(gè)可選的功能段, 如%pre,%post,%preun,%postun,%triggerin,%triggerun,%triggerpostun。這幾個(gè)段在此文件中無實(shí)質(zhì)用途,執(zhí)行時(shí)僅顯示RPM開始執(zhí)行某個(gè)腳本程序的信息。此描述文件僅生成軟件包lze-6.0-2.i386.rpm(父包)。 2. 有父包,也有子包: 描述文件如下: 1 # 文件名稱: lze-6.0-2.spec1 2 # 文件功能: lze軟件包描述信息 3 # 文件作者: 縱橫軟件制作中心雨亦奇 國防大學(xué)研究生二隊(duì)趙建利 4 # 修改時(shí)間: 2001.10.31 5 6 Name: lze 7 Version: 6.0 8 Release: 2 9 Summary: 小趙全屏幕中英文多窗口多功能編輯器(LINUX/UNIX系統(tǒng)適用) 10 Group: Applications/Editors 11 License: Share 12 Source: http://zhsoft./lze-6.0-2.src.tgz 13 14 %description 15 小趙編輯器,是為使用SCO UNIX,LINUX多用戶系統(tǒng)的廣大用戶專門設(shè)計(jì)的全屏幕多窗 16 口中英文多功能編輯器。 17 它主要有以下十大特點(diǎn):1.全屏幕菜單操作。2.顯示方式多樣。3.塊操作豐富。4.十 18 字制表功能強(qiáng)大。5.多窗口操作靈活自如。6.文件操作功能齊全。7.解釋輸出功能獨(dú)具特 19 色。8.自帶中文輸入法(增強(qiáng)五筆和增強(qiáng)拼音),實(shí)用方便。9.十六進(jìn)制編輯功能,如虎 20 添翼。10.即時(shí)翻譯,按到即譯。 21 總之,小趙編輯器會(huì)成為您在UNIX,LINUX系統(tǒng)上編制程序和書寫一般性文稿的好幫手。 22 它將在工作中助您一臂之力,輕松上陣,游刃有余! 23 24 %prep 25 echo "預(yù)處理腳本程序(prep)開始執(zhí)行" 26 %setup 27 28 %build 29 echo "編譯連接腳本程序(build)開始執(zhí)行" 30 make 31 32 %install 33 echo "安裝腳本程序(install)開始執(zhí)行" 34 make install 35 36 # 配置文件子包 37 %package config 38 summary : 小趙編輯器LZE的配置文件 39 group : Applications/Editors 40 41 %description config 42 小趙編輯器用配置文件包括功能鍵定義文件與 43 輸入法控制文件,用戶可根據(jù)實(shí)際情況加以修改。 44 45 %files config 46 %config /etc/funkey.def 47 %config /etc/inputme.def 48 49 # 說明文檔子包 50 %package doc 51 summary : 小趙編輯器LZE的說明文檔 52 group : Applications/Editors 53 54 %description doc 55 小趙編輯器說明文檔,詳細(xì)介紹了該編輯器的 56 命令行用法及內(nèi)置的各項(xiàng)菜單的功能與操作,對用 57 戶熟悉小趙編輯器有很大作用。 58 59 %files doc 60 %doc /usr/doc/lze-6.0/README 61 %doc /usr/doc/lze-6.0/LICENSE 62 63 # 父包文件段 64 %files 65 %defattr (-,root,root) 66 /usr/bin/lze 67 /usr/bin/lzeime.py 68 /usr/bin/lzeime.wb 69 /etc/wbzc.dat 70 此描述文件生成軟件包有:lze-6.0-2.i386.rpm(父包),lze-config-6.0-2.i386.rpm(配置文件子包)和lze-doc-6.0-2.i386.rpm(說明文檔子包)。 3. 沒有父包,只有子包: 沒有父包,意味著描述文件中可以沒有父包的文件段(%files),請看下面的描述文件: 1 # 文件名稱: lze-6.0-2.spec2 2 # 文件功能: lze軟件包描述信息 3 # 文件作者: 縱橫軟件制作中心雨亦奇 國防大學(xué)研究生二隊(duì)趙建利 4 # 修改時(shí)間: 2001.10.31 5 6 Name: lze 7 Version: 6.0 8 Release: 2 9 Summary: 小趙全屏幕中英文多窗口多功能編輯器(LINUX/UNIX系統(tǒng)適用) 10 Group: Applications/Editors 11 License: Share 12 Source: http://zhsoft./lze-6.0-2.src.tgz 13 14 %description 15 小趙編輯器,是為使用SCO UNIX,LINUX多用戶系統(tǒng)的廣大用戶專門設(shè)計(jì)的全屏幕多窗 16 口中英文多功能編輯器。 17 它主要有以下十大特點(diǎn):1.全屏幕菜單操作。2.顯示方式多樣。3.塊操作豐富。4.十 18 字制表功能強(qiáng)大。5.多窗口操作靈活自如。6.文件操作功能齊全。7.解釋輸出功能獨(dú)具特 19 色。8.自帶中文輸入法(增強(qiáng)五筆和增強(qiáng)拼音),實(shí)用方便。9.十六進(jìn)制編輯功能,如虎 20 添翼。10.即時(shí)翻譯,按到即譯。 21 總之,小趙編輯器會(huì)成為您在UNIX,LINUX系統(tǒng)上編制程序和書寫一般性文稿的好幫手。 22 它將在工作中助您一臂之力,輕松上陣,游刃有余! 23 24 %prep 25 echo "預(yù)處理腳本程序(prep)開始執(zhí)行" 26 %setup 27 28 %build 29 echo "編譯連接腳本程序(build)開始執(zhí)行" 30 make 31 32 %install 33 echo "安裝腳本程序(install)開始執(zhí)行" 34 make install 35 36 # 配置文件子包 37 %package config 38 summary : 小趙編輯器LZE的配置文件 39 group : Applications/Editors 40 41 %description config 42 小趙編輯器用配置文件包括功能鍵定義文件與 43 輸入法控制文件,用戶可根據(jù)實(shí)際情況加以修改。 44 45 %files config 46 %config /etc/funkey.def 47 %config /etc/inputme.def 48 49 # 說明文檔子包 50 %package doc 51 summary : 小趙編輯器LZE的說明文檔 52 group : Applications/Editors 53 54 %description doc 55 小趙編輯器說明文檔,詳細(xì)介紹了該編輯器的 56 命令行用法及內(nèi)置的各項(xiàng)菜單的功能與操作,對用 57 戶熟悉小趙編輯器有很大作用。 58 59 %files doc 60 %doc /usr/doc/lze-6.0/README 61 %doc /usr/doc/lze-6.0/LICENSE 62 63 # 執(zhí)行程序子包 64 %package bin 65 summary : 小趙編輯器LZE的執(zhí)行程序 66 group : Applications/Editors 67 68 %description bin 69 小趙編輯器執(zhí)行程序?yàn)閘ze,五筆輸入法服務(wù)器執(zhí)行程序 70 為lzeime.wb,拼音輸入法服務(wù)器執(zhí)行程序?yàn)閘zeime.py。 71 72 %files bin 73 %defattr (-,root,root) 74 /usr/bin/lze 75 /usr/bin/lzeime.py 76 /usr/bin/lzeime.wb 77 /etc/wbzc.dat 78 此描述文件生成三個(gè)軟件包:lze-config-6.0-2.i386.rpm(配置文件子包),lze-doc-6.0-2.i386.rpm(說明文檔子包),lze-bin-6.0-2.i386.rpm(執(zhí)行程序子包)。 |
|
|