From Fedora Project Wiki

< Zh

Fedora 打包教學

閲讀注意事項

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

前言

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

推薦參考文章

事前準備工作

1. 安裝 rpmbuild、rpmdevtools、rpmlint 包。 rpmbuild 是執行打包的工具包, rpmdevtools 是提高打包後勤工作效率的工具包, rpmlint 為檢查 spec 規格檔案正確性的工具包。 2. 執行 rpmdev-setuptree ,打包用檔案系統 rpmbuild/{BUILD,RPMS SOURCES,SPECS,SRPMS} 會在 ~/ 被自動建立。 3. 移到 ~/rpmbuile/SPECS/ ,執行 rpmdev-newspec 。一個新的 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
* Thu Jan 31 2008 Caius Chance <cchance@redhat.com> - 0.99-3.fc9
- Fixed locale 'sv' files appearing twice.

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

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

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

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

* Sat Dec 15 2007 Caius Chance <cchance@redhat.com> - 0.1-2.fc9
- Corrected executable file path parameters.

* Fri Dec 14 2007 Caius Chance <cchance@redhat.com> - 0.1-1.fc9
- Adopted from community as new package.

包裝 SRPM 測試源碼包

1. 在 ~/rpmbuild/SPECS 執行 rpmbuild -ba 你的軟件名稱.specs ,測試包裝 RPM 和 SRPM 包(也可以只執行 rpmbuild -bs 你的軟件名稱.specs 只測試 SRPM 包) 2. 如有包裝期間有錯誤回饋或發生其他問題,可以檢查 ~/rpmbuild/SOURCES 內的檔案、 .spec 檔、或執行 rpmbuild -bp 你的軟件名稱.specs 後檢查 ~/rpmbuild/BUILD 內的檔案。 3. 其實有比較懶惰的辦法(在從 cvs 伺服器 check out 出來文件夾內以 make [command] 做相同的動作,只是要有全部重新 check out 的心理準備);請在 cvs check out 出來的文件夾內輸入 make help 獲得更多資訊。 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-import.sh 你的SRPM檔案名稱 ,將源碼和相關檔案匯入到本地的 cvs 文件夾。 2. [請進入下一部分]

正式編譯 RPM 安裝包

1. 檢查所有檔的正確性。 2. 確定所有相關檔案都經已上傳至 cvs 伺服器(或其他伺服器):(所有來自作者/官方網站的源碼包,最好是自動包裝過程中從來源服務器實時下載;否則由於源碼檔案有可能過大,不適合上傳到 cvs 伺服器影響效率。應該把它們上傳至個別設置的源碼檔案眝存伺服器: make upload FILES=[源碼包檔案名稱] (如要清除伺伺器上舊有的源碼檔碼檔案,第一個上傳的檔案要執行以下命令: make new-sources FILES=[源碼包檔案名稱] ),再把 source 和 .cvsignore 兩個檔案 check in 到 cvs 伺服器上。) 3. 執行 make tag 建立新的 tag 標簽。tag 標簽用於標示所有 RPM 安裝包有關的檔案,附有 checksum 以對照檔案的狀態。如果希望保留發行版本號 (n-v-r 的 r),除第一次建立 tag 標簽,可執行 make force-tag 覆蓋最新建立的 tag 標簽。 4. 如一切順利,執行 make build ,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