Linux: 學習如何製作RPM包, SPEC文件如何編寫

一 RPM介紹

RPM 前是Red Hat Package Manager 的縮寫,本意是Red Hat 軟件包管理,顧名思義是Red Hat 貢獻出來的軟件包管理;現在應爲RPM Package Manager的縮寫。在FedoraRedhatMandrivaSuSEYellowDog等主流發行版本,以及在這些版本基礎上二次開發出來的發行版採用; RPM包中除了包括程序運行時所需要的文件,也有其它的文件;一個RPM 包中的應用程序,有時除了自身所帶的附加文件保證其正常以外,還需要其它特定版本文件,這就是軟件包的依賴關係。

RPM可以讓用戶直接以binary方式安裝軟件包,並且可替用戶查詢是否已經安裝了有關的庫文件;在用RPM刪除程序時,它又會聰明地詢問用戶是否要刪除有關的程序。如果使用RPM來升級軟件,RPM會保留原先的配置文件,這樣用戶就不用重新配置新的軟件了。RPM保留一個數據庫,這個數據庫中包含了所有的軟件包的資料,通過這個數據庫,用戶可以進行軟件包的查詢。RPM雖然是爲Linux而設計的,但是它已經移值到SunOSSolarisAIXIrix等其它UNIX系統上了。RPM遵循GPL版權協議,用戶可以在符合GPL協議的條件下自由使用及傳播RPM

二 RPM包分類

我個人認爲rpm分爲兩大類,

二進制類包,包括rpm安裝包(一般分爲i386x86等幾種)和調式信息包等。

源碼類包,源碼包和開發包應該歸位此類。

它們之間的關係是,最先我們按rpm打包要求改造軟件項目源碼,當符合要求之後就可以使用rpmbuild命令來生成不同的rpm包,同時生成的包之間版本是直接對應的,比如相同的源碼包將生成完全相同的二進制rpm包。當你在網上查找rpm包時,一般你可以在RPMS目錄中找到預編譯的二進制包,而源碼包則會在SRPMS目錄內。


我們這裏提到的RPM製作就是指改造軟件源代碼使之符合RPM打包要求的過程,這也可以等價爲RPM源碼包的製作過程,因爲當你有了源碼包就可以直接編譯得到二進制安裝包和其他任意包。


三 RPM包製作介紹


RPM包的製作,即是RPM源碼包的製作。
這裏我想說說RPM包工作的原理,這將有助於全面的瞭解RPM包管理系統的知識。
RPM是爲解決源碼包不易安裝(需要編譯)和軟件包相互之間依賴(是RPM包管理器可以一定程度解決依賴問題)問題,它通過在探測源碼包在buildinstall階段的動作獲得最終生成的需要安裝的系統裏的文件,並記錄下一些必要的操作(比如安裝完成後執行某項操作),然後把此組成爲一個整體,當在用戶安裝此包時把前面獲得的所有問題和記錄的所有操作原原本本的作用的實際系統上。


爲一個普通的源碼打RPM包,需要下面一些操作,首先需要對項目的Makefile作必要的改造以支持RPM打包操作(實際上此操作不是絕對的,SPEC文檔和Makefile的是協調統一工作的,只要他們之間配合好了其他都無所謂,我們一般只是推薦大家儘量按行業標準規範操作而已);其次是針對當前項目撰寫SPEC文檔,SPEC文檔包括了RPM打包過程的操作內容和新生成的RPM包的基本信息等,它的作用對象是打包程序rpmbuild



四 RPM包製作過程


準備打包環境


fedora系統下使用如下命令安裝rpmbuild

#yum install rpmbuild

rpmbuild的工作目錄如下,

~/rpmbuild
~/rpmbuild/SOURCES 
~/rpmbuild/SPECS 
~/rpmbuild/BUILD 
~/rpmbuild/RPMS 
~/rpmbuild/RPMS/i386 
~/rpmbuild/SRPMS 

如果你的用戶目錄主目錄下沒有類似目錄結構,你可以通過一個工具軟件來自動配置和生成,如下。

#yum install rpmdevtools
下了運行自動配置命令自動生成如上目錄,並配置一些必要操作。
#rpmdev-setuptree
rpmdev-setuptree命令默認將再當前用戶主目錄下創建一個RPM構建根目錄結構,
如果需要改變次默認位置,可以修改配置文件:~/.rpmmacros中變量_topdir對應
的值即可。

一般rpmbuild會在當前用戶的主目錄下自動建立如上目錄結構,如果在你對應用戶的構建目錄中沒有自動建立如上目錄,你可以通過手動方式建立。上面目錄的使用是這樣分配的,SOURCES放置打包資源,包括源碼打包文件和補丁文件等;SPECS目錄放置SPEC文檔;BUILD打包過程中的工作目錄;RPMS目錄存放生成的二進制包,RPM包根據硬件平臺不同分類,i386表示生成i386結構的包將存放在該目錄下;SRPMS目錄存放生成的源碼包。

