rpm打包整理

首先介紹下RPM

RPM 是 Red Hat Package Manager 的縮寫,原意是Red Hat 軟件包管理。 

這裏先介紹一下RPM的一些用法。

查詢功能: 

 1、對系統中已經安裝的軟件查詢:rpm -q softwarename

 2、查詢系統中已安裝的包:rpm -qa [softwarename] 

 3、查詢已安裝軟件包都安裝到何處:rpm -ql softwarename 

安裝,刪除 rpm -ivh softwarename.rpm rpm -e softwarename


 其餘更多的用法參照man rpm


打包前的工作:

1、安裝打包套件:$sudo yum install rpm-build 

2、建立打包的環境: 不建議用 root 來打包套件,所以請改用一般的使用者身分來打包套件,首      先要安裝 fedora-rpmdevtools 這個套件. 

 接著執行 fedora-buildrpmtree 來建立打包的環境:

 $sudo yum install fedora-rpmdevtools 執行完後,就會在HOME目錄下生成rpmbuild目錄 

 在 rpmbuild 目錄底下又有 BUILD RPMS SOURCES SPECS SRPMS 五個子目錄 

 也可以自己手動創建這五個目錄:mkdir -p ~/{BUILD,RPMS,S{OURCE,PEC,RPM}S} 

 這些目錄的作用如下 

 BUILD 編譯時所用的暫存目錄 

 RPMS 放置打包好的套件

 SOURCES 放置套件的原始碼及修補檔等等 

 SPECS 放置 .spec 檔 SRPMS 放置 Source RPMS (.src.rpm) 

3、這裏爲了提高書寫spec文件的效率,介紹幾個vim的插件 

 spec文件裏面有Group和%Changelog書寫比較麻煩, 

 Group的插件下載:http://git.linux- ren.org/qomo-toolkit/tree/vim/rpmgroups.vim,

 將rpmgroups文件放在/usr/share/vim/vim72/plugin/下, 

 然後執行source /usr/share/vim/vim72/plugin/rpmgroups.vim 

 在/etc/vimrc文件最後加上:let packager = "",

 “ ”中的是你的郵箱名。 

 然後在寫Group時在插入狀態下按\g,就會出來group選項,選擇就好,不用擔心書寫錯誤; 

 在書寫%Changelog時,在命令狀態下按\c就會把剛纔在/etc/vimrc文件最後加的那句會自動補  上去,很方便使用的。


運行 rpmbuild -ba filename.spec 時,RPM 都 做些什麼:

讀取並解析 filename.spec 文件
運行 %prep 部分來將源代碼解包到一個臨時目錄,並應用所有的補丁程序。
%setup –q
%patch,%patch0,%patch1
運行 %build 部分來編譯代碼。
運行 %install 部分將代碼安裝到構建機器的目錄中。
讀取 %files 部 分的文件列表,收集文件並創建二進制和源 RPM 文件。
運行 %clean 部 分來除去臨時構建目錄。


打包最主要的就是書寫spec文件,下面是一個spec文件的模板,後面就主要對這個文件和遇到的問題進行說明

Name:         #包名
Version:         #版本號 注: 版本號中不能含減號(-)字符。
Release:    1%{?dist} #釋出號 注: 釋出號中亦不能含減號(-)字符。
Summary:         #簡單的說明

Group:             #軟件所屬類別 這個就用到了上面所說的那個vim插件
License:         #軟件適用的許可證或版權規則 也可用Copyright(版權)來定義,二者同意
URL:             #打包軟件有關信息的網頁地址。
Source0:         #RPM打包時要包含的程序源碼文件。
BuildRoot:    %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

BuildRequires:    
Requires:    

%description

%prep
%setup -q

%build
%configure
make %{?_smp_mflags}

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root,-)
%doc

%changelog


spec文件說明:(這裏我們用pcmanfm這個包作說明)
文件頭(必選段):Name Version Release Summary Gruop License
可選的有:Vendor  Packager
功能段:%description  %files

