Zh/RPM打包教學

= Fedora 打包教學 =

閲讀注意事項

 * 本指南是以 Fedora 8 為基礎，並不保證能在其他版本上實作.
 * 如果沒有注明需要管理目帳號的命令，一律以個人帳號執行.
 * 一切因為依照以下操作步驟而引致任何損失，本文所有參與編輯者恕不負責.

前言
這不是一篇完整的 RPM 打包參考文，而是一篇中文的打包導引文. 您不能期望單純的從這篇文章中找到所有打包應用到的知識與技巧，這裏提供的只是概略筆者以自己經驗歸納出的打包過程；世上高手何其多，網上文檔何其精，筆者非常鼓勵大家多參考多思考多實作. 請緊學習包含吸收知識與實踐，缺一不可，邊做邊學才能算是實務、才能算是學習；多看文檔、虚心發問、享受過程、累積成果.

推薦參考文章

 * Maximum RPM
 * Packaging Guidelines
 * Valid RPM Macros
 * Jason Corley's RPM Macros Table

事前準備工作
1. 安裝 rpmbuild、rpmdevtools、rpmlint 包. rpmbuild 是執行打包的工具包， rpmdevtools 是提高打包後勤工作效率的工具包， rpmlint 為檢查 spec 規格檔案正確性的工具包. 2. 執行  ，打包用檔案系統 rpmbuild/{BUILD,RPMS SOURCES,SPECS,SRPMS} 會在 ~/ 被自動建立. 3. 移到 ~/rpmbuile/SPECS/ ，執行. 一個新的 spec 規格檔案會被自動建立，它是一個純文字檔，裏面包含各種對 RPM 安裝包詳細設定；設定包括軟件本身的資訊、編譯／安裝／移除步驟、修改記錄等等内容. 4. ［請進入下一部分］

編輯 spec 規格檔案
以下是剛打包的 emesene RPM 的 .spec 檔案. 因為它不可能包含所有會用到的東西，所以只可以作為參考；在裏面作了大量的注解，應該可以幫助瞭解大致結構： 定義這些路徑的原因是省略 SPEC 檔接下來會用到的篇幅. %define appdir %{_datadir}/%{name} %define menudir %{_datadir}/applications %define icondir %{_datadir}/pixmaps %define podir  %{appdir}/po

Name:          emesene Version:       0.99 Release:       3%{?dist} Summary:       Instant messaging client for Windows Live Messenger (tm) network

Group:         Applications/Internet License:       GPLv2+ URL:           http://emesene.org Source0:       http://downloads.sourceforge.net/emesene/emesene-r806.tar.gz Source1:        emesene.desktop Patch0:        emesene-0.1-2.exec.patch BuildRoot:     %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildArch:     noarch

BuildRequires: desktop-file-utils, gettext Requires:      gtk2 Requires:      gnome-python2-extras Requires:      python

%description emesene is an instant messaging client for Windows Live Messenger (tm) network.

%prep %setup -q -n emesene -a0 %patch0 -p1

%build %{nil}

一些 %{__abc} 的是系統常用工具的macro，這樣做能令系統在安裝該 RPM 時才找出工具的位置，防止工具儲存位置的更改. %install %{__rm} -rf $RPM_BUILD_ROOT %{__install} -d $RPM_BUILD_ROOT%{appdir} %{__install} -d $RPM_BUILD_ROOT%{menudir} %{__install} -d $RPM_BUILD_ROOT%{icondir} %{__install} -d $RPM_BUILD_ROOT%{_bindir}

