1. 程式人生 > >rpm補丁檔案和升級包製作教程

rpm補丁檔案和升級包製作教程

1.介紹
在開始介紹之前,首先表達一個觀點,一般不推薦使用root構建構建RPM包,尤其對RPM包構建不是很熟悉的使用者,因為一些配置或者誤操作可能會影響甚至破壞系統,造成一些不必要的損失。另外一點是使用普通使用者基本可以滿足構建大多數RPM包的要求。
RPM包是一種優秀的軟體包安裝管理系統,而RPM原始碼包則是RPM包系統中重要的組成部分,是其他各種RPM包母體,其他種類的RPM包都是由RPM源 碼包生成的。這樣當軟體有升級更新時,首先需要更新的是RPM原始碼包,下來通過RPM原始碼包生成新的RPM安裝包等其他包。
準備知識
製作RPM升級包需要一個完整的RPM包構建環境,如何構建RPM構建環境可以參考另一份文件(RPM包如何製作)。我個人認為RPM升級包製作分為兩種情況:
1 只是對RPM包小部分的內容進行更新,比如是程式碼中的一個bug或者小變動。這種情況通過生成一個補丁檔案附加到已存在的RPM原始碼包的方式就可以實現升 級操作。該升級方式操作簡單,生成一個原始碼補丁另外在SPEC文件中新增兩行鍼對新補丁檔案的操作即完成原始碼更新包的操作。
2 軟體有重大功能變化,即有大量的原始碼檔案發生變化或者大的內容變化,這種情況一般處理的方式是使軟體包進行一個大的版本號的升級,並把上一版原始碼包中所有 補丁檔案和最新更新的所有內容結合到一起,重新制作出新版本的原始碼包。這種升級方式相對來說操作複雜一些,需要重新打包原始碼壓縮包,需要修改SPEC文件 較多內容。

作為普通軟體包的使用者最多遇到的是第一種情形,一般只會針對某個功能新增一點自己的補丁以改善軟體包的特性。而第二種情況更多的軟體包的開發者、維護者可能會做的大手術。

RPM原始碼包的組成可以分為:軟體原始碼所有檔案的歸檔檔案(即壓縮檔案)、一些補丁檔案(可能不存在)和SPEC文件。如果是需要對SPEC文件更新,則需要直接修改該文件(補丁檔案對此是沒有效果的)。

2.下面主要以上面提到的第一種情況介紹升級包的製作過程。

製作升級包
假設如下:
當前使用者的RPM構建根目錄是 ~/rpmbuild.
軟體包名和版本號為 hellorpm-0.1

1.安裝hellorpm原始碼包,安裝程式將會把hellorpm原始碼包中的SPEC文件解壓到~/rpmbuild/SPECS,把原始碼歸檔包和補丁檔案安裝到~/rpmbuild/SOURCES。
2. 獲得一個乾淨的hellorpm原始碼樹,該步操作將在SPEC文件的內容的控制下,從SOURCES目錄下解壓原始碼歸檔檔案到BUILD目錄,並打上所有SPEC文件中列出的補丁檔案和其他一些操作。該步操作命令如下:

$rpmbuild  -bp  SPECS/hellorpm.spec

3 現在一個完整的原始碼工作目錄以及生成,現在可以進入原始碼目錄,修改需要的內容,並可以在此目錄下使用configure和make命令進行測試,如果確認 完成原始碼的修改,則可以開始生成補丁檔案。在開始生成補丁檔案之前,為了確保補丁檔案的正確,這裡我推薦按如下操作生成補丁檔案:
首先進入BUILD目錄:

 cd  ~/rpmbuild/BUILD/

重新命名當前hellorpm原始碼工作目錄:

 mv hellorpm-0.1 hellorpm-0.1.work

按上面第2步從新生成一個乾淨的原始碼目錄:

 rpmbuild -bp  ../SPECS/hellorpm.spec

重新命名上步生成的原始碼目錄:

 mv hellorpm-0.1 hellorpm-0.1.new

把在前面原始碼樹中所做的原始碼的確定修改再次更新的hellorpm-0.1.new中,完成修改操作後,再次重複第二步操作生成一個乾淨的原始碼目錄,並使用diff命令生成補丁檔案,生成的補丁檔案將存放於SOURCES目錄,操作如下:

 rpmbuild -bp  ../SPECS/hellorpm.spec
 diff -uNr  hellorpm-0.1  hellorpm-0.1.new >../SOURCES/hellorpm-0.1-test.patch