撰寫SPEC文檔

SPEC撰寫是打包RPM的核心,也算是最難的一步,好在我們可以從參照一個簡單的模板文件開始,在可以實現基本功能的基礎上再一步一步的擴充文檔內容,直至完全達到要求。下面是一個簡單的SPEC文檔,其中包括了一些說明信息(注:#後面的內容爲說明信息),該SPEC文檔是對一個測試的軟件項目hellorpm寫的,hellorpm軟件包編譯後僅有一個執行文件、一個手冊文件和一個項目說文件。

hellorpm.spec文檔的內容如下:
----------------------------------------------------------
#軟件包簡要介紹

Summary: hellorpm is a test program。

#軟件包的名字

Name: hellorpm        

#軟件包的主版本號           
Version: 2.2.6          

#軟件包的次版本號             
Release: 1   

#源代碼包,默認將在上面提到的SOURCES目錄中尋找                        
Source0: %{name}-%{version}.tar.gz   

#授權協議

License: GPL     

                  

#定義臨時構建目錄,這個地址將作爲臨時安裝目錄在後面引用

BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root

#軟件分類

Group: Development/Tools  

#軟件包的內容介紹               
%description                         
The hellorpm program is a test.

#表示預操作字段,後面的命令將在源碼代碼BUILD前執行

%prep                     

#構建BUILD環境,將解壓源碼壓縮包到BUILD目錄 

%setup -q       

#BUILD字段,將通過直接調用源碼目錄中自動構建工具完成源碼編譯操作         
%build       

#調用源碼目錄中的configure命令            
./configure        

#在源碼目錄中執行自動構建命令make     
make            

#安裝字段         
%install     

#調用源碼中安裝執行腳本             
make DESTDIR=$RPM_BUILD_ROOT install 

#文件說明字段,聲明多餘或者缺少都將可能出錯

%files              

#設置文件權限屬性       
%defattr(-,root,root)      

#聲明/usr/local/bin/hellorpm將出現在軟件包中      
/usr/local/bin/hellorpm      

#聲明並設置文件屬性   
%doc %attr(0444,root,root) /usr/local/man/man1/hellorpm.1  

#同上,聲明文檔文件 

%doc README  


-----------------------------------------------------------------------------------
這個文檔需要說明的一點:

BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root

上面BuildRoot變量表示的是源碼的臨時按照目錄,rpmbuild就是通過次目錄獲得將要按照到系統中的所有文件,而在SPEC文檔後面make install 命令中的參數DESTDIR=$RPM_BUILD_ROOT即是對該參數的引用,這個參數將傳給Makefile文件一告訴自動構建工具應該安裝文件那裏(實際上我再前文提到過的Makefile需要作一些改造以適應RPM的構建就包括此操作,你的Makefile文件中至少要知道在RPM構建過程中引用此參數的值去控制安裝操作的目標)。

如上一個簡單的SPEC文檔撰寫完成,下面把一個名爲hellorpm-2.2.6.tar.gz的源碼壓縮文件放到
rpmbuild根目錄下的SOURCES目錄下(注,確保此歸檔文件解壓後的目錄爲hellorpm-2.2.6
否則會有問題)。
到此一個完整的rpm打包環境已經構建完成,下面我們就可以開始構建二進制和源代碼RPM包。


構建RPM

構建RPM包是有命令rpmbuildSPEC的指導下完成。

開始構建操作,首先進入到當前用戶的rpmbuild根目錄(即上面提到的目錄環境)。

#cd ~/rpmbuild/

執行如何命令,-ba表示build all,即生成包括二進制包和源代碼包的所有RPM包,下來如果正常的話,rpmbuild將正常退出,同時在RPMS目錄和SRPMS目錄中將生成對應的RPM包。

#rpmbuild -ba SPECS/hellorpm.spec

這裏僅僅介紹了一個最簡單軟件的最簡單的RPM的打包操作過程,諸如帶有共享文件的需要進行復雜配置的具有複雜依賴關係的等等的項目的打包以及後期的維護,包括補丁的製作我將在下來的時間完成補充更新,今天時間不早了,該休息了!

注:費了大半夜的功夫,搞出這麼個令人不滿意的文檔,我思考着,這樣做有多少意義呢?不敢重複發明輪子的,站到巨人的肩膀你才能看得更遠,是這樣嗎?
是不是下週開始立個計劃,每週至少翻譯三篇fedora官網的文檔給自己練練手。那糟糕的英語,唉!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章