1. 程式人生 > >自己製作rpm軟體包(1)

自己製作rpm軟體包(1)

  我們都知道,在目前的Linux環境下,要安裝新軟體,通常有兩種方式:一是使用原始碼安裝;二是使用rpm軟體包。使用原始碼安裝可以讓使用者瞭解編譯過程,及定製一些模組,和修改編譯引數,但其工作量通常都很大,而且要求使用者有足夠的計算機知識。而rpm軟體包方式則相對來說比較簡單,也易於管理和升級。所以,當前Linux發行版的前十中,有八個都是使用基於二進位制軟體包方式的(deb和rpm格式可以互轉)。同樣的,紅旗也是基於rpm的打包方式。
  下面要寫的,就是如何製作自己的rpm包。這通常是為了減輕工作上帶來的麻煩,例如分發軟體到客戶手上,或統一版本升級等。
一、關於rpm包
引用 1、rpm包:簡單來說,就是把已經編譯好的二進位制程式碼整合到一個檔案裡面,並且加入一些判斷,如安裝位置、依賴或衝突的軟體包、安裝前或後自動執行的指令碼等等;

2、相容性:由於rpm包在製作的時候,是在特定的發行版或硬體上編譯的,所以,不同發行版、或同一發行版不同版本號的rpm包一般都是不能互相相容的,甚至由於spec巨集的問題,使用.src.rpm編譯也未必可以成功;
3、大部分的軟體作者在釋出原始碼的同時,也會提供rpm或.spec檔案,除非沒有.spec檔案,否則不建議自行編寫,並且在編寫的時候,應使用標準巨集,以提高可讀性。
二、準備工作
在編譯RPM前,需要簡單瞭解一下編譯時使用到的目錄。
引用 [[email protected] asianux]# pwd
/usr/src/asianux
這個是紅旗上編譯RPM時使用的根目錄。(自定義%_topdir不算,下面會提到)

引用 [[email protected] asianux]# ll
total 40
drwxr-xr-x  2 root root 4096 May 31 13:21 BUILD
drwxr-xr-x  8 root root 4096 Apr  6 00:08 RPMS
drwxr-xr-x  2 root root 4096 May 31 13:21 SOURCES
drwxr-xr-x  2 root root 4096 May 31 13:21 SPECS
drwxr-xr-x  2 root root 4096 Nov 30  2006 SRPMS
這些是編譯時使用到的目錄,其作用如下:

