Next Previous Contents

6. Building RPMs

如果您可以自個兒取得所需的軟體,那麼建造 RPM 檔案也是非常簡單的。

建造 RPM 檔案的基本步驟如下:

如果一切操作正確, RPM 便能順利 build 完成 binary 與 source 程式套件。

6.1 The rpmrc File

目前為止, RPM 系統唯一的設定檔, 是透過 /etc/rpmrc 檔案來管理。 其內容範例如下:

require_vendor: 1
distribution: I roll my own!
require_distribution: 1
topdir: /usr/src/me
vendor: Mickiesoft
packager:  Mickeysoft Packaging Account <packages@mickiesoft.com>

optflags: i386 -O2 -m486 -fno-strength-reduce
optflags: alpha -O2
optflags: sparc -O2

signature: pgp
pgp_name: Mickeysoft Packaging Account
pgp_path: /home/packages/.pgp

tmppath: /usr/tmp

檔案中的 require_vendor 這一行敘述, 用以控制 RPM 是否須要找尋 vendor 那一行敘述, 而 verdor 的資訊可能來自 /etc/rpmrc 或是 spec 檔案的 header 處。 如果您把上述的號碼改為 0, 便能把這項尋找功能關閉。 這樣的設定方式, 同樣適用於 require_distributionrequire_group 的敘述上。

