簡易rpm套件的製作(轉)

post0發表於2007-08-09
簡易rpm套件的製作(轉)[@more@]

*雲飛揚,e-mail:yfy001@etang.com,電話:025-4705268-23*/

在使用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.rpm|cpio –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,不同的發

行版本路徑有差別).

/*寫得比較簡單,不明白的地方我們共同交流*

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-939135/,如需轉載,請註明出處,否則將追究法律責任。

相關文章