RPM Tips

English Version

首先,我不會寫有關如何撰寫 RPM 的 spec 檔案。有關這個題目在網際網路已經有很多的 howto。撰寫一個 RPM spec 檔案可能很簡單或可能很複雜。這要看你要撰寫 RPM spec 檔案的程式本身。無論如何,這會需要蠻 多時間。

如果我要撰寫一個 RPM spec 檔案的話,我主要參考資料如下:

http://www.rpm.org/max-rpm/
http://www.rpm.org/RPM-HOWTO/

我從來不願意從來源程式安裝。不是因為難。相反的,蠻容易。只是,我不願意搞亂我的系統。如果我將從來源安裝 的程式更新,常常會發生的問題是還有一些檔案沒有被刪除的乾淨。有時候這種情況會產生問題。如果要刪除這個程式, 你怎麼保證所有被安裝的檔案都被刪除?

盡可能,我寧願用 RPM 來安裝。用 RPM 來更新和刪除,RPM 做的很乾淨。

所以,我在這邊想談的是:如果你只有來源程式,是否有辦法將來源程式轉換成 RPM 包裝?

如果我需要一個特定的程式,我會先到安裝 CD 找這程式。找不到的話,我會到 freshmeat,然後到 sourceforge.net 或者 google去找。

如果找不到 RPM 包裝,我會去找 rpmfind.

問題是:如果還是找不到這程式的 RPM 包裝呢?該怎麼辦才好?以下討論可能會解決這個問題,就是建 RPM 包裝終究是可能的。

你要建或重建 RPM 之前,你必須先安裝 rpm-build 包裝:

rpm   -Uvh   rpm-build-4.4.2.2-7.fc8.i386.rpm

註:以下方法都可以使用在 Redhat/Fedora。

要建或重建 RPM 的話,專家建議以一般使用者﹝不是 root﹞的身分來做這個工作。但做這個工作之前, 你必須建所謂的 RPM build directories ﹝建 RPM 所需要的子目錄﹞。現在以一般使用者身分登入, 然後建以下子目錄:

mkdir   rpmbuild
mkdir   rpmbuild/BUILD
mkdir   rpmbuild/RPMS
mkdir   rpmbuild/RPMS/athlon
mkdir   rpmbuild/RPMS/i386
mkdir   rpmbuild/RPMS/i486
mkdir   rpmbuild/RPMS/i586
mkdir   rpmbuild/RPMS/i686
mkdir   rpmbuild/RPMS/noarch
mkdir   rpmbuild/SOURCES
mkdir   rpmbuild/SPECS
mkdir   rpmbuild/SRPMS

現在建一個檔案,檔名為 .rpmmacros ﹝請注意這是所謂的 dot file,就是檔案名稱第一個字元是一個句點﹞,內容為:

%_topdir   /home/username/rpmbuild

username 應該改為真正一個使用者的帳號名稱。

我們現在已經就緒建 RPM 包裝了。請參考這個

Source RPM

如果你想安裝 ClamAV 防毒程式,從 crash-hat 你可以下載 RPM 包裝。 這個地方也提供 source rpm (.src.rpm)。我自己喜歡下載 source RPM 然後重建一個 RPM。這樣的做法是 完全針對我的系統來編譯。

重建就執行以下指令:

rpmbuild   --rebuild   clamav-0.93.1-1.src.rpm

重建 source RPM 之後,會建三個檔案如下:

rpmbuild/RPMS/i386/clamav-0.93.1-1.i386.rpm
rpmbuild/RPMS/i386/clamav-milter-0.93.1-1.i386.rpm
rpmbuild/RPMS/i386/clamav-devel-0.93.1-1.i386.rpm

Source Tarball with spec file

假如你想安裝 SpamAssassin。 在這網頁沒有提供 RPM 包裝。但是所提供的 source tarball 已包含了 RPM spec 檔﹝Mail-SpamAssassin-3.2.5.tar.bz2 和 Mail-SpamAssassin-3.2.5.tar.gz﹞。

你怎麼知道在 source tarball 裡有 RPM spec 檔?拿上段兩個檔案做例子,執行以下指令就會知道的:

tar   fzt   Mail-SpamAssassin-3.2.5.tar.gz   |   grep   .spec
tar   fjt   Mail-SpamAssassin-3.2.5.tar.bz2   |   grep   .spec