%{__cp} -R emesene/* $RPM_BUILD_ROOT%{appdir} %{__cp} $RPM_BUILD_ROOT%{appdir}/emesene $RPM_BUILD_ROOT%{_bindir}/ %{__cp} emesene/themes/default/trayicon.png $RPM_BUILD_ROOT%{icondir}/emesene.png desktop-file-install --dir $RPM_BUILD_ROOT%{menudir}/ %{SOURCE1}

%{__chmod} 755 $RPM_BUILD_ROOT%{appdir}/Controller.py

%{__mv} $RPM_BUILD_ROOT%{podir}/ar/LC_MESSAGES/emesen.po $RPM_BUILD_ROOT%{podir}/ar/LC_MESSAGES/emesene.po %{__mv} $RPM_BUILD_ROOT%{podir}/ar/LC_MESSAGES/emesen.mo $RPM_BUILD_ROOT%{podir}/ar/LC_MESSAGES/emesene.mo

%clean %{__rm} -rf $RPM_BUILD_ROOT

%files %defattr(-,root,root,-) %doc emesene/docs %doc emesene/COPYING %dir %{appdir} %dir %{podir} %lang(ar) %{podir}/ar %lang(de) %{podir}/de %lang(es) %{podir}/es %lang(fi) %{podir}/fi %lang(fr) %{podir}/fr %lang(hu) %{podir}/hu %lang(it) %{podir}/it %lang(nl) %{podir}/nl %lang(pt) %{podir}/pt %lang(pt_BR) %{podir}/pt_BR %lang(sv) %{podir}/sv %lang(tr) %{podir}/tr %lang(zh_CN) %{podir}/zh_CN %lang(zh_TW) %{podir}/zh_TW %{appdir}/[A-Za-oq-z] * %{appdir}/plugins_base %{_bindir}/emesene %{menudir}/emesene.desktop %{icondir}/emesene.png

%changelog - Fixed locale 'sv' files appearing twice.
 * Thu Jan 31 2008 Caius Chance  - 0.99-3.fc9

- Refined .spec file regarding 'file' section in spec. (rhbz#238379)
 * Tue Jan 29 2008 Caius Chance  - 0.99-2.fc9

- Sync to upstream perferred version number, refined .spec file. (rhbz#238379)
 * Mon Jan 14 2008 Caius Chance  - 0.99-1.fc9

- Updated .spec file by package reviewer's feedback. (rhbz#238379)
 * Mon Jan 07 2008 Caius Chance  - 1.0-2.fc9

- Updated .spec file by package reviewer's feedback. (rhbz#238379)
 * Fri Dec 21 2007 Caius Chance  - 1.0-1.fc9

- Corrected executable file path parameters.
 * Sat Dec 15 2007 Caius Chance  - 0.1-2.fc9

- Adopted from community as new package.
 * Fri Dec 14 2007 Caius Chance  - 0.1-1.fc9

包裝 SRPM 測試源碼包
1. 在 ~/rpmbuild/SPECS 執行   ，測試包裝 RPM 和 SRPM 包（也可以只執行   只測試 SRPM 包） 2. 如有包裝期間有錯誤回饋或發生其他問題，可以檢查 ~/rpmbuild/SOURCES 內的檔案、 .spec 檔、或執行  後檢查 ~/rpmbuild/BUILD 內的檔案. 3. 其實有比較懶惰的辦法（在從 cvs 伺服器 check out 出來文件夾內以  做相同的動作，只是要有全部重新 check out 的心理準備)；請在 cvs check out 出來的文件夾內輸入   獲得更多資訊. 4. ［請進入下一部分］

新包審批程序
一個軟件進入 Fedora 的 repository 讓公眾更新是需要經過一系列的審批程序的.

1. 確保 SRPM 源碼準備好. （用 rpmlint 檢查 .spec 規格檔） 2. 在 Red Hat 的 Bugzilla 系統建立一個新的 Bug 檔案. 3. 經過 Fedora 審批人確保 SRPM 源碼包符合標準後，會在 Bug 內授與一個審批通過的 fedora‑review ACK+. 4. 最後包裝人可以向有關有 cvs 管理權限的人員要求（把 fedora‑cvs flag 調成 + ），在 Fedora repository 建立一該軟件的 tree. 5. ［請進入下一部分］

匯入 SRPM 源碼包
1. 進入從 cvs 那裏 check out 的文件夾 e.g. ~/src/fedora/rpms/你的軟件名稱/common/ ，執行   ，將源碼和相關檔案匯入到本地的 cvs 文件夾. 2. ［請進入下一部分］

正式編譯 RPM 安裝包
1. 檢查所有檔的正確性. 2. 確定所有相關檔案都經已上傳至 cvs 伺服器（或其他伺服器）：（所有來自作者／官方網站的源碼包，最好是自動包裝過程中從來源服務器實時下載；否則由於源碼檔案有可能過大，不適合上傳到 cvs 伺服器影響效率. 應該把它們上傳至個別設置的源碼檔案眝存伺服器：  (如要清除伺伺器上舊有的源碼檔碼檔案，第一個上傳的檔案要執行以下命令：  )，再把 source 和 .cvsignore 兩個檔案 check in 到 cvs 伺服器上. ） 3. 執行  建立新的 tag 標簽. tag 標簽用於標示所有 RPM 安裝包有關的檔案，附有 checksum 以對照檔案的狀態. 如果希望保留發行版本號 (n-v-r 的 r)，除第一次建立 tag 標簽，可執行  覆蓋最新建立的 tag 標簽. 4. 如一切順利，執行  ，RPM 安裝包將會在中央包裝系統（正在服役的系統名稱: Koji）. 5. 看到文字介面訊息中看到所有工作為 done 後，代表 RPM 和 SRPM 等檔案已經被建立，正在為中央包裝系統所儲存. 6. ［請進入下一部分］

遞送到發行版本 （ Rawhide / 開發版本不用進行以下步驟）
1. 開啟並以 Fedora 帳號登入 Bodhi （發行版本遞送系統）. 2. 在左邊頁面按下 New Update ，把空格填上： Package = n-v-r 格式的包版本編號、 Release = 要遞送的發行版本、 Type = 更新種類（ bugfix 是補錯， enhancement 是改進， security 是保安）、Request = 要遞送的要求（ Testing 是測試 repository ，一般都先到那裏讓有興趣幫忙測試的人下載； Stable 是穏定 repository ，就是公眾使用者都能下載的，一般要先經過 testing 一段短時間沒有問題後才到那裏； None 是還沒準備好遞送的，暫時存檔. ）、 Bugs = 和此遞送有關的 bug. 若右邊空格選取，當更新遞送到 Stable ，系統會自動關閉該 bug 、 Notes = 備注、 Suggest Reboot 空格是要求使用者更新後重新啟動電腦. 3. ［完成！］

後輟
本文仍有很大的改進空間，歡迎提供任何意見，甚至動手修改完善. 謝謝您的閲讀！

最後修改： Kaio 13:23, 7 February 2008 (HKT)

作者原文： http://keimoto.net/wiki/index.php/Fedora_%E6%89%93%E5%8C%85%E6%95%99%E5%AD%B8

作者 Blog 最新位置： http://blog.kaio.com