Group 部份請參考:
/usr/share/doc/rpm-*/GROUPS 或是 http://fedoraproject.org/wiki/RPMGroups
舉個例子:
Group: Applications/System
License: GPL
URL: http://pcmanfm.sourceforge.net
Source0: http://jaist.dl.sourceforge.net/sourceforge/pcmanfm/pcmanfm-0.3.0-beta3.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Source 部份,最好是包含整個網址,而不要只有檔名而已
若有好幾個 Source 則用 Source0 Source1 Source2 … 依此類推
若有 Patch 檔就需要用到 (例: Patch0: pcmanfm-0.3.0-beta3-Makefile.patch)
若有好幾個 Pacth 則用 Patch0 Patch1 Patch2 … 依此類推

BuildRequires 及 Requires 的部份就要看原作者是否有提到需要哪些套件
不然,就得從 mock build 時的 build.log 中
慢慢去找出所需要的 BuildRequires 及 Requires

BuildRequires: automake >= 1.9, gtk2-devel >= 2.6, gamin-devel
Requires: gtk2 >= 2.6, gamin

%prep
一般我們用setup -p
單數如果像這樣的軟將源碼包:pcmanfm-0.3.0-beta3.tar.gz
%setup macro 會把 source code tarball 解開並自動進到 %{name}-%{version} 的目錄中
因爲我們把 Version Tag 0.3.0-beta3 的 beta3 拆到 Release Tag 去
Version Tag 變成 0.3.0,所以 %setup 在 rpmbuild 時會出問題
rpmbuild 會解開 pcmanfm-0.3.0-beta3.tar.gz 並試著進到 pcmanfm-0.3.0 (%{name}-%{version}) 的目錄中
但實際上應該是要進到 pcmanfm-0.3.0-beta3 的目錄纔對
因此,我們必須加上 -n pcmanfm-0.3.0-beta3 來解決這個問題
若有 Source2 Source5 等等的 tarball 同時也要解開時,可以使用 -a 參數來指定 (例: %setup -q -a 2 -a 5)
若有 Patch 檔則同樣在這裏做處理 (例: %patch1 -p1 -b .bak)
其他一些在正式 build (make) 前要做的特殊處理,都可以在這裏做
(例: find . -name \*.h -o -name \*.c | xargs chmod ugo-x)
%prep
%setup -q -n pcmanfm-0.3.0-beta3
其實還有一個辦法,就是把這個包解壓,然後重新打包爲:pcmanfm-0.3.0.tar.gz,這樣在Release時寫beta3也可以。
(這個是個投機取巧的方法,但是確實解決了不少麻煩)

%build
若有需要加 configure 的參數,可以加在 %configure 後面
(例: %configure –prefix=%{_prefix})
若還有其他的編譯指令需要執行時,都可以加在這裏
%build
%configure
make %{?_smp_mflags}

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT
一般我們是安裝在$RPM_BUILD_ROOT下的

另外,關於 desktop 檔的部份,要在 %install 中使用 desktop-file-install 來處理
然後在 %files 中加入一行:
%{_datadir}/applications/fedora-pcmanfm.desktop
BuildRequires 的部份也要加入 desktop-file-utils:
BuildRequires: automake >= 1.9, gtk2-devel >= 2.6, gamin-devel, desktop-file-utils
另外還要加入:
Requires(post): desktop-file-utils
Requires(postun): desktop-file-utils
%post 及 %postun 的部份也要做處理
Desktop files 請參考: http://fedoraproject.org/wiki/Packaging/Guidelines#desktop

%clean
rm -rf $RPM_BUILD_ROOT
這個是最後清理階段

下面這四項很少用到,(這個要到一定的階段,例如自己打補丁時)
%post
update-desktop-database %{_datadir}/applications >/dev/null 2>&1 || :
用來處理套件安裝完成後要執行的指令
%postun
update-desktop-database %{_datadir}/applications >/dev/null 2>&1 || :
用來處理套件移除後要執行的指令
%pre
用來處理套件安裝前要執行的指令
%preun
用來處理套件移除前要執行的指令

