Linux下製作RPM軟體包的關鍵所在

火星人 @ 2014-03-12 , reply:0


  隨著RedHat Linux的風靡全球,其軟體包管理工具及格式RPM也得到推廣。基於RPM源代碼開放、安裝卸載簡單、升級維護方便及查詢功能強大的特點,越來越多的開發者喜歡採用RPM格式來發布自己的軟體包,更多的用戶從中受益。那麼,RPM軟體包是怎樣製作的呢?

其實,製作RPM軟體包並不是一件複雜的工作,其中的關鍵在於編寫SPEC軟體包描述文件。下面以我製作小趙編輯器LZE的軟體包(lze-6.0-1.i386.rpm)為例,詳細說明一下軟體包的製作過程。

1.mkdir -p /usr/src/dist/{BUILD,RPMS/i386}

上述命令用於創建兩個目錄/usr/src/dist/BUILD與/usr/src/dist/RPMS/i386,前一個目錄是RPM建立軟體包時用的目錄,后一個是RPM輸出軟體包的目錄,我的LZE軟體包lze-6.0-1.i386.rpm就是在此目錄下存放的。這兩個目錄不創建,運行rpm命令建包時將報錯退出。

注意:輸出目錄名i386,意味著這是台X86的機器。如果你的機器與此體系不同,則目錄名也要相應更換。

2.編寫軟體包描述文件lze-6.0-1.spec

要想製作一個軟體包,就必須寫一個軟體包描述文件(SPEC)。這個文件中包含了軟體包的諸多信息,如軟體包的名字,版本,類別,說明摘要,創建時要執行什麼指令,安裝時要執行什麼操作,以及軟體包所要包含的文件列表等等。

LZE軟體包描述文件lze-6.0-1.spec比較簡單,僅用於創建二進位程序包。其描述文件內容如下:(每行開頭的數字為所在行在文件中的行號)

1 Summary:小趙全屏幕中英文多窗口多功能編輯器(Linux/UNIX系統適用)
2 Name:lze
3 Version:6.0
4 Release:1
5 Vendor:縱橫軟體製作中心(Email:zhsoft@etang.com)
6 Copyright:Share
7 Group:Applications/Editors
8 Source:http://zhsoft.myetang.com/lze-6.0.tar.gz
9 %description
10 小趙編輯器,是為使用SCO UNIX,Linux多用戶系統的廣大用戶專門設計的全屏幕多窗
11 口中英文多功能編輯器。
12 它主要有以下十大特點:1.全屏幕菜單操作。2.顯示方式多樣。3.塊操作豐富。4.十
13 字製表功能強大。5.多窗口操作靈活自如。6.文件操作功能齊全。7.解釋輸出功能獨具特
14 色。8.自帶中文輸入法(增強五筆和增強拼音),實用方便。9.十六進位編輯功能,如虎
15 添翼。10.即時翻譯,按到即譯。
16 總之,小趙編輯器會成為您在UNIX,Linux系統上編製程序和書寫一般性文稿的好幫手。
17 它將在工作中助您一臂之力,輕鬆上陣,遊刃有餘!
18
19 %prep
20 # prep start.
21
22 %build
23 # build start.
24 cp /root/{讀我,版權聲明} .
25
26 %install
27 # install start.
28
29 %files
30 %defattr (-,root,root)
31 %doc 讀我
32 %doc 版權聲明
33 %config /etc/funkey.def
34 %config /etc/inputme.def
35
36 /usr/bin/lze
37 /usr/bin/lzeime.py
38 /usr/bin/lzeime.wb
39
40 %changelog
41
42 * Fri May 1 1998 雨亦奇 <zhsoft@etang.com>
43 - 增加多窗口操作
44
45 * Mon Mar 24 1997 雨亦奇 <zhsoft@etang.com>
46 - 增加塊操作命令
47

描述文件說明如下:

(1)文件頭

它包含以下幾個域:

* Summary:
軟體包一句話說明,一行有效。
* Name:
軟體包的名字,RPM用該名字與版本號,釋出號及體系號來命名軟體包。如,本例輸出的軟體包名為lze-6.0-1.i386.rpm。
* Version:
軟體版本號。僅當軟體較以前有較大改變時才增加版本號。
* Release:
軟體釋出號。若軟體較以前改變較小,則僅增加釋出號,不改變版本號。
* Vendor:
軟體開發者的名字。
* Copyright:
軟體包所採用的版權規則。具體有: GPL(自由軟體),BSD,MIT,Public Domain(公共域),Distributable(貢獻),commercial(商業),Share(共享)等。
* Group:
軟體包所屬類別,具體類別有:
Amusements/Games (娛樂/遊戲)
Amusements/Graphics(娛樂/圖形)
Applications/Archiving (應用/檔案)
Applications/Communications(應用/通訊)
Applications/Databases (應用/資料庫)
Applications/Editors (應用/編輯器)
Applications/Emulators (應用/模擬器)
Applications/Engineering (應用/工程)
Applications/File (應用/文件)
Applications/Internet (應用/網際網路)
Applications/Multimedia(應用/多媒體)
Applications/Productivity (應用/產品)
Applications/Publishing(應用/印刷)
Applications/System(應用/系統)
Applications/Text (應用/文本)
Development/Debuggers (開發/調試器)
Development/Languages (開發/語言)
Development/Libraries (開發/函數庫)
Development/System (開發/系統)
Development/Tools (開發/工具)
Documentation (文檔)
System Environment/Base(系統環境/基礎)
System Environment/Daemons (系統環境/守護)
System Environment/Kernel (系統環境/內核)
System Environment/Libraries (系統環境/函數庫)
System Environment/Shells (系統環境/介面)
User Interface/Desktops(用戶界面/桌面)
User Interface/X (用戶界面/X窗口)
User Interface/X Hardware Support (用戶界面/X硬體支持)
* Source:
源程序軟體包的名字。
* %description:
軟體包具體說明,可寫在多個行上。示例中第10-18行均為說明。

(2)%prep段