引用 BUILD - 編譯時的工作目錄,包括解壓和make都會放到這裡
RPMS  - 根據硬體平臺的不同,存放最後生成的RPM軟體包
SOURCES - 存放原始碼包的地方,原始碼必須以.tar.gz方式打包好
SPECS - 存放編譯RPM時的.spec指令碼
SRPMS - 存放編譯好的.src.rpm軟體包
※有一種說法,就是不建議使用root使用者去編譯RPM包,而上述目錄都必須使用root使用者才能讀寫的。所以,我們可以使用下面的方式在使用者主目錄中建立一系列準備目錄:
echo "%_topdir $HOME/rpm" >> $HOME/.rpmmacros
mkdir $HOME/rpm
mkdir $HOME/rpm/SOURCES
mkdir $HOME/rpm/SPECS
mkdir $HOME/rpm/BUILD
mkdir $HOME/rpm/SRPMS
mkdir $HOME/rpm/RPMS
mkdir $HOME/rpm/RPMS/i386
那今後,你就可以用對應的使用者在這些目錄上編譯RPM包了。(小心,有些軟體的rpm必須使用root編譯)
※避免生成 debuginfo 包
打包過程預設會建立 debuginfo 包。大部分情況下,打包的軟體已經是穩定版,我們並不需要除錯程式,而普通使用者也沒有能力除錯,所以每次都生成 debuginfo 包就顯得沒有太大必要了。我們可以建立一個自己家目錄下的 rpm 配置檔案 .rpmmacros,寫入一行定義來禁止打包過程生成 debuginfo 包: 
引用 echo '%debug_package %{nil}' >> ~/.rpmmacros
三、編譯rpm
我們先以clamav軟體包為例,從下面可以找到.src.rpm或.spec檔案,有了這兩個檔案,要生成rpm包通常都是很簡單的。
下載地址:點選
1、存放到對應的路徑
cd SOURCES/
wget http://dag.wieers.com/rpm/packages/clamav/clamav-0.90.2-2.rf.src.rpm
2、開始編譯
rpmbuild --rebuild clamav-0.90.2-2.rf.src.rpm
這個通常都是結尾部分,提示生成的rpm放在哪裡:
引用 ......
Wrote: /usr/src/asianux/RPMS/i386/clamav-0.90.2-2.rf.i386.rpm
Wrote: /usr/src/asianux/RPMS/i386/clamd-0.90.2-2.rf.i386.rpm
Wrote: /usr/src/asianux/RPMS/i386/clamav-db-0.90.2-2.rf.i386.rpm
Wrote: /usr/src/asianux/RPMS/i386/clamav-devel-0.90.2-2.rf.i386.rpm
Wrote: /usr/src/asianux/RPMS/i386/clamav-debuginfo-0.90.2-2.rf.i386.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.73550
+ umask 022
+ cd /usr/src/asianux/BUILD
+ cd clamav-0.90.2
+ /bin/rm -rf /var/tmp/clamav-0.90.2-2.rf-root
+ exit 0
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.73550
+ umask 022
+ cd /usr/src/asianux/BUILD
+ rm -rf clamav-0.90.2
+ exit 0
3、生成的rpm會放在這裡
引用 [[email protected] asianux]# ll /usr/src/asianux/RPMS/
total 11176
-rw-r--r--  1 root root  748454 Jun  1 16:04 clamav-0.90.2-2.rf.i386.rpm
-rw-r--r--  1 root root 9503667 Jun  1 16:04 clamav-db-0.90.2-2.rf.i386.rpm
-rw-r--r--  1 root root  838685 Jun  1 16:04 clamav-debuginfo-0.90.2-2.rf.i386.rpm
-rw-r--r--  1 root root  238038 Jun  1 16:04 clamav-devel-0.90.2-2.rf.i386.rpm
-rw-r--r--  1 root root   73708 Jun  1 16:04 clamd-0.90.2-2.rf.i386.rpm
4、可以關注一下.src.rpm的內容,下一日誌教程中會用到
引用 # cp clamav-0.90.2-2.rf.src.rpm /tmp
# cd /tmp
# rpm2cpio clamav-0.90.2-2.rf.src.rpm |cpio -idvm
clamav-0.90.2.tar.gz
clamav-milter.init
clamav.init
clamav.spec
可以看到,其實.src.rpm中就存放有:
引用 clamav-0.90.2.tar.gz - 原始碼.tar.gz - 對應放在SOURCES目錄 -解壓後會放在BUILD目錄
clamav.spec - 生成rpm的.spec指令碼檔案 - 對應放在SPECS目錄
clamav-milter.init -初始化檔案 - 在生成rpm的過程中,會放在BUILD目錄
clamav.init -初始化檔案- 在生成rpm的過程中,會放在BUILD目錄

生成rpm的過程會進行上述的操作,只是在最後執行%clean時,所有臨時檔案被清空而已。
※舊的發行版,或者說舊的rpm套件,會使用類似rpm --rebuild進行rpm的生成工作。而在新的版本中,通常都是獨立開來的。例如,在紅旗上使用的就是:
引用 # rpm -qa|grep rpm-build
rpm-build-4.3.3-18_nonptl.2AX
有幾個常用的引數可以瞭解一下:
引用 # rpmbuild --help
--rebuild    從 構建二進位制軟體包
-ba            從 構建原始碼和二進位制軟體包
-bb            從 只構建二進位制軟體包
-bs            從 只構建原始碼軟體包
-ta             從 構建原始碼和二進位制軟體包
-tb             從 只構建二進位制軟體包
-ts             從 只構建原始碼軟體包
標識如下:
引用 指的是.src.rpm
指得是.spec
指得是把原始碼打包成的.tar.gz格式
構建原始碼包 指生成.src.rpm(也就是通過.tar.gz和.spec生成)
構建二進位制軟體包 指生成最後的.rpm