在使用Linux的過程中可能可能需要安裝新的軟件,升級已安裝的軟件或刪除已安裝的
軟件,這就或多或少要涉及到rpm.
Rpm是redhat公司開發的一種源代碼和二進制代碼封裝的方式,這種封裝的方式能讓用
戶輕松的進行軟件包的管理,包括軟件包的安裝、升級、刪除、查詢和管理。由於采用rpm
方式安裝軟件包無論是從二進制和源代碼方面來講,都比用.tar.gz的方式要簡單的多.故用
rpm安裝軟件成了一個linux下安裝軟件的標准.對於一個有志於linux下軟件軟件編程的程
序員來說,掌握簡易的rpm套件的制作對於推廣自己的程序非常有用.
Rpm套件的制作大致可分為:
1. 取得.tar.gz格式的軟件源程序和補丁文件.
2. 制作rpm套件的spec規格文件.
3. 執行rpm –ba 產生並測試rpm套件.
整個包裝rpm套件的重心就在於如何定義完整的rpm套件規格文件(specification)以及包
裝後的測試工作.制作rpm套件之前,必須先了解整個系統文件的目錄結構與運行,因為某些
rpm套件的制作會常常牽扯到系統運行的問題,比如安裝了某種新的shell,就必須在/etc/shells
中加入該shell的可執行文件路徑和名稱,才能正確的使用該shell.為了免除考慮這個顧慮,可
以先從無關系統運行的應用軟件做起,等對linux系統相當熟悉了,再嘗試這些涉及到系統運
行的rpm套件制作.
Rpm的Spec就如同編譯程序時的Makefile,定義制作Rpm包的所有文件信息及制作流程,
其主要工作將源程序解壓縮,為源程序打補丁,編譯源程序,包裝二進制碼Rpm包,包裝源代碼
Rpm包,清除包裝過程在Build目錄產生的臨時目錄.
它山之石,可以攻玉.多看看他人已經編好的spec文件,是學習spec文件編寫的捷徑,用以
下命令將spec文件取出.
$:rpm –qlp *.src.rpm
$:rpm2cpio *.src.rpmcpio –ivh *.spec
首先執行rpm –qlp查詢,得知該套件中有個.spec文件,再執行rpm2cpio將rpm文件轉換
成cpio文件格式,並將轉換結果輸出給cpio程序,把source rpm套件中的sepc文件解壓取出.
打開一個spec文件,可以發現它可以分為以下幾個段: %define、 %description、%prep、%build、
%install、%clean、%files、%changelog。
%define段主要用來做一些全局定義,如:版本號:Version;簡單的概要:Summary;程
序的名稱:Name;版權:Copyright;軟件所屬的組:Group;Source名稱是最重要的位置,
這裡定義Source的來源(一些tar.gz文件和一些補丁文件,若該軟件的Source不僅只有一個
文件,可以指定多重源程序,只需要將"Source"和"Patch"標簽編號,依次指定即可),用戶必
須把該文件放在/usr/src/redhat/SOURCES目錄下,rpm才可以進行包裝工作;icon指名該套
件的圖標,前提必須是一個gif文件,且位於/usr/src/redhat/source目錄下;常常在安裝某
些軟件是會出現某些依賴關系信息,告訴用戶必須先安裝某些套件才能安裝這個rpm套件的
情況,需要制作這種功能的rpm套件,就是依賴"Requires"這個標簽, Requires共有<、〉、<=、
=、 >=這五種.若某軟件同時需要用到三四個函數庫,則Requires標簽就必須定義三四行.或
用逗號隔開寫成一行.如: Requires: kdesupport.當然, %define段的標簽還有幾個,不過不
常用,這裡就不再多說了.
%description段較為簡單,主要是對該軟件的一個簡要的介紹.
%prep 段是spec的准備段,該段主要執行包裝Rpm包的准備工作,檢查標簽語法是否正
確,檢查/usr/src/redhat/SOURCES目錄是否存放源程序及補丁文件,刪除舊的軟件源程序,
並替程序作untar、patch等工作。當然,這些工作可以寫一些shell script來進行指定的
工作,但是如果真的寫shell script來進行這些准備工作,可能會令人苦惱。於是rpm開
發人員為用戶提供了%setup和%patch這兩個命令來替用戶處理這些繁雜的准備工作。
%setup 不加任何選項,僅將軟件包打開。
%setup –n newdir 將軟件包解壓在newdir目錄。
%setup -c 解壓縮之前先產生目錄。
%setup –b num 將第num個source文件解壓縮。
%setup –T 不使用default的解壓縮操作。
%setup –T –b 0 將第0個源代碼文件解壓縮。
%setup –c –n newdir 指定目錄名稱newdir,並在此目錄產生rpm套件。
%patch 最簡單的補丁方式,自動指定patch level。
%patch 0 使用第0個補丁文件,相當於%patch –p 0。
%patch –s 不顯示打補丁時的信息。
%patch –T 將所有打補丁時產生的輸出文件刪除。
%build 段主要是用來完成程序的編譯,通常情況下是一個make命令用來完成編譯。
%install這個段較為復雜,該段主要執行安裝的工作,在這裡你可以寫一些腳本將程序
加入菜單欄中,由於各個發行版不同,各個腳本也不通用,簡單的就是執行make install
來完成程序的安裝(視不同程序的安裝而定)。
%clean段是spec的刪除段,它是使用rm –f命令刪除編譯時的臨時目錄,一般用rm -rf
$RPM_BUILD_ROOT即可。
%files、%changelog段分別用來告訴用戶軟件安裝的地方和軟件的一些更新的日志等。
做完這些後,一個spec文件便就完成了,執行rpm –ba 產生並測試rpm套件,如果沒出什麼
錯的話,便就會產生相應的二進制rpm包和源代碼的srpm包。它們分別位於
/usr/src/Redhat/RPMS和/usr/src/Redhat/SRPMS目錄下(注:我使用的是Redhat 7.0,不同的發
行版本路徑有差別).
/*寫得比較簡單,不明白的地方我們共同交流*/