聲明:該方法只適用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