声明:该方法只适用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