RPM打包技術與典型SPEC檔案分析(轉)
RPM打包技術與典型SPEC檔案分析(轉)[@more@]本文分為兩部分,第一部分闡述了 rpm 工具的功能以及 rpmbuild 工具,詳細的介紹了 spec檔案的書寫規則以及關鍵部分,第二部分對一個典型的 spec 檔案做了詳細的分析。為了方便朋友們檢視,我找了中文的rpmbuild 的MAN 附在最後一 、rpm 介紹1. 概述RPM全稱是 Red Hat Package Manager(Red Hat包管理器)。幾乎所有的 Linux 發行版本都使用這種形式的軟體包管理安裝、更新和解除安裝軟體。RPM 是一個開放的軟體包管理系統。它工作於Red Hat Linux以及其它Linux和UNIX 系統,可被任何人使用。redhat軟體公司鼓勵其它廠商來了解RPM並在自己的產品中使用它。RPM的釋出基於GPL協議。對於終端使用者來說,使用 RPM所提供的功能來維護系統是比較容易和輕鬆的。安裝、解除安裝和升級RPM軟體包只需一條命令就可以搞定。RPM維護了一個所有已安裝的軟體包和檔案的資料庫,可以讓使用者進行查詢和驗證工作。在軟體包升級過程中,RPM會對配置檔案進行特別處理,絕對不會丟失以往的定製資訊。對於程式設計師RPM可以讓我們連同軟體的原始碼打包成原始碼和二進位制軟體包供終端使用者使用。RPM擁有功能強大的查詢選項。我們可以搜尋資料庫來查詢軟體包或檔案。也可以查出某個檔案屬於哪個軟體包或出自哪兒。RPM軟體包中的檔案是以壓縮格式存放的,擁有一個定製的二進位制標頭檔案,其中包含有關包和內容的資訊,可以讓我們對單個軟體包的查詢簡便又快速。RPM另一個強大的功能是進行軟體包的驗證。如果我們擔心誤刪了某個軟體包中的某個檔案,我們就可以對它進行驗證。任何非正常現象將會被通知。如果需要的話還可以重新安裝該軟體包。在重新安裝過程中,所有被修改過的配置檔案將被保留。RPM設計目標之一就是要保持軟體包的原始特徵, 就象該軟體的原始釋出者釋出軟體時那樣。透過使用RPM我們可以擁有最初的軟體和最新的補丁程式,還有詳細的軟體構建資訊。概括的說:RPM有五種基本的操作功能(不包括建立軟體包):安裝、解除安裝、升級、查詢、和驗證。關於rpm命令的使用我們可以用以下命令:[root@hostname root]rpm -help來獲的。2.RPM工具功能1) 安裝rpm -i ( or --install) options file1.rpm ... fileN.rpm 透過rpm -ivh可以把rpm軟體包安裝到系統中,當然也可以使用不同的引數選項,筆者建議使用-ivh ,使用該選項可以解決大部分rpm軟體包的安裝,至於詳細的引數說明可用檢視rpm的man 文件。2 )刪除rpm -e ( or --erase) options pkg1 ... pkgN 如果某個軟體包你再也不想使用了,那就用以上這個命令徹底的把你指定的rpm軟體包清除掉把。3 )升級rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm 由於開源軟體更新速度快,使用者當然要使用最新版本的軟體包,此時最合適的就是rpm升級功能,當然最理想的引數選項就是-Uvh。4 )查詢rpm -q ( or --query) options 實際上我們通常使用rpm工具最多的功能還是它的查詢功能,比如檢視軟體包的版本、依賴關係等軟體包的詳細說明都要用到。最有用的引數選項是-qpi。5 )校驗已安裝的軟體包rpm -V ( or --verify, or -y) options 一般我們可用透過該命令來驗證已安裝軟體包,根據筆者的經驗該命令一般沒什麼用途,只做一個瞭解就ok了。3.spec檔案規範能熟練掌握以上命令以及部分引數含義,管理日常的rpm軟體包就不成問題了。然而隨著Linux風靡全球,越來越多的開發者喜歡採用RPM格式來發布自己的軟體包。那麼RPM軟體包是怎樣製作的呢?對大多數Linux開發工程師來說是比較陌生的。其實,製作RPM軟體包並不是一件複雜的工作,其中的關鍵在於編寫SPEC軟體包描述檔案。要想製作一個rpm軟體包就必須寫一個軟體包描述檔案(SPEC)。這個檔案中包含了軟體包的諸多資訊,如軟體包的名字、版本、類別、說明摘要、建立時要執行什麼指令、安裝時要執行什麼操作、以及軟體包所要包含的檔案列表等等。描述檔案說明如下:(1) 檔案頭一般的spec檔案頭包含以下幾個域:Summary:用一句話概括該軟體包儘量多的資訊。Name:軟體包的名字,最終RPM軟體包是用該名字與版本號,釋出號及體系號來命名軟體包的。Version:軟體版本號。僅當軟體包比以前有較大改變時才增加版本號。Release:軟體包釋出號。一般我們對該軟體包做了一些小的補丁的時候就應該把釋出號加1。Vendor:軟體開發者的名字。Copyright:軟體包所採用的版權規則。具體有:GPL(自由軟體),BSD,MIT,Public Domain(公共域),Distributable(貢獻),commercial(商業),Share(共享)等,一般的開發都寫GPL。Group:軟體包所屬類別,具體類別有:Amusements/Games (娛樂/遊戲)Amusements/Graphics(娛樂/圖形)Applications/Archiving (應用/文件)Applications/Communications(應用/通訊)Applications/Databases (應用/資料庫)Applications/Editors (應用/編輯器)Applications/Emulators (應用/模擬器)Applications/Engineering (應用/工程)Applications/File (應用/檔案)Applications/Internet (應用/因特網)Applications/Multimedia(應用/多媒體)Applications/Productivity (應用/產品)Applications/Publishing(應用/印刷)Applications/System(應用/系統)Applications/Text (應用/文字)Development/Debuggers (開發/偵錯程式)Development/Languages (開發/語言)Development/Libraries (開發/函式庫)Development/System (開發/系統)Development/Tools (開發/工具)Documentation (文件)System Environment/Base(系統環境/基礎)System Environment/Daemons (系統環境/守護)System Environment/Kernel (系統環境/核心)System Environment/Libraries (系統環境/函式庫)System Environment/Shells (系統環境/介面)User Interface/Desktops(使用者介面/桌面)User Interface/X (使用者介面/X視窗)User Interface/X Hardware Support (使用者介面/X硬體支援)Source:源程式軟體包的名字。如 stardict-2.0.tar.gz。%description:軟體包詳細說明,可寫在多個行上。(2)%prep段這個段是預處理段,通常用來執行一些解開源程式包的命令,為下一步的編譯安裝作準備。%prep和下面的%build,%install段一樣,除了可以執行RPM所定義的宏命令(以%開頭)以外,還可以執行SHELL命令,命令可以有很多行,如我們常寫的tar解包命令。(3)build段本段是建立段,所要執行的命令為生成軟體包服務,如make 命令。(4)%install段本段是安裝段,其中的命令在安裝軟體包時將執行,如make install命令。(5)%files段本段是檔案段,用於定義軟體包所包含的檔案,分為三類--說明文件(doc),配置檔案(config)及執行程式,還可定義檔案存取許可權,擁有者及組別。(6)%changelog段本段是修改日誌段。你可以將軟體的每次修改記錄到這裡,儲存到釋出的軟體包中,以便查詢之用。每一個修改日誌都有這樣一種格式:第一行是:* 星期 月日 年 修改人電子信箱。其中:星期、月份均用英文形式的前3個字母,用中文會報錯。接下來的行寫的是修改了什麼地方,可寫多行。一般以減號開始,便於後續的查閱。4.打包如果想釋出rpm格式的原始碼包或者是二進位制包,就要使用rpmbuild工具(rpm最新打包工具)。如果我們已經根據本地原始碼包的成功編譯安裝而寫了 spec檔案(該檔案要以.spec結束),那我們就可以建立一個打包環境,也就是目錄樹的建立,一般是在/usr/src/redhat/目錄下建立5 個目錄。它門分別是BUILD、SOURCE、SPEC、SRPM、RPM。其中BUILD目錄用來存放打包過程中的原始檔,SOURCE用來存放打包是要用到的原始檔和patch,SPEC用來存放spec檔案,SRPM、RPM分別存放打包生成的rpm格式的原始檔和二進位制檔案。當然我們可以根據需要來選用不同的引數打包檔案,筆者總結如下3條。1) 只生成二進位制格式的rpm包rpmbuild -bb xxx.spec用此命令生成軟體包,執行後螢幕將顯示如下資訊:(每行開頭為行號)1 Executing: %prep2 + umask 0223 + cd /usr/src/dist/BUILD4 + exit 05 Executing: %build6 + umask 0227 + cd /usr/src/dist/BUILD生成的檔案會在剛才建立的RPM目錄下存在。2)只生成src格式的rpm包rpmbuild -bs xxx.spec生成的檔案會在剛才建立的SRPM目錄下存在。3) 只需要生成完整的原始檔rpmbuild -bp xxx.spec原始檔存在目錄BUILD下。讀者朋友可能對這個命令不太明白,這個命令的作用就是把tar包解開然後把所有的補丁檔案合併而生成一個完整的具最新功能的原始檔。4) 完全打包rpmbuild -ba xxx.spec產生以上3個過程分別生成的包。存放在相應的目錄下。軟體包製作完成後可用rpm命令查詢,看看效果。如果不滿意的話可以再次修改軟體包描述檔案,重新執行以上命令產生新的RPM軟體包。二.典型spec檔案分析透過第一部分的介紹,我們對軟體包的管理以及spec檔案的一些細節應該掌握的差不多了,接下來透過分析kaffeine.spec(kaffeine是linux平臺下的媒體播放器)檔案來讓讀者朋友實踐一回spec檔案的規範和書寫。Kaffeine.spec檔案內容如下:%define debug_package %Name: kaffeineVersion: 0.4.3Release: 25Summary: A xine-based Media Player for KDEGroup: Applications/MultimediaLicense: GPLURL: Source0: kaffeine-0.4.3.tar.bz2Source1: logo.pngSource2: icon.tgzSource3: kaffeine.desktopSource4: codecs.tgzPatch: kaffeine-0.4.3-fix-hide-crash.patchPatch1:kaffeine-0.4.3-without-wizard.patchBuildRoot: /var/tmp/kaffeine-root%descriptionKaffeine is a xine based media player for KDE3. It plays back CDs,DVDs, and VCDs. It also decodes multimedia files like AVI, MOV, WMV,and MP3 from local disk drives, and displays multimedia streamed overthe Internet. It interprets many of the most common multimedia formatsavailable - and some of the most uncommon formats, too. Additionally,Kaffeine is fully integrated in KDE3, it supports Drag and Drop andprovides an editable playlist, a bookmark system, a Konqueror plugin,a Mozilla plugin, OSD an much more.以上這部分就是我們第一部分所說的檔案頭。這一部分主要包括軟體包的名稱、版本、原始碼和patch等資訊,透過這些關鍵字我們可以一目瞭然。檢視以上內容,我們會全面瞭解該軟體包。接下來的這一個段就是核心部分,涉及到解包、補丁、編譯、安裝的過程。%prep%setup -q%patch -p1%patch1 -p1%Buildmake -f admin/Makefile.common cvs./configure --prefix=/usrmake#for mo filespushd porm *.gmomakepopd%installmkdir -p $RPM_BUILD_ROOTmake install DESTDIR=$RPM_BUILD_ROOTmkdir -p $RPM_BUILD_ROOT/usr/share/servicescp $RPM_BUILD_ROOT/usr/share/apps/kaffeine/mms.protocol $RPM_BUILD_ROOT/usr/share/servicescp $RPM_BUILD_ROOT/usr/share/apps/kaffeine/rtsp.protocol $RPM_BUILD_ROOT/usr/share/services#mkdir -p $RPM_BUILD_ROOT/usr/lib/firefox/plugins#cp $RPM_BUILD_ROOT/usr/lib/kaffeineplugin/kaffeineplugin.so$RPM_BUILD_ROOT/usr/lib/firefox/pluginscp % $RPM_BUILD_ROOT/usr/share/apps/kaffeinerm -rf $RPM_BUILD_ROOT/usr/share/icons/hicolor/*/apps/kaffeine.pngrm -rf $RPM_BUILD_ROOT/usr/share/icons/hicolor/*/apps/kaffeine-pause.pngrm -rf $RPM_BUILD_ROOT/usr/share/icons/hicolor/*/apps/kaffeine-play.pngrm -rf $RPM_BUILD_ROOT/usr/share/icons/hicolor/*/apps/kaffeine-record.pngmkdir -p $RPM_BUILD_ROOT/usr/share/icons/crystalsvgtar zxvf % -C $RPM_BUILD_ROOT/usr/share/icons/crystalsvgmkdir -p $RPM_BUILD_ROOT/usr/share/applnk/App/Multimediacp -r % $RPM_BUILD_ROOT/usr/share/applnk/App/Multimediamkdir -p $RPM_BUILD_ROOT/usr/lib/win32tar zxvf % -C $RPM_BUILD_ROOT/usr/lib/win32%cleanrm -rf $RPM_BUILD_ROOT%postln -s /dev/cdrom /dev/dvdln -s /dev/cdrom /dev/rdvd%files%defattr(-,root,root)/usr這部分內容與所要打的包有關係,我們要根據具體情況來寫出編譯過程。這部分內容是最複雜的內容,當然,我們也可以看出,這樣的寫法其實就是在寫一種規範化的指令碼,說到指令碼,讀者朋友門就應該領會到這部分內容的靈活性了。%changelog* Fri Jul 1 2005 AiLin Yang -0.4.3-25- modified the fullscreen bottom control panel* Fri Jun 17 2005 xxx -0.4.3-24- Modified to use xshm as video driver.* Thu Jun 16 2005 AiLin Yang - delete the option of Embed in system tray in configwidget* Tue Jun 14 2005 AiLin Yang - add fullscreen bottom control panel- update kaffine to support my fullscreen bottom control panel這部分內容可以說是spec檔案的最後內容了,它對團隊軟體開發以及後續的軟體維護至關重要,它相當於一個日誌,記錄了所有的基於該軟體包的修改、更新資訊。小結在Linux 下RPM軟體包的管理與RPM軟體包的製作關鍵在rpm工具的使用和spec描述檔案的起草。要想製作一個RPM格式的軟體包必須編寫軟體包描述檔案。其標準命名格式為:軟體名-版本號-釋出號.spec,這個檔案詳細描述了有關該軟體包的諸多資訊,如軟體名,版本,類別,說明摘要,建立時要執行什麼指令,安裝時要執行什麼操作,以及軟體包所要包含的檔案等等。有了這個檔案RPM就可以製作出相應的rpm軟體包。附:中文MANNAMErpmbuild - 構建 RPM 打包 SYNOPSIS構建打包:rpmbuild [rpmbuild-options] SPECFILE ...rpmbuild [rpmbuild-options] TARBALL ...rpmbuild SOURCEPKG ...其他:rpmbuild --showrcrpmbuild 選項[--buildroot DIRECTORY] [--clean] [--nobuild][--rmsource] [--rmspec] [--short-circuit] [--sign][--target PLATFORM]DESCRIPTIONrpmbuild 是用來構建軟體的二進位制和原始碼打包的。一個軟體包 package 包括檔案的歸檔以及用來安裝和解除安裝歸檔中檔案的後設資料。後設資料包括輔助指令碼,檔案屬性,以及有關的描述性的資訊。軟體包有兩種 package:二進位制軟體包,用來封裝要安裝的軟體,原始碼軟體包,包含了原始碼和要構建二進位制打包需要的內容。必須選擇下列基本模式之一:0 Build Package, Build Package from Tarball, Recompile Package, Show Configuration. 一般的選項這些選項可以用於所有不同的模式。-?, --help輸出較長的幫助資訊 --version輸出一行資訊,包含 rpmbuild 的版本號 --quiet輸出儘可能少的資訊 - 通常只有錯誤資訊才會顯示出來 -v輸出冗餘資訊 - 通常常規的進度資訊都將被顯示 -vv輸出大量醜陋的除錯資訊 --rcfile FILELISTFILELIST 中冒號分隔的每個檔名都被 rpm 按順序讀取,從中獲得配置資訊。只有列表的第一個檔案必須存在,波浪線將被替換為 $HOME。預設的 FILELIST 是 /usr/lib/rpm/rpmrc:/usr/lib/rpm/redhat/rpmrc:/etc/rpmrc:~/.rpmrc --pipe CMD將 rpm 的輸出透過管道送到命令 CMD。 --dbpath DIRECTORY使用 DIRECTORY 中的資料庫,而不是預設的路徑 /var/lib/rpm --root DIRECTORY以 DIRECTORY 作為根檔案系統,進行所有操作。這意味著將使用 DIRECTORY 中的資料庫來進行依賴性檢測,任何小程式 (也就是安裝中的 %post 和構建中的 %prep) 都將在一個 chroot(2) 到 DIRECTORY 之後執行。 構建選項構建命令的一般形式是rpmbuild -bSTAGE|-tSTAGE [ rpmbuild-options ] FILE ...如果要用某個 spec 檔案構建,使用 -b 引數。如果需要根據一個可能是壓縮過的 tar 歸檔檔案中的 spec 檔案構建,就使用 -t 引數。第一個引數之後的字元 STAGE 指定了要完成的構建和打包的階段,是下列其中之一:-ba構建二進位制和原始碼打包 (在執行 %prep, %build 和 %install 之後) -bb構建二進位制打包 (在執行 %prep, %build 和 %install 之後) -bp執行 spec 檔案的 "%prep" 階段。通常,這會解包原始碼並應用補丁 -bc執行 spec 檔案的 "%build" 階段 (在執行了 %prep 階段之後)。這通常等價於執行了一次 "make" -bi執行 spec 檔案的 "%install" 階段 (在執行了 %prep 和 %build 階段之後)。這通常等價於執行了一次 "make install" -bl執行一次 "列表檢查"。spec 檔案的 "%files" 段落中的宏被擴充套件,檢測是否每個檔案都存在。 -bs只構建原始碼打包 還可以用下列選項:--buildroot DIRECTORY在構建時,使用目錄 DIRECTORY 覆蓋預設的值 --clean在製作打包之後刪除構建樹 --nobuild不執行任何構建步驟。用於測試 spec 檔案 --rmsource在構建後刪除原始碼 (也可以單獨使用,例如 "rpmbuild --rmsource foo.spec") --rmspec在構建之後刪除 spec 檔案 (也可以單獨使用,例如 "rpmbuild --rmspec foo.spec") --short-circuit直接跳到指定階段 (也就是說,跳過指定階段前面的所有步驟)。只有與 -bc 或 -bi 連用才有意義。 --sign在打包中包含 GPG 簽名。簽名可以用來校驗打包的完整性和來源。參見 rpm(8) 的 "GPG 簽名" 章節中的配置細節。 --target PLATFORM在構建時,將 PLATFORM 解析為 arch-vendor-os,並以此設定宏 %_target, %_target_cpu, 和 %_target_os 的值。 重建和重編譯選項還有兩種發起構建的方法:rpmbuild --rebuild|--recompile SOURCEPKG ...這樣執行的話,rpmbuild 安裝指定的原始碼打包,然後進行準備,編譯和安裝。另外,--rebuild 構建一個新的二進位制打包,在構建結束時,構建目錄被刪除 (就好像用了 --clean),原始碼和 spec 檔案也被刪除。 SHOWRC命令rpmbuild --showrc將顯示 rpmbuild 使用的,在 rpmrc 和 macros 配置檔案中定義的選項的值。 FILESrpmrc 配置檔案/usr/lib/rpm/rpmrc/usr/lib/rpm/redhat/rpmrc/etc/rpmrc~/.rpmrcMacro 宏定義檔案/usr/lib/rpm/macros/usr/lib/rpm/redhat/macros/etc/rpm/macros~/.rpmmacrosDatabase 資料庫/var/lib/rpm/Basenames/var/lib/rpm/Conflictname/var/lib/rpm/Dirnames/var/lib/rpm/Filemd5s/var/lib/rpm/Group/var/lib/rpm/Installtid/var/lib/rpm/Name/var/lib/rpm/Packages/var/lib/rpm/Providename/var/lib/rpm/Provideversion/var/lib/rpm/Pubkeys/var/lib/rpm/Removed/var/lib/rpm/Requirename/var/lib/rpm/Requireversion/var/lib/rpm/Sha1header/var/lib/rpm/Sigmd5/var/lib/rpm/TriggernameTemporary 臨時檔案/var/tmp/rpm*
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-945423/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- RPM 的 spec 檔案如何編寫
- 如何編寫 RPM 的 spec 檔案
- Pyinstaller利用spec檔案打包的使用模板
- Pyinstaller打包用spec新增資原始檔
- RPM打包之路
- AI Agent技術的最新進展與改變世界的典型專案巡禮AI
- 從Spec Export - Sketch Measure網頁生成Storyboard檔案Export網頁
- 技術分享 | 使用 RPM 部署 Oceanbase Proxy
- 如何製作一個 RPM 檔案
- Oracle叢集技術 | OLR與套接字檔案(二)Oracle
- Linux軟體包轉換-deb與rpm互轉Linux
- 檔案編輯、打包壓縮與查詢命令
- 資料標準和資料質量:技術解析與典型案例
- docker新增檔案重新打包Docker
- webpack打包bundle檔案解析Web
- rpm包的校驗和檔案讀取
- Linux 學習筆記--檔案打包與解壓縮Linux筆記
- 轉:使用 Tkprof 分析 ORACLE 跟蹤檔案Oracle
- Torrent檔案的解析與轉換
- java 字串與檔案相互轉換Java字串
- Linux與Windows共享檔案Samba(轉)LinuxWindowsSamba
- VUE打包後配置配置檔案修改請求url方法及webpack打包的檔案生成同名檔案方法VueWeb
- Android Apk 檔案反編譯和重新打包的過程分析AndroidAPK編譯
- maven專案打包後war檔案丟失配置檔案Maven
- 使用pyinstaller打包exe檔案教程
- pyinstaller打包python成.exe檔案Python
- Java RMI技術詳解與案例分析Java
- 前端技術演進(六):前端專案與技術實踐前端
- MySQL技術內幕之“日誌檔案”MySql
- GBFF檔案轉GFF檔案
- 典型伺服器模式原理分析與實踐伺服器模式
- Linux檔案系統與日誌分析Linux
- tar打包且排除某個檔案
- geoserver將layer打包為shp檔案Server
- 使用PyInstaller打包檔案為exe程式
- Python教程:一篇檔案教你py檔案打包成exePython
- 技術轉向專案管理的心得筆記專案管理筆記
- Linux--檔案系統與日誌分析Linux
- Android測試日誌檔案抓取與分析Android