實戰RPM包製作

  在開發中經常會用到一些rpm包,但是一直沒有自己手動製作過。今天在製作的時候意外地還解決了自己以前一直困惑的問題,就是怎麼製作rpm debuginfo包,類似CentOS官網那樣的debuginfo包。原來在製作rpm時如果沒有特殊設置就會在RPMS目錄下同時生成rpm包及對應的debuginfo包。
  下面總結一下製作rpm包的流程以及遇到的一些問題的解決。
  1、配置工作路徑
  在製作rpm包之前,首先要配置工作路徑,也就是製作rpm包所在的目錄,當前的工作路徑可以通過rpmbuild命令查看,如下所示:

  工作路徑是由_topdir變量指定的,默認情況下是當前用戶目錄下的rpmbuild目錄。如果你在製作rpm包之前不知道需要設置工作路徑的話,只是單純地照搬網上的一些文章,在後面製作的時候很有可能會報找不到源碼包等類似的錯誤。如果你不想在用戶目錄下的rpmbuild目錄製作rpm包,可以在當前用戶目錄下的.rpmmacros文件(如果沒有,則創建)中修改,格式爲:
% _topdir 你的目錄
我這裏設置的是/usr/src/redhat,後面的製作過程都是在這個目錄下進行。
  默認情況下會生成debuginfo包,如果不需要debuginfo包,在.rpmmacros文件中添加"%debug_package %{nil}"。
2、建立所需要的目錄
mkdir -pv /usr/src/redhat/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
 目錄說明:

3、編寫spec文件

  spec文件是製作rpm包的關鍵,定義了rpmbuild命令生成時需要遵循的一些規則。下面的spec文件是以nginx爲例來製作rpm包:

# 這個區域定義的Name、Version這些字段對應的值可以在後面
# 通過%{name},%{version}這樣的方式來引用,類似於C語言中的宏
 
# Name制定了軟件的名稱
Name:       nginx
# 軟件版本
Version:    1.5.2 
# 釋出號,也就是第幾次製作rpm
Release:    1%{?dist}
# 軟件的介紹,必須設置,最好不要超過50個字符
Summary:    Nginx from WangYing
 
# 軟件的分組,可以通過/usr/share/doc/rpm-4.8.0/GROUPS文件中選擇,也可以
# 在相應的分類下,自己創建一個新的類型,例如這裏的Server
Group:      Application/Server
# 許可證類型
License:    GPL
# 軟件的源站
URL:        http://nginx.org
# 製作rpm包的人員信息
Packager:   WangYing <[email protected]>
# 源碼包的名稱,在%_topdir/SOURCE下,如果有多個源碼包的話,可以通過
# Source1、Source2這樣的字段來指定其他的源碼包
Source0:    %{name}-%{version}.tar.gz
# BuildRoot指定了make install的測試安裝目錄,通過這個目錄我們可以觀察
# 生成了哪些文件,方便些files區域。如果在files區域中寫的一些文件報
# 不存在的錯誤,可以查看%_topdir/BUILDROOT目錄來檢查有哪些文件。
BuildRoot:  %_topdir/BUILDROOT
# 指定安裝的路徑
Prefix:     /usr/local/nginx-1.5.2
 
# 製作過程需要的工具或軟件包
BuildRequires:  gcc,make
# 安裝時依賴的軟件包
Requires: pcre,pcre-devel,openssl
 
# 軟件的描述,這個可以盡情地寫
%description
Nginx is a http server
 
# %prep指定了在編譯軟件包之前的準備工作,這裏的
# setup宏的作用是靜默模式解壓並切換到源碼目錄中,
# 當然你也可以使用tar命令來解壓
%prep
%setup -q
 
# 編譯階段,和直接編譯源代碼類似,具體的操作或指定的一些參數由configure文件決定。
%build
CFLAGS="-pipe -O2 -g -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror" ./configure --prefix=%{prefix}
# make後面的意思是:如果是多處理器,則並行編譯
make %{?_smp_mflags}
 
# 安裝階段
%install
# 先刪除原來的測試安裝的,只有在製作失敗了%{buildroot}目錄纔會有內容,
# 如果成功的話,目錄下會被清除。
# %{buildroot}指向的目錄不是BuildRoot(%_topdir/BUILDROOT)指定的目錄,
# 而是該目錄下名稱與生成的rpm包名稱相同的子目錄。例如我的是
# /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64
rm -rf %{buildroot}
# 指定安裝目錄,注意不是真實的安裝目錄,是在製作rpm包的時候指定的
# 安裝目錄,如果不指定的話,默認就會安裝到configure命令中指定的prefix路徑,
# 所以這裏一定要指定DESTDIR
make install DESTDIR=%{buildroot}
 
# 安裝前執行的腳本,語法和shell腳本的語法相同
%pre
 
# 安裝後執行的腳本
%post
 
# 卸載前執行的腳本,我這裏的做的事情是在卸載前將nginx服務器停掉
%preun
    MSG=`ps aux | grep nginx | grep -v "grep"`
    if [ -z "$MSG" ];then
        killall nginx 1>/dev/null 2>/dev/null
    fi
 
# 卸載完成後執行的腳本
%postun
    rm -rf %{prefix}
 
# 清理階段,在製作完成後刪除安裝的內容
%clean
rm -rf %{buildroot}
 
#指定要包含的文件
%files
#設置默認權限,如果沒有指定,則繼承默認的權限
%defattr  (-,root,root,0755)
%{prefix}
如果在製作的過程中報類似下面的錯誤,檢查你的files區域,看要包含的文件是否存在。

+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/brp-python-bytecompile
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: nginx-1.5.2-1.el6.x86_64
error: File not found: /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64/usr/local/nginx
 
 
RPM build errors:
    File not found: /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64/usr/local/nginx

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