用這種方式建 RPM 包裝:

rpmbuild   -tb   Mail-SpamAssassin-3.2.5.tar.gz
rpmbuild   -tb   --define   "srcext   .bz2"   Mail-SpamAssassin-3.2.5.tar.bz2

Source tarball without spec file

我上面已提過,我不喜歡從來源程式安裝。但是來源程式沒有 spec 檔案,怎麼辦?請你安裝 CheckInstall 讓它幫你建 RPM。

建 RPM 包裝的程序如下:

tar   xvfz   program_name-version.tar.gz
cd   program_name-version
./configure
make

下一步本來要下:

make install

但是,這一次應該下:

checkinstall

Perl Modules

我好討厭 perl!要管理在系統已經安裝的 perl module 包裝是相當麻煩的事。我絕對拒絕從來源程式安裝 perl modules。因為這樣做會產生很多問題。如果你用來源程式更新的話,有可能你的應用程式已經不正常的運 作了。

但是我需要一個特定的 perl module 包裝。哪我該怎麼辦?譬如,在我們學校我們使用 OpenWebMail 來處理我們的電子郵件。但是 OpenWebMail 需要一個 perl module Text-Iconv。 因為我不喜歡從來源程 式安裝,所以我到網際網路找 Text-Iconv 的 RPM。我下載和安裝之後,OpenWebMail 仍然抱怨找不到 Text-Iconv。 抓頭了好幾天之後,我才發現這個 perl-Text-Iconv 的 RPM 包裝是在不同的 perl 版本編譯的。所以沒有用。 現在怎麼辦?

我終於找到 cpan2rpm 這個程式幫我解決這個問題。將這個 程式下載和安裝。然後執行:

cpan2rpm   Text-Iconv-1.4.tar.gz

這樣就會產生以下兩個檔案:

rpmbuild/RPMS/i386/perl-Text-Iconv-1.4-1.i386.rpm
rpmbuild/SRPMS/perl-Text-Iconv-1.4.1.src.rpm

註:cpan2rpm 所建的 rpm 包裝安裝時會放在 /usr/local/lib/perl5 而不是在 Redhat/Fedora 標準位置 /usr/lib/perl5。這也沒有問題因為 perl 仍然會找到這些 perl module。


cpan2rpm 註解 (2008/06/27):

cpan2rpm 從 Fedora 8 是有問題。按照這篇文章:

https://bugzilla.redhat.com/show_bug.cgi?id=279251

你必須編輯 /usr/bin/cpan2rpm 然後把 Pod::Text 修改為 Pod::Parser (兩個地方)。這樣就解決問題了。


Perl Modules 2

從 Fedora 7, Fedora 提供一個工具叫 cpanspec。這個工具是從 cpan (perl module) 建一個 spec 檔案。 你使用這 spec 檔案來建 rpm 包裝。

我要建 IP-Country-2.24.tar.gz 的 rpm 包裝當例子。

安裝 cpanspec:

yum install cpanspec

yum 就會安裝 cpanspec 和所有相依的檔案。

下載 cpan package (IP-Country-2.24.tar.gz) 在:

http://search.cpan.org/~nwetters/IP-Country-2.24/lib/IP/Country.pm

建 .spec 檔案:

cpanspec --packager="你的姓名寫在這邊" IP-Country-2.24.tar.gz

cpanspec 就會建 perl-IP-Country.spec 檔案。

建 rpm 包裝:

  1. cp IP-Country-2.24.tar.gz rpmbuild/SOURCES/
  2. rpmbuild -ba perl-IP-Country.spec
  3. 新建的 .rpm 和 .src.rpm 包裝會放在:
    rpmbuild/RPMS/noarch/perl-IP-Country-2.24-1.fc9.noarch.rpm
    rpmbuild/SRPMS/perl-IP-Country-2.24-1.fc9.src.rpm

註:用 cpanspec 所建的 rpm 包裝安裝時會放在 /usr/local/lib/perl5 而不是在 Redhat/Fedora 標準位置 /usr/lib/perl5。這也沒有問題因為 perl 仍然會找到這些 perl module。

現在你可以沒有問題的安裝這個 RPM 包裝了。

蔡由世神父
2005/03/21
更新:2008/06/29