注意,使用 diff 時運用了選項 -uNr 。 -u 以 統一格式建立補丁檔案,這種格式比預設格式更緊湊些。 -N 確保補丁檔案將正確地處理已經建立或刪除檔案的情況。 -r 比較命令列上所給出的兩個目錄的所有子目錄中的所有檔案。

另外還要注意:只要您完全按上述來做,這些目錄名是無關緊要的。 補丁檔案中將有這些目錄名,但我們將通知補丁程式忽略它們。

檢查一下補丁檔案 hellorpm-0.1.patch可以確認補丁檔案內容是否正常。

到此補丁檔案製作成功,接著需要修改SPEC文件加入新生成的補丁檔案的內容。下面是一個已該好的hellorpm SPEC文件的模板,大家可以參考。

hellorpmp.spec檔案內容

Summary: hellorpm is a test program。
Name: hellorpm
Version: 0.1
Release: 1                    #注意更新該程式碼
Source0: %{name}-%{version}.tar.bz2
License: GPL
Group: Development/Tools
BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root

Patch0:hellorpm-0.1-test.spec  #新加入行

%description
The hellorpm program is a test.
%prep
%setup -q
%patch0  -p1                  #新加入行
%build
#./configure                
make
%install
make DESTDIR=$RPM_BUILD_ROOT install
%files
%defattr(-,root,root)
/usr/local/bin/hellorpm
%doc %attr(0444,root,root) /usr/local/man/man1/hellorpm.1
%doc README

對於這個簡單例子中,SPEC文件對於新補丁檔案的改變主要是兩行,也就是上面加註的兩行,補丁檔案序號順序遞增,且上下兩處之間的數字是對應的。另一個修改是軟體版本號的修改,一般修改Release後面的數值以便和老的版本區別。

現可以使用下面命令生成新的RPM原始碼包和二進位制安裝包等其他包, 新生成的原始碼包在~/rpmbuild/SRPMS/目錄,二進位制安裝包和除錯資訊包在~/rpmbuild/RPMS。

 rpmbuild -ba  SPECS/hellorpm.spec

到此一個事例的RPM原始碼包的升級包製作過程全部完成。

一些特殊情況
1 如果在原始碼目錄中一些檔案增刪會影響到最終生成的二進位制安裝包中檔案的增刪,那麼可能需要修改SPEC文件中file欄位的內容,file欄位中列出的文 件宣告這些檔案都將作為軟體包中檔案存在,構建程式再構建過程會核對該出列出的檔案和實際存在的檔案列表,任何不符都將報錯。如果你給hellorpmp 包新加了一個配置檔案hellorpm.conf,而最終此檔案的安裝目錄是/etc,那麼你可以在hellorpm.spec檔案中的file段新增如 下一行來宣告新檔案:

 %files
 /etc/hellorpm.conf

2 有些情況你在原始碼目錄中新增的新檔案,需要最後安裝到實際系統中,對於此安裝操作,你可能需要修改原始碼目錄中的Makefile檔案告訴它該如何安裝此文 件,新增安裝命令到SPEC文件中的install段可以達到同樣的效果,但你不要忘記上面提到的更新file欄位的操作。
3 對於一些需要在軟體包安裝到真實系統之後進行某些操作的需求,可以通過在SPEC文件post欄位新增命令語句方式實現。比如你想在安裝軟體包後新建或者 刪除一些檔案,或者改變某檔案的屬性等等,但原則是一般可以通過Makefile實現的操作步推薦使用post指令碼的方式。

注:上面介紹的補丁檔案的製作不適合一種情況,即對於有二進位制檔案變化情況,上面介紹的方法生成的補丁檔案無法完全表示其中內容的變化,關於此問題的解決,目前我推薦的辦法是直接更新原始碼目錄歸檔檔案。

注2:此內容是對上面[注:]內容的補充,如果原始碼中有非文字檔案的增加,可以通過在SPEC文件中新增Source的方式宣告,並在下面的預處理段(pre)中正確的此宣告即可。