使用rpmbuild創建rpm包的方法

聲明:該方法只適用CentOS5環境,因爲CentOS6關於構建rpm包的宏定義與CentOS5不相同,具體請查看/usr/lib/rpm/macros文件
準備工作
一、首先查看自己的系統是否有rpmbuild命令
whereis rpmbuild
如果沒有則安裝
yum install rpm-build
二、查看系統是否有/usr/src/redhat目錄 如果沒有則手動創建,然後在/usr/src/redhat/目錄下創建BUILD RPMS SOURCES SPECS SRPMS 子目錄
三、生成rpm除了源碼外,最重要的就是懂得編寫.spec腳本. 一個列子使用nginx源碼包構建rpm包: 在/usr/src/redhat/SPECS 目錄下編輯spec文件,把nginx-1.2.5.tar.gz 拷貝到/usr/src/redhat/SOURCES下
cat /usr/src/redhat/SPECS/nginx.spec
Summary    : This is a nginx RPM package.
Name         : nginx
Version    : 1.2.5
Release    : 1
License    : GPL
Group        : System
Source     : nginx-1.2.5.tar.gz
BuildArch: x86_64
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
Url            : http://nginx.org/
Packager : wangqiao
Requires : pcre pcre-devel

%description
This package is just a nginx RPM.

%prep
#tar xzvf $RPM_SOURCE_DIR/nginx-1.2.5.tar.gz

%setup -c
#%setup -c -n %{name}-%{version}

%build
cd %{name}-%{version}
./configure --prefix=/usr/local/nginx
make

%install
cd %{name}-%{version}
make DESTDIR=$RPM_BUILD_ROOT install

%clean
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
rm -rf $RPM_BUILD_DIR/%{name}-%{version}

%pre
# create user
u_created=`awk -F : '{print $1}' /etc/passwd|grep www|wc -l`
if [ $u_created -eq 0 ]
then
        useradd www
fi
# create group
g_created=`awk -F : '{print $1}' /etc/group|grep www|wc -l`
if [ $g_created -eq 0 ]
then
        groupadd -g www www
fi

%post
echo "nothing" > /dev/null 2>&1

%preun
if [ -z "`ps aux | grep nginx | grep -v grep`" ];then
pkill nginx > /dev/null
exit 0
fi

%postun
echo "nothing" > /dev/null 2>&1

%files
%defattr(-,root,root)
/usr/local/nginx
rpmbuild -bb /usr/src/redhat/SPECS/nginx.spec
在rpm包的製作過程中如果提示需要安裝依賴,則也需要安裝
四、現在對上述腳本進行解讀
spec關鍵字
Summary:        rpm的內容概要
Name:           rpm的名稱,後面可使用%{name}的方式引用
Version:        rpm的實際版本號,例如:1.2.5等,後面可使用%{version}引用
Release:        發佈序列號,例如:1等,標明第幾次打包,後面可使用%{release}引用
License:        軟件授權方式,通常就是GPL
Group:          軟件分組
Source:         源代碼包,可以帶多個用Source1、Source2等源,後面也可以用%{source1}、%{source2}引用
Build Arch:     指編譯的目標處理器架構,noarch標識不指定,但通常都是以/usr/lib/rpm/marcros中的內容爲默認值
BuildRoot:      這個是安裝或編譯時使用的“虛擬目錄”,考慮到多用戶的環境,一般定義爲:
                %{_tmppath}/%{name}-%{version}-%{release}-root
                或%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
                該參數非常重要,因爲在生成rpm的過程中,執行make install時就會把軟件安裝到上述的路徑中,在打包的時候,同樣依賴“虛擬目錄”爲“根目錄”進行操作。
                後面可使用$RPM_BUILD_ROOT 方式引用。
URL:            軟件的主頁
Packager:       打包者的信息
Requires:       該rpm包所依賴的軟件包名稱,可以用>=或<=表示大於或小於某一特定版本,例如:
                libpng-devel >= 1.0.20 
                “>=”號兩邊需用空格隔開,而不同軟件名稱也用空格分開
%description    軟件的詳細說明
spec 主體
%prep           預處理腳本
%setup          通常是從/usr/src/redhat/SOURCES裏的包解壓到/usr/src/redhat/BUILD/%{name}-%{version}中。
                一般用%setup -c就可以了,但有兩種情況:一就是同時編譯多個源碼包,二就是源碼的tar包的名稱與解壓出來的目錄不一致,此時,就需要使用-n參數指定一下了。      
%build          開始構建包,在/usr/src/redhat/BUILD目錄中
%install        開始把軟件安裝到虛擬的根目錄中,這個很重要,因爲如果這裏的路徑不對的話,則下面%files中尋找文件的時候就會失敗。
                可以使用:make DESTDIR=$RPM_BUILD_ROOT install
                或者使用常規的系統命令 cp -rf filename $RPM_BUILD_ROOT/
%clean          清理臨時文件,注意區分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
                $RPM_BUILD_ROOT是指開頭定義的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/redhat/BUILD,其中,前面的纔是%files需要的。
%pre            rpm安裝前執行的腳本
%post           rpm安裝後執行的腳本
%preun          rpm卸載前執行的腳本
%postun         rpm卸載後執行的腳本
                %preun %postun 的區別是前者在升級rpm包的時候會執行,後者在升級rpm包的時候不會執行
%files          定義那些文件或目錄會放入rpm中,下面的路徑不是系統的絕對路徑而是$RPM_BUILD_ROOT下的路徑
%defattr        指定安裝rpm包後的文件屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執行文件是0755
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章