接下來, 我們看到 distribution 這一行, 您可以在此設定, 或是日後在 spec 檔案的 header 處設定。 當我們在某個 distribution 上 build 程式套件時, 就算不需要查詢設定, 此行內容的設定正確, 也是能夠帶來許多便利。 vendor 那一行的作用, 和上述的 distribution 非常相似, 但其內容並不限定 ( 例如是 Joe's Software 或 Rock Music Emporium )。

RPM 目前支援「多平台架構」的程式套件 build 功能, 我們可以在 rpmrc 檔案裡指定 ``optflags'' 變數, 當進行程式套件 build 動作時, 便可依據所需的平台類型, 應用特定的變數內容。 我們將會在接下去的章節裡, 說明如何使用這些變數。

除了上述的 macro 設定外, 還有許多其他的設定方式, 您可以使用:

rpm --showrc
來查看系統的 tag 與可供使用的 flag 有哪些。

6.2 The Spec File

在此我們將討論 spec 檔案的設定。 build 一個程式套件時, 我們需要使用到 spec 檔案, 其內容為該程式套件的說明, 額外還包括一些指令, 用以指示整個 build 的過程, 還有一份檔案列表, 用以表示程式套件中的檔案, 分別被安裝到哪裡。

spec 檔案的命名方式, 最好是遵循標準的慣例, 其格式應該為 package name-dash-version number-dash-release number-dot-spec。

這裡我們舉一個小型的 spec 檔案為例 (vim-3.0-1.spec):

Summary: ejects ejectable media and controls auto ejection
Name: eject
Version: 1.4
Release: 3
Copyright: GPL
Group: Utilities/System
Source: sunsite.unc.edu:/pub/Linux/utils/disk-management/eject-1.4.tar.gz
Patch: eject-1.4-make.patch
Patch1: eject-1.4-jaz.patch
%description
This program allows the user to eject media that is autoejecting like
CD-ROMs, Jaz and Zip drives, and floppy drives on SPARC machines.

%prep
%setup
%patch -p1
%patch1 -p1

%build
make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"

%install
install -s -m 755 -o 0 -g 0 eject /usr/bin/eject
install -m 644 -o 0 -g 0 eject.1 /usr/man/man1

%files
%doc README COPYING ChangeLog

/usr/bin/eject
/usr/man/man1/eject.1

6.3 The Header

檔案 header 的部份, 有幾個特定的欄位內容, 您必須加以設定完成, 另外還有幾點注意事項。 您必須設定完成的欄位內容如下:

6.4 Prep

這裡是 spec 檔案的另一個段落章節, 用以設定讓 source 檔案就緒, 以供下一步的 build 動作。 平常我們必須經過 setup, 才能實際進行 make 動作, 因此在本段落章節中, 我們將視需要進行 source 檔案的 patch 與 setup。

有件事值得注意的: 接下來的段落設定, 實際上只是指明某段 shell scripts 的位置, 您可以將 shell scripts 的內容, 另外以 sh script 的方式加以存檔, 並將 script 程式名稱置於 %prep tag 之後, 用以執行 source 檔案的 unpack 與 patch 動作。 當然, 以原有之 macro 型式來做, 應該是方便許多的。

第一個要說明的 macro 是 %setup。 如果我們採用其最簡單的格式 ( 即不加任何命令列參數的情況 ), 它會單純地將 source 檔案加以 unpack, 並 cd 進入 source 檔案的目錄。 除此之外, 您還可以使用下列的選項:

接下來要說明的 macro 是 %patch。 它是用來協助自動處理 source 檔案更新的動作, 其相關的選項很多, 列表說明如下:

這些應該就是全部所需要知道之 macro 說明, 了解它們之後, 您也可以透過 sh 之 script 格式, 設定不同的 setup 方法, 在 %build macro ( 在下一章節中會提及 ) 之前, 您所設定之所有選項, 都是經由 sh 來執行, 您可以再參考一下前述的範例, 或許可以適用於您的需要。

6.5 Build

這個章節裡, 所述及的並非真正的 macro。 當您把 source 檔案 untar, 並且 patch 完成, cd 進入目錄之後, 開始準備 build 動作時, 便是在這裡設定那些控制 build 動作的指令。 而這些指令都還是傳給 sh, 所以任何 sh 之指令, 都可以在此指定 ( 包括 comments 在內 )。 在 spec 檔案裡的每一段落章節設定中, 您的目前所在目錄位置, 都會被重新設定為 source directory 的最上層, 所以請牢記在心, 必要時, 您可以 cd 進入相關的子目錄。

6.6 Install

這裡所設定的, 同樣也不是 macro, 基本上, 您只須要在此設定一些 install 所需之指令。 如果您打算在程式套件裡, 提供完整的 make install 指令設定, 那麼請在本段落設定中完成, 不然, 您也可以更改 makefile 檔案裡, 有關 make install 的部份, 然後僅在本段落設定中指定 make install。 或是, 也可以把整個 install 的指令交給 sh 來做。 記住, 您的目前所在目錄位置, 應該已被重新設定為 source directory 的最上層。

6.7 Optional pre and post Install/Uninstall Scripts

程式套件在安裝與解除安裝之前後,您可以指定 script, 使其視情況加以執行。 進行此項動作的主要原因之一, 便是遇到如下的場合, 譬如說, 我們在安裝或解除安裝一些含有 shared library 的程式套件時, 需要執行 ldconfig。 各式 script 所需之 macro 名稱如下:

這些段落設定的內容, 可以是任何 sh 型式之 script, 不過, 您無須指定關鍵敘述 #!/bin/sh

6.8 Files

本段落設定當中, 您必須列出程式套件內之所屬檔案名稱。 RPM 本身並無從得知, 執行 make install 之後, 到底有哪些 binary 檔案被安裝進去, 目前並無他法可以直接解決此問題。 有些人建議在 install 程式套件的前後, 使用 find 指令來處理, 不過在一個多使用者的系統下, 這應該是不可行的, 因為在程式套件 build 的過程中, 可能有其他與程式套件本身無關的檔案被產生。

另外還有一些 macro, 它們可用來做一些特殊的工作, 茲將其列述於下:

在檔案列表裡, 有個最大的注意事項, 便是目錄的設定。 如果您不小心將 /usr/bin 列入, 那麼您的程式套件, 將會包括系統裡 /usr/bin 底下的所有檔案。

6.9 Building It

The Source Directory Tree

第一件事, 您必須選定一個適當的 build tree, 此項設定可在 /etc/rpmrc 檔案裡完成, 而大多數人會直接使用 /usr/src

您可能還需要建立下列的目錄, 使得 build tree 的設定能夠完成:

Test Building

首先, 您大概會想要取回 source 檔案, 在沒有使用 RPM 的情況下, 進行一次「純淨的」 build 動作。 其步驟便是, 解開 source 檔案, 將該目錄名稱改為 $NAME.org, 然後再次解開 source 檔案, 我們需要使用此一 source 來進行 build 動作。 進入此一 source 目錄, 按照指示來進行 build, 如果您必須編輯任何東西, 您會需要一份 patch, 一旦您完成 build 工作, 便可清除 source 目錄裡的內容。 請確定將 configure script 裡, 所有產生之檔案加以清除, 然後再 cd 回到 source 目錄之上層, 接著便可執行這樣的動作:

diff -uNr dirname.orig dirname > ../SOURCES/dirname-linux.patch
上述指令會產生一份 patch, 您在 spec 檔案可以使用到它。 注意到上面的 ''linux'' 名稱, 它只是一個提示作用, 或許您可以使用其他名稱, 諸如 ''config'' 或 ''bugs'' 之類的提示名稱, 用以說明您何以製作此一 patch 檔案。 同時, 您最好也在使用 patch 檔案之前, 先觀察裡頭的內容, 確定是否無意間包含了其他的 binary 檔案。

Generating the File List

現在, 您已經有了一份可以拿來 build 的 source 檔案, 而且您也知道如何完成其相關的動作, 如 build 與 install 等。 觀察 install 時, 依序產生的結果, 我們將由此結果, 在 spec 檔案中建立一份檔案列表。 通常我們會在進行上述步驟的同時, 一起建立 spec 檔案, 您可以先完成檔案的起始部分, 和幾個簡單的部分, 然後再把其他部分的步驟加以完成。

Building the Package with RPM

一旦您有了一份 spec 檔案, 一切便已就緒, 您可以準備 build 的測試動作。 最好的方式, 就是使用類似下列的指令:

rpm -ba foobar-1.0.spec

配合 -b 選項, 我們還可以使用其他有用的選項:

配合 -b 選項, 另外還有一些細項選項可供使用, 它們分別是:

6.10 Testing It

一旦有了 source 與 binary 的 rpm 檔案, 您必須進行測試工作。 最簡單且最好的方式, 就是使用另一台機器來測試, 也就是進行 build 動作之外的機器。 畢竟, 您剛在您的機器上, 完成一大堆的 make install 動作, 若在原機器上做測試, 當然會顯得相當順利囉。

您可以執行 rpm -u packagename 來進行測試, 但這樣做還是有造假的可能, 因為在 build 的過程中, 您做了 make install 的動作, 如果您在檔案列表中遺漏了某些東西, 那麼它不會被解除安裝, 然後您再 reinstall 這份 binary 程式套件, 便會發現整個系統還是完整而運作正常的, 但實際上的 rpm 檔案還是有問題。 因此請特別記住, 由於您執行的是 rpm -ba package, 而大多數的人, 會只以 rpm -i package 方式, 來安裝您的程式套件。 當 binary 檔案獨自被安裝時, 您必須確定在 buildinstall 的段落設定中, 並沒有相關的部份對其有影響。

6.11 What to do with your new RPMs

一旦您作出了一份自己的 RPM 檔案 ( 假定這份檔案, 之前並未以 RPM 方式製作過 ), 您可以將您的作品貢獻給別人 ( 此時假定您製作的 RPM 檔案, 是可以自由傳佈的 )。 您可以考慮把它上傳至 ftp.redhat.com

6.12 What Now?

請回顧上述的章節, 在「Testing」和「What to do with new RPMs」裡, 我們希望所有的 RPM 檔案都能被提供出來, 而且我們希望它們都會是好的 RPM 檔案。 因此, 請多花一點時間好好地測試它們, 然後再花點時間將它們上傳, 以造福普羅大眾。 同時, 確定您只上傳可供自由傳佈的軟體。 商業軟體與共享軟體是應該被上傳的, 除非它們有份許可聲明在上面。 這樣的軟體, 包括有 Netscape software、 ssh、 pgp 等。


Next Previous Contents