1. 程式人生 > >rpm包如何製作-個人經驗

rpm包如何製作-個人經驗

原文地址:http://blog.chinaunix.net/uid-21123336-id-1830527.html

一 RPM介紹

RPM 以前是Red Hat Package Manager 的縮寫,本意是Red Hat 軟體包管理,顧名思義是Red Hat 貢獻出來的軟體包管理;現在應該是RPM Package Manager 的縮寫。在Fedora 、Redhat、Mandriva、SuSE、YellowDog等主流發行版本,以及在這些版本基礎上二次開發出來的發行版採用; RPM包中除了包括程式執行時所需要的檔案,也有其它的檔案;一個RPM 包中的應用程式,有時除了自身所帶的附加檔案保證其正常以外,還需要其它特定版本檔案,這就是軟體包的依賴關係。
RPM可以讓使用者直接以binary方式安裝軟體包,並且可替使用者查詢是否已經安裝了有關的庫檔案;在用RPM刪除程式時,它又會聰明地詢問使用者是否要刪除有關的程式。如果使用RPM來升級軟體,RPM會保留原先的配置檔案,這樣使用者就不用重新配置新的軟體了。RPM保留一個數據庫,這個資料庫中包含了所有的軟體包的資料,通過這個資料庫,使用者可以進行軟體包的查詢。RPM雖然是為Linux而設計的,但是它已經移值到SunOS、Solaris、AIX、Irix等其它UNIX系統上了。RPM遵循GPL版權協議,使用者可以在符合GPL協議的條件下自由使用及傳播RPM。

轉載後補充:
通用性公開許可證(General Public License,簡稱GPL)。
GPL同其它的自由軟體許可證一樣,許可社會公眾享有:執行、複製軟體的自由,發行傳播軟體的自由,獲得軟體原始碼的自由,改進軟體並將自己作出的改進版本向社會發行傳播的自由。
GPL還規定:只要這種修改文字在整體上或者其某個部分來源於遵循GPL的程式,該修改文字的整體就必須按照GPL流通,不僅該修改文字的原始碼必須向社會公開,而且對於這種修改文字的流通不准許附加修改者自己作出的限制。因此,一項遵循GPL流通的程式不能同非自由的軟體合併。GPL所表達的這種流通規則稱為copyleft,表示與copyright(版權)的概念“相左”。
GPL協議最主要的幾個原則:
1、確保軟體自始至終都以開放原始碼形式釋出,保護開發成果不被竊取用作商業發售。任何一套軟體,只要其中使用了受 GPL 協議保護的第三方軟體的源程式,並向非開發人員釋出時,軟體本身也就自動成為受 GPL 保護並且約束的實體。也就是說,此時它必須開放原始碼。
2、GPL 大致就是一個左側版權(Copyleft,或譯為“反版權”、“版權屬左”、“版權所無”、“版責”等)的體現。你可以去掉所有原作的版權 資訊,只要你保持開源,並且隨原始碼、二進位制版附上 GPL 的許可證就行,讓後人可以很明確地得知此軟體的授權資訊。GPL 精髓就是,只要使軟體在完整開源 的情況下,儘可能使使用者得到自由發揮的空間,使軟體得到更快更好的發展。
3、無論軟體以何種形式釋出,都必須同時附上原始碼。例如在 Web 上提供下載,就必須在二進位制版本(如果有的話)下載的同一個頁面,清楚地提供原始碼下載的連結。如果以光碟形式釋出,就必須同時附上原始檔的光碟。
4、開發或維護遵循 GPL 協議開發的軟體的公司或個人,可以對使用者收取一定的服務費用。但還是一句老話——必須無償提供軟體的完整原始碼,不得將原始碼與服務做捆綁或任何變相捆綁銷售。

二 RPM包分類

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

1 二進位制類包,包括rpm安裝包(一般分為i386和x86等幾種)和調式資訊包等。

2 原始碼類包,原始碼包和開發包應該歸位此類。

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

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

三 RPM包製作介紹

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

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

四 RPM包製作過程

1 準備打包環境

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目錄存放生成的原始碼包。

2 撰寫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包。

3 構建RPM包

構建RPM包是有命令rpmbuild在SPEC的指導下完成。

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

#cd ~/rpmbuild/

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

#rpmbuild -ba SPECS/hellorpm.spec

這裡僅僅介紹了一個最簡單軟體的最簡單的RPM的打包操作過程,諸如帶有共享檔案的需要進行復雜配置的具有複雜依賴關係的等等的專案的打包以及後期的維護,包括補丁的製作我將在下來的時間完成補充更新,今天時間不早了,該休息了!
注:費了大半夜的功夫,搞出這麼個令人不滿意的文件,我思考著,這樣做有多少意義呢?不敢重複發明輪子的,站到巨人的肩膀你才能看得更遠,是這樣嗎?
是不是下週開始立個計劃,每週至少翻譯三篇fedora官網的文件給自己練練手。那糟糕的英語,唉!

參考資料:

http://www.linuxsir.org/main/?q=node/50 RPM 的介紹和應用(北南兄)

http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part3/ 用 RPM 打包軟體

http://hlee.javaeye.com/blog/343499 RPM包rpmbuild SPEC檔案深度說明