動手製作 SRPM
最近更新日期:2003/02/11
本網頁已經經過更新,最新資訊放置在 RPM 與 SRPM 套件管理員 當中。
本網頁內容已不再繼續維護更新!

SRPM 需要的套件
SRPM 使用到的目錄
設定檔的主要內容
SRPM 的編譯指令
打包自己的套件
本章習題練習

SRPM 需要的套件:
在上一節當中,我們介紹了 RPM 這個既可愛又可恨的傢伙,RPM 的可愛在於他的資料庫管理方式,很容易去查詢與升級,而他的可恨呢?呵呵!就是在於他的 binary 的檔案不能再改變他的原始設定內容 ( 就是 *.rpm 的檔案不能再重新編譯的意思 ),與套件及套件之間的屬性相依的問題∼還真是傷腦筋吶!
沒有關係,現在有解決的方法了!我們可以利用『含有 source code 的 SRPM 』來重新編譯 *.rpm 的檔案成為我們所希望的樣式了!就因為在 SRPM 裡面含有的不是 binary 的檔案,而是含有 source code ,因此 SRPM 是不能直接拿來安裝成為可執行的檔案的。必需要將他重新編譯,並且打包成為類似 i386, i586, i686 等等 RPM 的檔案之後,才能夠安裝在我們的系統當中哩!這個時候你就應該會想像啦,咦!既然如此的話,那麼在編譯的過程當中,我們是否可以加入其他的設定參數,來讓我們的 SRPM 可以依照我的想法來編譯呢!?哈哈!答對了!所以呢,這個時候我們就要來修改別人的 SRPM 以及編譯自己的套件啦!
不過這裡需要特別留意的就是,因為 SRPM 需要重新編譯,而編譯的過程當中,我們至少需要有 make 與其相關的程式,及 gcc, c, c++ 等其他的編譯用的程式語言來進行編譯,所以,如果您在安裝的過程當中沒有選取軟體開發工具之類的套件,呵呵!得重新拿出你的光碟,然後再安裝喔!哈哈!只是得要克服一大堆的屬性相依的問題就是了∼嗯!還是建議您再次的看一下如何安裝吧!

SRPM 使用到的目錄:
SRPM 既然含有 source code ,那麼其中必定有設定檔囉,所以首先我們必需要知道,這個 SRPM 在進行編譯的時候,會使用到哪些目錄呢?這樣一來才能夠來修改嘛!你可以到你的 /usr/src 這個目錄裡面去查看一下,通常每個 distribution 提供的目錄都不太相同,以 Mandrake 9.0 為例,他是以 /usr/src/RPM 為工作目錄, Red Hat 是以 /usr/src/redhat 為工作目錄, Openlinux 則是以 /usr/src/openlinux 為工作目錄!無論如何,反正就是在 /usr/src 這個目錄下就對了!好了到 /usr/src/redhat 裡頭去看一看呦: 此外,在編譯的過程當中,可能會發生不明的錯誤,或者是設定的錯誤,這個時候就會在 /tmp 底下產生一個相對應的錯誤檔,您可以根據該錯誤檔進行除錯的工作呢!等到所有的問題都解決之後,也編譯成功了,那麼剛剛解壓縮之後的檔案,就是在 /usr/src/redhat/SPEC, SOURCE, BUILD 等等的檔案都會被殺掉,而只剩下放置在 /usr/src/redhat/RPMS 底下的檔案了!