下來測試打包:
當然上面的書寫並沒有完全寫好spec文件,需要在下面的測試後才能完整的寫好spec文件。
1.rpmbuild -bc
rpmbuild -bc 會從一開始一直做到 %build 爲止
用來檢查到 %build 爲止是否還有問題
若有發現任何錯誤,如 command not found 等等
就要去 check required package 然後加到 Requires/BuildRequires 中
$rpmbuild -bc pcmanfm.spec

這裏如果有錯誤,一般的都是說Not found ****,一般都是缺少某個開發包
在這裏有個辦法,就是先用yum search **** | grep dev 來查尋,看源裏是否有這個開發包,
如果有的話,就直接用yum install ****-devel 安裝(這裏的****-devel根據search的結果決定)

rpmbuild -bi
rpmbuild -bi 會從一開始一直做到 %install 爲止
rpmbuild -bi pcmanfm.spec
這裏經常會出現的錯誤爲:
warning: Installed (but unpackaged) file(s) found:
/usr/bin/pcmanfm
/usr/share/applications/pcmanfm.desktop
/usr/share/locale/ca/LC_MESSAGES/pcmanfm.mo
/usr/share/locale/de/LC_MESSAGES/pcmanfm.mo
/usr/share/locale/es/LC_MESSAGES/pcmanfm.mo
/usr/share/locale/fr/LC_MESSAGES/pcmanfm.mo
/usr/share/locale/zh_TW/LC_MESSAGES/pcmanfm.mo
。。。。。。。。。

這裏我們就要補充我們的%files段
針對上面這個問題,我們在%files段加入
%{_bindir}/pcmanfm
%{_datadir}/*  #這裏是一個簡寫

相關的 macros 可以在 http://fedoraproject.org/wiki/Extras/RPMMacros 查詢到
/usr/lib/rpm/macros需要的可以在這個文件理全有。
常見的如:
%{_sysconfdir} /etc
%{_initrddir} %{_sysconfdir}/rc.d/init.d
%{_prefix} /usr
%{_exec_prefix} %{_prefix}
%{_bindir} %{_exec_prefix}/bin
%{_lib} lib
%{_libdir} %{_exec_prefix}/%{_lib}
%{_libexecdir} %{_exec_prefix}/libexec
%{_sbindir} %{_exec_prefix}/sbin
%{_sharedstatedir} %{_prefix}/com
%{_datadir} %{_prefix}/share
%{_includedir} %{_prefix}/include
%{_oldincludedir} /usr/include
%{_var} /var
%{_tmppath} %{_var}/tmp
請儘量改用 macros 來取代 /etc /usr/bin /usr/lib 的寫法

用 rpmbuild -bs 來產生 SRPMS
用 rpmbuild -bb 來產生 RPMS
用 rpmbuild -ba 來同時產生 SRPMS 及 RPMS(一般只需直接執行這句)

最後需要注意的一些問題:
不需要加到 BuildRequires 中的 Exceptions
bash
bzip2
coreutils
cpio
diffutils
fedora-release (and/or redhat-release)
gcc
gcc-c++
gzip
make
patch
perl
redhat-rpm-config
rpm-build
sed
tar
unzip
which
詳細清單請參考: http://fedoraproject.org/wiki/Extras/FullExceptionList

Documentation
若有相關的說明文件,可以獨立成 -doc subpackage
並以 Documentation 當作 Group Tag
Configuration files
設定檔請使用 %config(noreplace) 來代替 %config
只有當設定檔有變時,才改用 %config 來覆蓋掉舊的
Macros
詳細的 Macros 請參考: http://fedoraproject.org/wiki/Extras/RPMMacros
不要使用 %makeinstall macro
直接用: make DESTDIR=$RPM_BUILD_ROOT install

RPM 建包參考文件

http://fedoraproject.org/wiki/Docs/Drafts/BuildingPackagesGuide

http://koti.welho.com/vskytta/packagers-handbook/packagers-handbook.html

http://fedoraproject.org/wiki/Packaging/Guidelines

http://fedoraproject.org/wiki/ParagNemade/PackagingNotes

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章