http://www.linuxfly.org/post/130/
?我們都知道,在目前的Linux環境下,要安裝新軟件,通常有兩種方式:一是使用源碼安裝;二是使用rpm軟件包。使用源碼安裝可以讓用戶了解編譯過 程,及定制一些模塊,和修改編譯參數,但其工作量通常都很大,而且要求用戶有足夠的計算機知識。而rpm軟件包方式則相對來說比較簡單,也易于管理和升 級。所以,當前Linux發行版的前十中,有八個都是使用基于二進制軟件包方式的(deb和rpm格式可以互轉)。同樣的,紅旗也是基于rpm的打包方 式。
? 下面要寫的,就是如何制作自己的rpm包。這通常是為了減輕工作上帶來的麻煩,例如分發軟件到客戶手上,或統一版本升級等。
一、關于rpm包
2、兼容性:由于rpm包在制作的時候,是在特定的發行版或硬件上編譯的,所以, 不同發行版、或同一發行版不同版本號的rpm包一般都是不能互相兼容的 ,甚至由于spec宏的問題,使用.src.rpm編譯也未必可以成功;
3、大部分的軟件作者在發布源代碼的同時,也會提供rpm或.spec文件,除非沒有.spec文件,否則不建議自行編寫,并且在編寫的時候, 應使用標準宏 ,以提高可讀性。
二、準備工作
在編譯RPM前,需要簡單了解一下編譯時使用到的目錄。
/usr/src/asianux
這個是紅旗上編譯RPM時使用的根目錄。(自定義%_topdir不算,下面會提到)
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
這些是編譯時使用到的目錄,其作用如下:
RPMS ?- 根據硬件平臺的不同,存放最后生成的RPM軟件包
SOURCES - 存放源碼包的地方,源碼必須以.tar.gz方式打包好
SPECS - 存放編譯RPM時的.spec腳本
SRPMS - 存放編譯好的.src.rpm軟件包
※有一種說法,就是不建議使用root用戶去編譯RPM包,而上述目錄都必須使用root用戶才能讀寫的。
所以,我們可以使用下面的方式在用戶主目錄中創建一系列準備目錄:
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 包:
三、編譯rpm
我們先以clamav軟件包為例,從下面可以找到.src.rpm或.spec文件,有了這兩個文件,要生成rpm包通常都是很簡單的。
下載地址:
點擊
1、存放到對應的路徑
wget http://dag.wieers.com/rpm/packages/clamav/clamav-0.90.2-2.rf.src.rpm
2、開始編譯
這個通常都是結尾部分,提示生成的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會放在這里
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的內容,下一日志教程中會用到
# 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.spec - 生成rpm的.spec腳本文件 - 對應放在SPECS目錄
clamav-milter.init -初始化文件 - 在生成rpm的過程中,會放在BUILD目錄
clamav.init -初始化文件- 在生成rpm的過程中,會放在BUILD目錄
生成rpm的過程會進行上述的操作,只是在最后執行%clean時,所有臨時文件被清空而已。
※舊的發行版,或者說舊的rpm套件,會使用類似rpm --rebuild進行rpm的生成工作。而在新的版本中,通常都是獨立開來的。例如,在紅旗上使用的就是:
rpm-build-4.3.3-18_nonptl.2AX
有幾個常用的參數可以了解一下:
--rebuild ? ?從
-ba ? ? ? ? ? ?從 構建源碼和二進制軟件包
-bb ? ? ? ? ? ?從 只構建二進制軟件包
-bs ? ? ? ? ? ?從 只構建源碼軟件包
-ta ? ? ? ? ? ? 從 構建源碼和二進制軟件包
-tb ? ? ? ? ? ? 從 只構建二進制軟件包
-ts ? ? ? ? ? ? 從 只構建源碼軟件包
標識如下:
指得是.spec
指得是把源代碼打包成的.tar.gz格式
構建源碼包 指生成.src.rpm(也就是通過.tar.gz和.spec生成)
構建二進制軟件包 指生成最后的.rpm
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
