○、前言 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 打造屬於自己的作業系統環境,這應該是許多 Linux 玩家的夢想, 如今,隨著 Red Hat Linux 與 RPM 系統漸受大家重視,實現夢想 的過程似乎不再那麽痛苦了。「前人種樹,後人乘涼」,您是否在 乘涼享受之馀,心中也曾升起一股熱忱,希望「好東西能和好朋友分享」? 期待本文有機會提供指引功能,透過拋磚引玉的效果,讓網路上更多的 Linux 同好,能夠一起貢獻心力。 一、准備工作 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 什麽是 RPM 如果您當真還不知道,或是不清楚「什麽是 RPM」,很抱歉,您應該另外先做完下列的功課: 1. 讀過 RPM-HOWTO 對於 RPM 的簡介部份,中譯的 RPM-HOWTO 一文 可由 http://www.linux.org.tw/CLDP/RPM-HOWTO.Html 取得。 請先讀完前三章。 2. 實際安裝過 Red Hat Linux,這是提供 RPM 系統的最佳作業平台 ,並能讓您感受整個 RPM 運作的概況。 注:如果您事先已熟悉 Debian Linux 之 dpkg 系統,那麽請放心,RPM 應該會比 dpkg 來得容易,能夠熟悉 Debian Linux 的朋友,相信早已完全涵蓋上述的基本功夫。 帶著您的武器我們准備上路了,因此您必須檢查下列的「隨身武器」,要是缺了任何一項,很抱歉,請務必補齊: 1. 至少一個順手的編輯器,寫程式用的。 2. 熟悉 bash/ksh script 語法,其重要性真的難以言喻。 3. 熟悉諸如 grep、 sed、 awk、 install、 ldconfig 等工具程式的使用,多多益善。 4. 熟悉 rpm 程式之四大基本功能:install、 upgrade、 query、 verify 5. 基本 C 語言編譯技巧,至少包括 Makefile 寫作概念,diff、patch 的使用。 注:究竟該具備多少 C 語言的相關技巧,這點我也說不上來,嚴格地講,在下也是程式白癡一個。所以,視情況而定吧。如果您希望制作難度高的包裹檔案,那麽高超的編譯除錯技巧,勢必需要,如果原始碼的作者,早就寫好一份完美的 Makefile,那麽直接 make、make install,倒也全不費功夫。或許有人專精 Perl、Python、Tk/Tcl、Java 之類的語言,這原本也是好事,特別是在制作這類與「另類語言」相關的包裹檔案時,您應該會倍感親切。不過,再次強調,shell script 是 RPM 的基本語言,而 C 則是 RPM 的常態語言,像 Perl、Python、Tk/Tcl、Java 雖然也能解決幾乎所有問題,但考慮可攜性與程式體積,您不可不三思啊。而且,別小看 grep、sed、awk這些小型工具,它們與 bash 搭配的威力,應該可以滿足所有 RPM 制作時的需要。 二、參考資料 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 或許 RPM-HOWTO 應該是第一份需要參考的文件,不過在下建議「目的僅在獲得基本概念」,或者說,您若能從頭讀完本文件,八成也能夠了解 RPM-HOWTO 的內容,因為我已經嘗試在本文中,想像「以一種您能理解吸教收的方式」來重述 RPM-HOWTO 的要點。當然,您也可以抱怨中文版 RPM-HOWTO 譯得太糟糕,致使聰明如您有看沒有懂。這樣的說法,在下確實能夠體會,因為 RPM-HOWTO 也是由在下執筆中譯,老實說,當初譯完後的我,也不敢妄稱了解 RPM。 Maximum RPM 則是在下力薦的「寶典」,這應該是現存最詳盡完整的RPM 專書,深入淺出帶領讀者了解 RPM 系統。該書原本是 Red Hat公司的出版品,由 Ed Bailey 所撰寫,熱心慷慨的他,額外在網路上放了 PostScript 檔供人下載,且讓我們獻上最高的敬意吧。整份PostScript 檔若列印出來,共計四百馀頁,有心專研者,可以考慮印下,不然,則可以用 Ghostscript 線上閱讀。如果您想直接購買書籍,可以前往 http://www.redhat.com/ 查詢。Http://www.rpm.org/ 與 RPM 之 mailing list,內行的都知道 :-) 三、制作 RPM 的流程大綱 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 建造 RPM 包裹檔案的基本步驟如下: 1. 確定您的 /etc/rpmrc 已經符合系統所需,完成設定。 2. 取回所要建造的 source code。 3. 進行所需的 source 檔案 patch 動作, 以使得我們能順利地build 整個程式。 4. 為包裹檔案撰寫一份 spec 檔案。 5. 確認每個檔案都在正確的目錄位置。 6. 使用 RPM 來 build 整個包裹檔案。 /etc/rpmrc 檔案 RPM 系統的控制檔,system-wide 的設定檔是 /usr/lib/rpmrc,而customized 的設定檔則是 /etc/rpmrc。一般而言,/usr/lib/rpmrc檔案的內容完全無須去更動,如果有任何新設定,請寫在 /etc/rpmrc裡頭,因為它會「蓋過」 /usr/lib/rpmrc 的設定值。下列是我的/etc/rpmrc 檔案范例: #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-# # /etc/rpmrc # # # # Local customizations are made to override /usr/lib/rpmrc. # #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-# distribution: Manhattan require_distribution: 1 vendor: twLUG require_vendor: 1 packager: Penelope Marr 其他額外的重要資訊 有關 RPM 包裹檔案的制作流程,事實上還有許多重要的細節,必須牢記在心,這部份請先行參考 RPM-HOWTO 裡 [Building RPMs] 說明。 四、一個最簡單的范例 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 讓我們由一個 helloworld 的 RPM 包裹檔案學起吧,保證簡單到辣翻天。您可以照著整個范例,自行演練一番,由於它們既小又簡單,應該不致於對您的系統造成任何影響。 咱們「清純」的 source 假設狀況: 這個 helloworld-1.0-1.tgz 檔案裡就只有兩個檔案,一個是 README,內容如下 ( 其實內容一點也不重要 ):Simple Example for RPM Package Building DEMO.一個是 helloworld.c ,內容如下 ( 因陋就簡啦,反正這也不重要 ): main() { printf("Hello, World\n"); } 好的,你必須把這個 tgz 檔案放在 /usr/src/redhat/SOURCES 底下。 編寫 spec 檔案 必須在 /usr/src/redhat/SPECS 底下編寫 helloworld-1.0-1.spec, 內容范例: Summary: Simple Example for RPM Building DEMO. Name: helloworld Version: 1.0 Release: 1 Copyright: Open Source Group: Extensions/Chinese Source: helloworld-1.0-1.tgz Packager: Penelope Marr %description This package is used as a demo for RPM building only. %changelog * Thu Jul 16 1998 Penelope Marr - build for the first time. %prep %setup -c %build make helloworld %install install -m 755 helloworld /usr/local/bin/helloworld %files %doc README /usr/local/bin/helloworld □ 啟動 rpm -ba ... Example# cd /usr/src/redhat/SPECS example# rpm -ba helloworld-1.0-1.spec 1> /tmp/out 2> /tmp/err 這種方式,可以方便我們更容易掌握相關資訊。 五、制作「可隨處安裝」的包裹檔案 -=-=-=-=-=-=-=-=-=-=-=-=-=-=- 所謂「relocatable package」,在下將之稱為「可隨處安裝的包裹檔案」,相關的詳細說明,可以參考 Maximum RPM 第十五章。由於多了 Prefix 的設定功能,使得這類的包裹檔案附加更大的彈性,非常實用,但同時,也額外增加包裹檔案制作的難度。 內容范例: Summary: Simple Example for RPM Building DEMO. Name: helloworld Version: 1.0 Release: 2 Copyright: Open Source Group: Extensions/Chinese Source: helloworld-1.0-1.tgz Packager: Penelope Marr Prefix: /usr/local %description This package is used as a demo for RPM building only. %changelog * Fri Jul 17 1998 Penelope Marr - make the relocatable package. * Thu Jul 16 1998 Penelope Marr - build for the first time. %prep %setup -c %build make helloworld %install install -m 755 helloworld /usr/local/bin/helloworld %files %doc README /usr/local/bin/helloworld □ 啟動 rpm -ba ... Example# cd /usr/src/redhat/SPECS example# rpm -ba helloworld-1.0-1.spec 1> /tmp/out 2> /tmp/err example# rpm -ba helloworld-1.0-1.spec 1> /tmp/out 2> /tmp/err 這樣完成的 rpm 檔案,於安裝時,可以加 --prefix 參數,使得它安裝至我們希望的其他目錄下。 Example# rpm -Uvh -v --prefix /root helloworld-1.0-1.i386.rpm 六、進階技巧 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 「模仿」很重要,特別是仿效別人的精典之作,往往可以獲得不少經驗,觸發許多靈感。SRPM 檔案則是學習模仿的最佳工具,在下自個兒收集了超過一千八百個 SRPM 檔案,從別人的 spec 檔案中,確實可以□清許多盲點。 前面咱們只介紹了兩個簡單的范例,目的僅在引介 RPM 的制作流程,本身並沒有什麽難度。其他進階的技巧,諸如「其他有用的 spec 標簽」「多重包裹檔案的制作」「相依關系」「設定 Build Root」「增加 PGP簽證功能」「Subpackage 的制作」,每個項目都相當精采。充份了解後,不但可以制作包裹檔案,自娛娛人,還可以藉此了解 Red Hat Linux的架構,一兼二顧,摸蛤兼洗褲。 自制 RPM 讓 Linux 「個人化」「中文化」的理想,變得更容易且有系統, 希望您能從中收益良多