精通RPM之--製作篇(中)(轉)
精通RPM之--製作篇(中)(轉)[@more@]一個RPM的軟體包描述檔案,可以僅生成一個父包或一個子包,也可以生成一個父包和多個子包。透過設定子包選項,可以使生成的子包採用"軟體名-子包名" 的標準命名,也可使生成的子包採用自己的名字。一個子包,通常是按照其包含的檔案的用途或型別來歸併檔案進而打成包裹的。象前面的LZE描述檔案很簡單, 它將所有檔案都包含進了父包中。我們也可以將檔案分類作成子軟體包,如可分成執行程式子包(lze-bin),配置檔案子包(lze-config)和說明文件包(lze-doc)。我們還可以只分出一個配置檔案子包(lze-config),其餘檔案均打入父包中(lze)。透過這樣詳細地分類,有助於使用者管理軟體包,避免安裝多餘的東西,同時也有助於升級。要想建立子軟體包,必須描述以下內容:1. %package :用此段建立一個子包。其名字由子包選項控制。子包選項為"[-n] 子包名",不選-n時,生成的子包檔案為"軟體名-子包名-版本號-釋出號.體系.rpm";選-n時,生成的子包檔案為"子包名-版本號-釋出號.體系.rpm"。其應用格式為:%package 子包選項2. Summary此域必須在%package下面,它定義子包功能簡介(一句話說明)。格式為:Summary : 子包簡介3. Group此域必須在%package下面,其定義子包所屬軟體類別(軟體類別請參見<>)。格式為:Group : 軟體類別4. %description :此描述段的內容是較為詳細的子包功能介紹,介紹為文字形式,格式不作要求,可任意換行或分段。格式為:%description 子包選項...介紹子包功能的內容...5. %files :此檔案段的內容是子包所要包含的檔案列表。檔案列表中,一個檔案佔用一行,還可使用多種檔案修飾符。(詳見<>)段名應用格式為:%files 子包選項 [-f 檔名]注意: 上述%description與%files段所用的子包選項形式,必須與%package所用的子包選項形式一致,否則的話,它們定義的不是同一個子包,RPM檢查時將報錯退出。如定義過%package name後,描述段名須用%description name,檔案段名須用%files name方可。而用%description -n name則不行,%files -n name也不行。子軟體包也可使用%pre,%post,%preun,%postun,%triggerin,%triggerun和%triggerpostun等七個可選的功能段,因為它們都可使用子包選項。當使用子包選項時,它們的段內容就是用來管理子軟體包的指令碼程式。要注意的是,這些段使用的子包選項形式也必須與%package段使用的子包選項形式一致。條件語句的使用在軟體包描述檔案中,可以靈活地使用條件語句,位置不限制。這些語句,用於當前體系與作業系統的判斷,當條件為真或為假時,RPM均會引用其相應的描述內容。條件語句有兩種格式:1. {%ifarch,%ifnarch,%ifos,%ifnos} 值1 [值2] ...描述內容%endif注: {}所括內容必選其中之一,[]所括為可選項,各個值之間以空格分隔,%endif表示條件語句結束。此語句的含義是:1) 使用%ifarch時,表示如果當前體系為值1或值2...,則引用描述內容。2) 使用%ifnarch時,表示如果當前體系不為值1或值2...,則引用描述內容。3) 使用%ifos時,表示如果當前作業系統為值1或值2...,則引用描述內容。4) 使用%ifnos時,表示如果當前作業系統不為值1或值2...,則引用描述內容。如果想在LZE包描述檔案的檔案段增加只適用於sparc體系的檔案/etc/sparc.lze和 /etc/sparc.ime,則可在檔案段內加入如下語句:%ifarch sparc/etc/sparc.lze/etc/sparc.ime%endif這樣做以後,如果當前體系為sparc,則RPM在打包時會加入這兩個檔案。2. {%ifarch,%ifnarch,%ifos,%ifnos} 值1 [值2] ...描述內容1%else描述內容2%endif注: {}所括內容必選其中之一,[]所括為可選項,各個值之間以空格分隔,%else表示另外一種情況,%endif表示條件語句結束。此語句的含義是:1) 使用%ifarch時,表示如果當前體系為值1或值2...,則引用描述內容1,否則引用描述 內容2。2) 使用%ifnarch時,表示如果當前體系不為值1或值2...,則引用描述內容1,否則引用描述內容2。3) 使用%ifos時,表示如果當前作業系統為值1或值2...,則引用描述內容1,否則引用描述內容2。4) 使用%ifnos時,表示如果當前作業系統不為值1或值2...,則引用描述內容1,否則引用描述內容2。如果想根據當前作業系統來確定LZE包的名字,則可在描述檔案頭使用如下語句定義Name域:%ifos linuxName : lzeforlinux%else%ifos aixName : lzeforaix%elseName : lzeforothersys%endif%endif本例中使用了巢狀的條件語句,它說明的情況是:如果作業系統為linux,則軟體名定為lzeforlinux,如果作業系統為aix,則軟體名定為lzeforaix,如果不是上述兩個作業系統,則將軟體名定為lzeforothersys。如何在描述檔案中使用宏(macros)1. 宏是什麼?學過C語言的人都知道,宏是用來實現文字替換的,即定義了宏名與宏體後,檔案中所有有宏名的地方在預處理時將被宏體替換掉。使用宏可以減少文字的錄入量,方便了程式設計人員。在軟體包描述檔案中使用宏,也是基於這個目的,只不過這個宏與C語言的宏定義格式不同而已。2. 宏的定義描述檔案中宏的定義格式為:%define [(opts)]注: []所括為可選項。為宏名,宏名可用字母,數字和下劃線(_),並且其長度最小為3。opts為一個或多個選項,各選項之間無分隔,選項採用getopt函式要求的形式,即選項為單個字元,如果某個選項需要引數,則需要在這個選項後加個冒號(:)。為宏體,它周圍的空字元將被刪掉。宏體的內容須在一行上。如沒有選項的宏定義:%define aaa "This is my software"如僅有一個選項的宏定義:%define xxx(p:Z) echo %{-p:%{-p*}} %{-Z}3. 宏的使用宏的使用格式為:% [opt1] [opt2]... [arg1] [arg2]...或%{} [opt1] [opt2]... [arg1] [arg2]...注: []所括為可選項;為所應用的宏名,宏名可以用{}括住;opt1,opt2...為選項,均須以減號(-)開頭,並且如果選項需要引數,則必須提供一個選項引數;arg1,arg2...則為宏的引數。如上面定義的xxx宏,可這樣使用:%xxx -p zhsoft hello world<br>例子中,xxx宏使用一個選項-p,zhsoft為-p選項的引數,還有兩個宏的引數hello和world。注意: 宏使用時最好多換一行(即宏下面空一行),因為宏在擴充套件後並不換行,這樣如果不多換行,則下面一行若有內容的話,宏擴充套件後的內容將和下面一行的內容合併在一起,極容易出現錯誤。這也是筆者發現RPM宏的問題之一。還有一個問題,如果註釋行上存在宏,則這個宏也將擴充套件,錯矣!因為註釋本來就是要忽略掉的,有宏也不必再擴充套件了。這兩個問題都需要引起RPM開發者的注意,並切實加以解決。4. 宏體專用的宏宏體中可使用如下專用的宏:(類似SHELL形式的宏)1) %0 : 表示所在宏的宏名;2) %* : 表示宏的所有引數;3) %# : 表示宏的引數個數;4) %{-f} : 表示如果宏使用了-f選項,則它表示-f及其選項引數;5) %{-f*} : 表示如果宏使用了-f選項,則它表示-f所帶的引數;6) %{-f:X} : 表示如果宏使用了-f選項,則它表示X;7) %{!-f:Y} : 表示如果宏沒有使用-f選項,則它表示Y;8) %1,%2,... : 表示宏的引數1,引數2...如,上例中xxx宏執行時,若宏體中有上述專用的宏,則專用宏將會擴充套件為:1) %0擴充套件為xxx;2) %*擴充套件為hello world;3) %#擴充套件為2;4) %{-p}擴充套件為-p zhsoft;5) %{-p*}擴充套件為zhsoft;6) %{-p:good}擴充套件為good;7) %{!-Z:bad}擴充套件為bad; (因為xxx宏未使用-Z選項)8) %1為hello,%2為world,沒有其它引數。5. 系統內建的宏系統內建的宏可分如下三類:5.1 定義類1) %define ... : 定義一個宏;(原來,%define也是一個宏啊)2) %undefine ... : 取消一個宏;(宏取消後,此語句下面的描述檔案就不能再使用這個宏了,即使使用,該宏也不會被擴充套件了)5.2 除錯類1) %trace : 列印宏擴充套件前後的除錯資訊;2) %dump : 列印活動的宏(宏名及宏體);3) %{echo:...} : 列印...到標準錯誤裝置;4) %{warn:...} : 列印...到標準錯誤裝置;5) %{error:...} : 列印...到標準錯誤裝置,並且返回BADSPEC值;5.3 特殊類這類宏的預設值通常放在/usr/lib/rpm/macros檔案中,使用者透過編輯自己主目錄(HOME)下的.rpmmacros檔案(~/.rpmmacros),可重定義這類宏,改變其預設值,以供RPM在軟體包製作,安裝及查詢時使用自己的定義。這類宏的定義格式為:%注: 為宏名,為宏體。1) %packager,%vendor,%distribution :這三個宏用於定義描述檔案中Packager,Vendor,Distribution三個可選域的預設的域值,即如果這三個域中有哪個未在描述檔案中定義,且其相對應的宏有定義,則RPM會採用其對應的宏的宏體。如我的~/.rpmmacros檔案中有這樣三行:%vendor 縱橫軟體製作中心%packager 雨亦奇%distribution 小趙'2001這樣,軟體包描述檔案中再也不用定義那三個域了,由此製作出來的軟體包在查詢時,其打包者(Packager),銷售商(Vendor)及發行版(Distribution)均自動搞定了,一勞永逸。2) %buildroot,%_provides :這兩個宏定義軟體包建包時用的根目錄及軟體包所提供的功能。它們在打包時不會象 上面那三個宏一樣主動被RPM採用,而是必須在描述檔案中寫那麼幾行。即:%vendor 縱橫軟體製作中心%packager 雨亦奇%distribution 小趙'2001Buildroot : %buildrootProvides : %_provides3) %_topdir,%_builddir,%_rpmdir,%_sourcedir,%_specdir,%_srcrpmdir :這六個宏都是RPM製作軟體包時要用的,它們在/usr/lib/rpm/macros檔案中的預設值為:%_topdir %{_usrsrc}/dist%_builddir %{_topdir}/BUILD%_rpmdir %{_topdir}/RPMS%_sourcedir %{_topdir}/SOURCES%_specdir %{_topdir}/SPECS%_srcrpmdir %{_topdir}/SRPMS%_topdir宏定義的是RPM製作軟體包時所用目錄的頂層目錄,一般為/usr/src/dist(%{_usrsrc} 宏的值為/usr/src)。在頂層目錄下面,又有五個子目錄:* 編譯連線源程式時用的目錄,由%_builddir宏定義,常用BUILD;* 生成的RPM執行程式包存放的目錄,由%_rpmdir宏定義,常用RPMS;* 軟體源程式存放的目錄,由%_sourcedir宏定義,常用SOURCES;* 軟體包描述檔案存放的目錄,由%_specdir宏定義,常用SPECS;* 生成的RPM源程式包存放的目錄,由%_srcrpmdir宏定義,常用SRPMS。由於宏的遞迴特性,我們可以透過只定義%_topdir宏來達到改變%_builddir等五個宏的目的。 (注意:%_builddir等五個宏的宏體如無特殊要求,儘量不要改變,它們是標準的定義,應該採用)這對於普通使用者來說,意義非常重大。因為RPM預設的頂層目錄/usr/src/dist並不是每個使用者都可以隨便使用的,普通使用者更想在自己所有的目錄下用RPM來製作些軟體包。我也有這種想法,所以在~/.rpmmacros檔案里加上這麼一行:%_topdir /usr/zzz/rpm同時,在此宏定義的目錄下面建立了RPM所需的子目錄,使用命令為:$ cd /usr/zzz$ mkdir -p rpm/{BUILD,RPMS/i386,SOURCES,SPECS,SRPMS}$命令中的i386是RPM預設的體系名,RPM生成的執行程式包是存放在“RPMS/體系名”目錄下面的。這麼做以後,我就可以在自己的目錄下製作RPM軟體包了,象超級使用者一樣自由。4)%_excludedocs,%_ftpport,%_ftpproxy,%_httpport,%_httpproxy,%_netsharepath :這六個宏對RPM軟體包的安裝和查詢起作用。* %_excludedocs : 如果其值定義為1,則RPM安裝軟體包時,對說明文件的預設作法是不安裝;* %_ftpport : 此宏用於定義RPM預設的FTP埠;* %_ftpproxy : 此宏用於定義RPM預設的FTP代理伺服器;* %_httpport : 此宏用於定義RPM預設的HTTP埠;* %_httpproxy : 此宏用於定義RPM預設的HTTP代理伺服器;* %_netsharepath : 此宏用於定義RPM預設的網路共享目錄,適用於網路檔案系統(NFS)。6. 一種特殊的宏這種宏的用法是:%(SHELL命令及其引數)它的結果是取指定的SHELL命令的標準輸出的結果作為描述檔案內容的一部分。如軟體包描述檔案的某個部分需要加上當前日期,則可以用:%(date +%Y-%m-%d)執行後,該宏將擴充套件為類似2001-10-31的日期資料。使用者不妨在自己的描述檔案的預處理段(%prep)內加上這麼兩行試試:%(date +%Y-%m-%d)exit 1注: exit 1用於中止RPM的執行。描述檔案模板以下所有描述檔案模板均以LZE軟體包製作為例,以源程式現場編譯後產生的檔案為準生成軟體包。描述檔案中一般只描述必要的部分。另外,如果檔案段的所有檔案已存在於系統中,並且想直接利用打包,則可以去掉Source域,去掉RPM建包用功能段(%prep,%build,%install,% clean)。1. 只有父包,沒有任何子包:此描述檔案見<>。此檔案中還可以去掉幾個可選的功能段, 如%pre,%post,%preun,%postun,%triggerin,%triggerun,%triggerpostun。這幾個段在此檔案中無實質用途,執行時僅顯示RPM開始執行某個指令碼程式的資訊。此描述檔案僅生成軟體包lze-6.0-2.i386.rpm(父包)。2. 有父包,也有子包:描述檔案如下:1 # 檔名稱: lze-6.0-2.spec12 # 檔案功能: lze軟體包描述資訊3 # 檔案作者: 縱橫軟體製作中心雨亦奇 國防大學研究生二隊趙建利4 # 修改時間: 2001.10.3156 Name: lze7 Version: 6.08 Release: 29 Summary: 小趙全螢幕中英文多視窗多功能編輯器(LINUX/UNIX系統適用)10 Group: Applications/Editors11 License: Share12 Source: 1314 %description15 小趙編輯器,是為使用SCO UNIX,LINUX多使用者系統的廣大使用者專門設計的全螢幕多窗16 口中英文多功能編輯器。17 它主要有以下十大特點:1.全螢幕選單操作。2.顯示方式多樣。3.塊操作豐富。4.十18 字製表功能強大。5.多視窗操作靈活自如。6.檔案操作功能齊全。7.解釋輸出功能獨具特19 色。8.自帶中文輸入法(增強五筆和增強拼音),實用方便。9.十六進位制編輯功能,如虎20 添翼。10.即時翻譯,按到即譯。21 總之,小趙編輯器會成為您在UNIX,LINUX系統上編制程式和書寫一般性文稿的好幫手。22 它將在工作中助您一臂之力,輕鬆上陣,遊刃有餘!2324 %prep25 echo "預處理指令碼程式(prep)開始執行"26 %setup2728 %build29 echo "編譯連線指令碼程式(build)開始執行"30 make3132 %install33 echo "安裝指令碼程式(install)開始執行"34 make install3536 # 配置檔案子包37 %package config38 summary : 小趙編輯器LZE的配置檔案39 group : Applications/Editors4041 %description config42 小趙編輯器用配置檔案包括功能鍵定義檔案與43 輸入法控制檔案,使用者可根據實際情況加以修改。4445 %files config46 %config /etc/funkey.def47 %config /etc/inputme.def4849 # 說明文件子包50 %package doc51 summary : 小趙編輯器LZE的說明文件52 group : Applications/Editors5354 %description doc55 小趙編輯器說明文件,詳細介紹了該編輯器的56 命令列用法及內建的各項選單的功能與操作,對用57 戶熟悉小趙編輯器有很大作用。5859 %files doc60 %doc /usr/doc/lze-6.0/README61 %doc /usr/doc/lze-6.0/LICENSE6263 # 父包檔案段64 %files65 %defattr (-,root,root)66 /usr/bin/lze67 /usr/bin/lzeime.py68 /usr/bin/lzeime.wb69 /etc/wbzc.dat70此描述檔案生成軟體包有: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.spec22 # 檔案功能: lze軟體包描述資訊3 # 檔案作者: 縱橫軟體製作中心雨亦奇 國防大學研究生二隊趙建利4 # 修改時間: 2001.10.3156 Name: lze7 Version: 6.08 Release: 29 Summary: 小趙全螢幕中英文多視窗多功能編輯器(LINUX/UNIX系統適用)10 Group: Applications/Editors11 License: Share12 Source: 1314 %description15 小趙編輯器,是為使用SCO UNIX,LINUX多使用者系統的廣大使用者專門設計的全螢幕多窗16 口中英文多功能編輯器。17 它主要有以下十大特點:1.全螢幕選單操作。2.顯示方式多樣。3.塊操作豐富。4.十18 字製表功能強大。5.多視窗操作靈活自如。6.檔案操作功能齊全。7.解釋輸出功能獨具特19 色。8.自帶中文輸入法(增強五筆和增強拼音),實用方便。9.十六進位制編輯功能,如虎20 添翼。10.即時翻譯,按到即譯。21 總之,小趙編輯器會成為您在UNIX,LINUX系統上編制程式和書寫一般性文稿的好幫手。22 它將在工作中助您一臂之力,輕鬆上陣,遊刃有餘!2324 %prep25 echo "預處理指令碼程式(prep)開始執行"26 %setup2728 %build29 echo "編譯連線指令碼程式(build)開始執行"30 make3132 %install33 echo "安裝指令碼程式(install)開始執行"34 make install3536 # 配置檔案子包37 %package config38 summary : 小趙編輯器LZE的配置檔案39 group : Applications/Editors4041 %description config42 小趙編輯器用配置檔案包括功能鍵定義檔案與43 輸入法控制檔案,使用者可根據實際情況加以修改。4445 %files config46 %config /etc/funkey.def47 %config /etc/inputme.def4849 # 說明文件子包50 %package doc51 summary : 小趙編輯器LZE的說明文件52 group : Applications/Editors5354 %description doc55 小趙編輯器說明文件,詳細介紹了該編輯器的56 命令列用法及內建的各項選單的功能與操作,對用57 戶熟悉小趙編輯器有很大作用。5859 %files doc60 %doc /usr/doc/lze-6.0/README61 %doc /usr/doc/lze-6.0/LICENSE6263 # 執行程式子包64 %package bin65 summary : 小趙編輯器LZE的執行程式66 group : Applications/Editors6768 %description bin69 小趙編輯器執行程式為lze,五筆輸入法伺服器執行程式70 為lzeime.wb,拼音輸入法伺服器執行程式為lzeime.py。7172 %files bin73 %defattr (-,root,root)74 /usr/bin/lze75 /usr/bin/lzeime.py76 /usr/bin/lzeime.wb77 /etc/wbzc.dat78此描述檔案生成三個軟體包:lze-config-6.0-2.i386.rpm(配置檔案子包),lze-doc-6.0-2.i386.rpm(說明文件子包),lze-bin-6.0-2.i386.rpm(執行程式子包)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-938398/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- RPM 包是如何從源 RPM 製作的
- Linux自己製作rpm包Linux
- 如何製作一個 RPM 檔案
- Centos 7 製作MySQL 5.7 RPM包CentOSMySql
- 製作PHP的RPM包例項PHP
- 精通MySQL之鎖篇MySql
- 精通MySQL之架構篇MySql架構
- 使用CheckInstall從原始碼製作RPM安裝包原始碼
- 精通MySQL之索引篇,這篇注重練習!MySql索引
- Linux之RPM包管理_RPM包查詢Linux
- Redis從入門到精通:中級篇Redis
- 【智慧製造】中國製造2025獻禮之汽車篇
- 轉:AMS之dumpsys篇
- OpenSSH9.6p1的EL7版本rpm安裝包製作
- Flask框架從入門到精通之轉換器(四)Flask框架
- 使用css製作吊扇轉動的效果CSS
- Linux軟體包轉換-deb與rpm互轉Linux
- Linux命令之rpm安裝命令Linux
- 三篇文件學會使用casperjs製作爬蟲JS爬蟲
- 直播平臺製作,base64圖片字串和file之間互相轉換字串
- Linux之Yum_rpm_repo詳解Linux
- Linux軟體管理之RPM包1Linux
- express製作小型熱載入打包webpack--react篇ExpressWebReact
- Flutter動畫之Flare的製作與使用Flutter動畫
- 探討大世界遊戲的製作流程及技術——大場景製作技術概況篇遊戲
- 無網環境安裝docker之--rpmDocker
- [譯] 使用 Flutter 製作 3D 翻轉動畫Flutter3D動畫
- three.js 製作邏輯轉體遊戲(上)JS遊戲
- three.js 製作邏輯轉體遊戲(下)JS遊戲
- 4、製作一個html轉pdf的spring boot starterHTMLSpring Boot
- DaVinci Resolve Studio 18:影視製作中的色 彩之 王 mac/win版Mac
- 在swoole中製作一款仿製laravel的框架Laravel框架
- Vue中引入TradingView製作K線圖VueView
- 10分鐘快速精通rollup.js——前置學習之基礎知識篇JS
- 直播平臺製作,css之如何清除浮動CSS
- RPM索引在Artifactory中是如何工作索引
- 老曹的作業本之sra轉fastqAST
- Blender 效果製作:製作起伏不平的路面
- Redis從入門到精通:初級篇Redis