這個段是預處理段,通常用來執行一些解開源程序包的命令,為下一步的編譯安裝作準備。%prep和下面%build,%install段一樣,除了可以執行RPM所定義的宏命令(以%開頭)以外,還可以執行SHELL命令,命令可以有很多行。示例中,本段只有第20行一行註釋語句(以#開頭),不執行任何操作。

(3)build段

本段是建立段,所執行的命令為生成軟體包服務。

本段第23行是註釋行,第24行執行的是拷貝命令,將/root目錄下的兩個文件(讀我,版權聲明)拷貝到軟體包建立目錄(/usr/src/dist/BUILD)。

(4)%install段

本段是安裝段,其中的命令在安裝軟體包時將執行。示例中,本段只有第27行一行註釋語句(以#開頭),不執行任何操作。

(5)%files段

本段是文件段,用於定義軟體包所包含的文件,分為三類--說明文檔(doc),配置文件(config)及執行程序,還可定義文件存取許可權,擁有者及組別。本段中:

第30行-%defattr宏:定義文件存取許可權為默認值(用-表示默認值,也可選擇八進位數值,如0777等),定義擁有者為root,定義組別為root。

第31,32行-%doc宏:用該宏定義軟體包所含的說明文檔,若沒有指定目錄,則目錄為/usr/src/dist/BUILD。每個宏只能定義一個說明文檔。說明文檔一般安裝在「/usr/doc/軟體包名-版本號-釋出號」目錄下。

第33,34行-%config宏:定義軟體包應用的配置文件,象sendmail.cf,passwd等。當卸載含有配置文件的軟體包時,任何未作改動的配置文件將被刪除,改動過的配置文件將自動改名,後綴加上.rpmsave,以便再度安裝這個軟體包時可以迅速恢復使用。

第36-38行-為軟體包所包含的文件名列表,可以寫許多行。如果文件名指示的是一個目錄,則該目錄下的所有文件將被包含在軟體包中,注意不要弄錯了。

(6)%changelog段

本段是修改日誌段。你可以將軟體的每次修改記錄到這裡,保存到發布的軟體包中,以便查詢之用。

每一個修改日誌都有這樣一種格式:第一行是:* 星期 月 日 年 修改人 電子信箱。

其中:星期、月份均用英文形式,用中文會出錯。

接下來的行寫的應是修改了什麼地方,可寫多行。一般以減號起始,便於查閱。

3.rpm -bb lze-6.0-1.spec

用此命令生成軟體包,執行后屏幕將顯示如下信息:(每行開頭為行號)

1 Executing: %prep
2 + umask 022
3 + cd /usr/src/dist/BUILD
4 + exit 0
5 Executing: %build
6 + umask 022
7 + cd /usr/src/dist/BUILD
8 + cp /root/讀我 /root/版權聲明.
9 + exit 0
10 Executing: %install
11 + umask 022
12 + cd /usr/src/dist/BUILD
13 + exit 0
14 Processing files: lze
15 Executing: %doc
16 + umask 022
17 + cd /usr/src/dist/BUILD
18 + DOCDIR=/usr/doc/lze-6.0
19 + export DOCDIR
20 + rm -rf /usr/doc/lze-6.0
21 + /bin/mkdir -p /usr/doc/lze-6.0
22 + cp -pr 讀我 /usr/doc/lze-6.0
23 + cp -pr 版權聲明 /usr/doc/lze-6.0
24 + exit 0
25 Finding Provides: (using /usr/lib/rpm/find-provides)...
26 Finding Requires: (using /usr/lib/rpm/find-requires)...
27 Requires: ld-Linux.so.2 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1)
28 Wrote: /usr/src/dist/RPMS/i386/lze-6.0-1.i386.rpm

第28行顯示: 製作完成軟體包,名字為lze-6.0-1.i386.rpm,在/usr/src/dist/RPMS/i386目錄下。

4.軟體包製作完成後,可用以下命令查詢一下,看看效果。如果不滿意的話,可以再次修改軟體包描述文件,重新運行上一步命令,產生新的RPM軟體包。

轉到/usr/src/dist/RPMS/i386目錄,執行以下命令:

(1)rpm -qpi lze-6.0-1.i386.rpm

此命令用於查詢指定軟體包的頭部信息,結果如下:(以行號開頭)

1 Name: lze Relocations: (not relocateable)
2 Version : 6.0 Vendor: 縱橫軟體製作中心(Email:zhsoft@etang.com)
3 Release : 1 Build Date: 2001年07月12日 星期四 13時33分21秒
4 Install date: (not installed) Build Host: 縱橫軟體製作中心
5 Group : Applications/Editors Source RPM: lze-6.0-1.src.rpm
6 Size: 532081 License: Share
7 Summary : 小趙全屏幕中英文多窗口多功能編輯器(Linux/UNIX系統適用)
8 Description :
9 小趙編輯器,是為使用SCO UNIX,Linux多用戶系統的廣大用戶專門設計的全屏幕多窗
10 口中英文多功能編輯器。
11 它主要有以下十大特點:1.全屏幕菜單操作。2.顯示方式多樣。3.塊操作豐富。4.十
12 字製表功能強大。5.多窗口操作靈活自如。6.文件操作功能齊全。7.解釋輸出功能獨具特
13 色。8.自帶中文輸入法(增強五筆和增強拼音),實用方便。9.十六進位編輯功能,如虎
14 添翼。10.即時翻譯,按到即譯。
15 總之,小趙編輯器會成為您在UNIX,Linux系統上編製程序和書寫一般性文稿的好幫手。
16 它將在工作中助您一臂之力,輕鬆上陣,遊刃有餘!

(2)rpm -qpl lze-6.0-1.i386.rpm

此命令用於查詢指定軟體包的全部文件列表,將命令中的-qpl換作-qpd,將顯示文檔文件列表,換作-qpc將顯示配置文件列表。

命令執行結果如下:(行號開頭)

1 /etc/funkey.def
2 /etc/inputme.def
3 /usr/bin/lze
4 /usr/bin/lzeime.py
5 /usr/bin/lzeime.wb
6 /usr/doc/lze-6.0
7 /usr/doc/lze-6.0/版權聲明
8 /usr/doc/lze-6.0/讀我

查詢結果一切正常,軟體包製作到此結束。

小結

在Linux下製作RPM軟體包關鍵在描述文件,寫起來著實簡單,根據上述步驟生成軟體包后,就可以對外發布了。在其它機器上用安裝命令(rpm -i 包名)可安裝這個軟體包,若想卸載,可用命令(rpm -e 包名)來卸載這個包,非常方便。





[火星人 via ] Linux下製作RPM軟體包的關鍵所在已經有271次圍觀

http://www.coctec.com/docs/linux/show-post-69785.html