設定檔的主要內容:
剛剛我們在上面提過了,SRPM還可以更改一些設定的內容,那麼要如何修改這些設定的內容呢?我們以簡單的 rp-pppoe 這個套件來說明好了,你可以連上 Internet 上面的 rp-pppoe 官方網站下載 SRPM ,或者由以下的方式來下載這個套件(請注意底下的檔案是 2002/11 最新的檔案資料,有可能在您看到本文時,這個套件已經更新了,所以請直接上底下的網址來下載吧!http://www.roaringpenguin.com/pppoe/)。至於基本的過程如下:
 
1. 下載 SRPM 軟體:
[root @test root]# wget http://www.roaringpenguin.com/pppoe/rp-pppoe-3.5-1.src.rpm

2. 將 SRPM 解開在/usr/src/redhat 底下的目錄當中
[root @test root]# rpm –i rp-pppoe-3.5-1.src.rpm

3. 觀察一下有哪些原始碼呢?
[root @test root]# cd /usr/src/redhat/SOURCES
[root @test SOURCE]# ls –l
-rw-rw-r--    1 root     root       189321 Jul  8 22:38 rp-pppoe-3.5.tar.gz
呵呵!上面顯示我們的原始碼就是這個檔案啦!

 
好了,來看看我們的設定參數檔,亦即是在 /usr/src/redhat/SPECS 內的 *.spec 檔案囉!
 
觀察一下預設的設定檔案內容:
[root @test root]# cd /usr/src/redhat/SPECS
[root @test SPECS]# vi rp-pppoe.spec

沒錯!這個就是SRPM的預設設定內容檔案囉,進去修改一下,裡面的資料有點像這樣:
Summary: PPP Over Ethernet (xDSL support)
Name: rp-pppoe
Version: 3.5
%if %(%{expand:test %{_vendor} != mandrake ; echo $?})
Release: 1mdk
%else
Release: 1
%endif
Copyright: GPL
Group: System Environment/Daemons
Source: http://www.roaringpenguin.com/pppoe/rp-pppoe-3.5.tar.gz
Url: http://www.roaringpenguin.com/pppoe/
Packager: David F. Skoll <dfs@roaringpenguin.com>
BuildRoot: /tmp/pppoe-build
Vendor: Roaring Penguin Software Inc.
Requires: ppp >= 2.3.7

# LIC: GPL
%description
PPPoE (Point-to-Point Protocol over Ethernet) is a protocol used by
many ADSL Internet Service Providers. Roaring Penguin has a free
client for Linux systems to connect to PPPoE service providers.

The client is a user-mode program and does not require any kernel
modifications. It is fully compliant with RFC 2516, the official PPPoE
specification.

%prep
%setup
cd src
./configure --mandir=%{_mandir}

%build
cd src
make
cd ../gui
make

%install
cd src
make install RPM_INSTALL_ROOT=$RPM_BUILD_ROOT
cd ../gui
make install RPM_INSTALL_ROOT=$RPM_BUILD_ROOT

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc doc/CHANGES doc/HOW-TO-CONNECT doc/LICENSE doc/KERNEL-MODE-PPPOE README SERVPOET
%config(noreplace) /etc/ppp/pppoe.conf

註:中間還有很多資訊,被我省略掉了!知道了就好喔!

%changelog
* Thu Jul 21 2001 Shigechika AIKAWA <shige@cin.nihon-u.ac.jp>
- merged rp-pppeo.spec and rp-pppoe-gui.spec

 
注意到的是rp-pppoe.sepc這個檔案,這是主要的將SRPM編譯成RPM的設定檔,他的基本規則可以這樣看:
  1. 整個檔案的開頭以Summary為開始,這部份的設定都是最基礎的說明內容;
  2. 然後每個不同的段落之間,都以%來做為開頭,例如%prep與%install等;
我們來談一談幾個常見的SRPM設定段落: 上面幾個資料通常都必需要寫啦!但是如果你的軟體沒有相依屬性的關係時,那麼就可以不需要那個Requires囉!
  好了,那麼如果您有自訂的資訊想要加入的話,就選擇你要加入的那個段落,將他修改一下吧!例如,如果你在設定Makefile的時候,希望能夠多一些額外的參數設定,那麼就找到 %setup 那個段落,將他修改成您所需要的樣子,就可以囉!

SRPM 的編譯指令:
再來呢?嗯!沒錯,修改完成了,自然就是要將他編譯成可以安裝的RPM檔案啦!這個時候我們就可以直接在/usr/src/redhat/SPECS底下下達:
 
[root @test SPECS]# rpm -bb rp-pppoe.spec  <==編譯成RPM檔案
[root @test SPECS]# rpm -ba rp-pppoe.spec  <==打包成SRPM檔案
 
這個時候系統就會這樣做:
  1. 先進入到BUILD這個目錄中,在Mandrake 9.0當中就是/usr/src/RPM/BUILD,在Red Hat底下就是/usr/src/redhat/BUILD這個目錄;
  2. 依照*.spec檔案內的Name與Version設定定義出工作的目錄名稱,以我們上面的例子為例,那麼系統就會在BUILD目錄中先刪除rp-pppoe-3.5的目錄,再重新建立一個rp-pppoe-3.5的目錄,並進入該目錄;
  3. 在新建的目錄裡面,針對SOURCES目錄下的來源檔案,也就是*.spec裡面的Source設定的那個檔案,以tar進行解壓縮,以我們這個例子來說,則會在/usr/src/redhat/BUILD/rp-pppoe-3.5當中,將/usr/src/redhat/SOURCES/rp-pppoe-3.5.tar.gz進行解壓縮啦!
  4. 然後就開始%setup的工作;
  5. 再來開始%build及%install的設定與編譯!
  6. 最後將完成打包的檔案給他放置到該放置的地方去,如果你的規定的硬體是在i386的系統,那麼最後編譯成功的*.i386.rpm檔案就會被放置在/usr/src/RPM/RPMS/i386裡面囉!如果是i586那麼自然就是/usr/src/redhat/RPMS/i586目錄下囉!
整個步驟大概就是這樣子!最後的結果資料會放置在RPMS那個目錄底下就對啦!

打包自己的套件:
這個就有趣了!我們自己來編輯一下自己製作的RPM怎麼樣?會很難嗎?完全不會!這裡簡單的以一個小例子來說明喔!請注意,這個真的只是一個小例子,所以不要覺得奇怪喔!其中,比較需要注意的,由於在上面的步驟說明中,我們知道在將SRPM編譯成為RPM的時候,會以tar這支程式來將檔案解開,因此,我們在進行來源檔案的建立時,就必需要將他打包成為一個tar.gz的tarball的檔案才行
假設我們編輯了一支script,內容是這樣:
 
[root @test root]# cd /usr/src/redhat/SOURCES
[root @test SOURCES]# vi showvbird.sh
#!/bin/bash
# This file is just used to demo the RPM packaging.
# the only thing is showing the hostname.
HOST=`/bin/hostname`
/bin/echo $HOST

[root @test SOURCES]# chmod 755 showvbird.sh
[root @test SOURCES]# tar –zcvf showvbird.tar.gz showvbird.sh
注意了,我們必需要將他打包才行!

 
上面的動作中,我們編輯了一個shell script檔案,檔名為showvbird.sh,並且將他打包成為具有gzip壓縮的tarball檔案,也就是showvbird.tar.gz這樣的檔案才行!請注意,這個showvbird.tar.gz檔案『必需』放置在SOURCES目錄之下!
再來則是要編輯那個很重要的*.spec檔案囉!你可以這樣簡單的編寫一下:
 
[root @test root]# cd /usr/src/redhat/SPECS
[root @test SPECS]# vi showvbird.spec
Summary:   This is a demo RPM package.
Name:      showvbird
Version:   1.0
Release:   1
Copyright: GPL
Group:     VBird's Home
Source:    showvbird.tar.gz   <==這個就是剛剛建立起來的 arball檔案!
Url:       http://linux.vbird.org
Packager:  VBird

%description
This package is just a demo RPM.

%prep
%setup –c
%install
install -m 755 showvbird.sh /usr/local/bin/showvbird.sh

%files
/usr/local/bin/showvbird.sh

 
好了!開始給他編譯並打包成為RPM檔案啦!
 
[root @test SPECS]# rpm -bb showvbird.spec
….(略)
Wrote: /usr/src/redhat/RPMS/i586/showvbird-1.0-1.i586.rpm
 
最後這個被打包成功的檔案就被放置在/usr/src/redhat/RPMS/i586/showvbird-1.0-1.i586.rpm囉!然後給他安裝一下:
 
[root @test SPECS]# rpm –ivh /usr/src/RPM/RPMS/i586/showvbird-1.0-1.i586.rpm
Preparing...                ########################################### [100%]
   1:showvbird              ########################################### [100%]

[root @test SPECS]# rpm –qi showvbird
Name        : showvbird                    Relocations: (not relocateable)
Version     : 1.0                          Vendor: (none)
Release     : 1                            Build Date: Wed 06 Nov 2002 11:27:17 PM CST
Install date: Wed 06 Nov 2002 11:27:42 PM CST      Build Host: test.linux.org
Group       : VBird's Home                 Source RPM: showvbird-1.0-1.src.rpm
Size        : 143                          License: GPL
Packager    : VBird
URL         : http://linux.vbird.org
Summary     : This is a demo RPM package.
Description :
This package is just a demo RPM.

[root @test SPECS]# showvbird.sh
test.linux.org
[root @test SPECS]# rpm –ql showvbird
/usr/local/bin/showvbird.sh       <==嘿嘿!已經記錄起來了!自己的軟體耶!

 
用很簡單的方式,就可以將自己的軟體或者程式給他修改與設定妥當!很不錯吧!以後您就可以自行設定你的RPM囉!當然,也可以手動修改您的SRPM的來源檔內容囉!

本章習題練習 ( 要看答案請將滑鼠移動到『答:』底下的空白處,按下左鍵圈選空白處即可察看 )

2002/12/04:第一次完成
2003/02/11:重新編排與加入 FAQ
2004/04/19:本網頁已不再繼續維護更新,請參考:RPM 與 SRPM 套件管理員