首先在制作rpm时通常都不使用root用户进行制作(因为root用户权限太大一旦出错可能对系统造成无法挽回的损失),都建议使用普通用户进行编包.

useradd users       建立普通用户进行编包

安装rpm-build
yum install -y rpm-build

确定进行编包的目录
通常这个目录我们 topdir,这个需要在宏配置文件中指定,这个配置文件称为macrofiles,它们通常为 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,这个在rhel 6中可以通过rpmbuild --showrc | grep macrofiles  可以通过rpmbuild --showrc | grep topdir 查看你系统默认的工作车间

   rpmbuild --showrc | grep topdir 
 
   
   
   
   
  1. -14: _builddir  %{_topdir}/BUILD 
  2. -14: _buildrootdir  %{_topdir}/BUILDROOT 
  3. -14: _rpmdir    %{_topdir}/RPMS 
  4. -14: _sourcedir %{_topdir}/SOURCES 
  5. -14: _specdir   %{_topdir}/SPECS 
  6. -14: _srcrpmdir %{_topdir}/SRPMS 
  7. -14: _topdir    %{getenv:HOME}/rpmbuild

因为通常不会使用root用户的默认工作车间进行编包,所以在users用户下我们要自己定义工作车间目录,并且自己
定义一个宏指定自己的工作车间目录 su users.
cd     回到users用户家目录

mkdir rpmbuild    
创建工作车间目录

cd rpmbuild
mkdir -pv {BUILD,BUILDROOT,SOURCES,SPECS,RPMS,SRPMS}   创建车间所需目录


BUILD 源代码解压后的存放目录
RPMS    制作完成后的RPM包存放目录,里面有与平台相关的子目录
SOURCES 收集的源材料,补丁的存放位置
SPECS   SPEC文件存放目录
SRMPS   存放SRMPS生成的目录

vi .rpmmacros     定义宏指定工作车间目录   

%_topdir     /home/users/rpmbuild

再次
查看工作车间,现在变成我们自己定义的工作车间
rpmbuild --showrc |grep topdir
-14: _builddir    %{_topdir}/BUILD
-14: _buildrootdir    %{_topdir}/BUILDROOT
-14: _desktopdir    %{_datadir}/applications
-14: _rpmdir    %{_topdir}/RPMS
-14: _sourcedir    %{_topdir}/SOURCES
-14: _specdir    %{_topdir}/SPECS
-14: _srcrpmdir    %{_topdir}/SRPMS
-14: _topdir    /home/users/rpmbuild


下载源码包放到SOURCES目录下
cp nginx-1.3.10.tar.gz /home/users/rpmbuild/SOURCES/

cd /home/users/rpmbuild/SPEC/ 进入SPEC创建编包的spec文件
vi nginx.spec
  1. ### 0.define section               #自定义宏段,这个不是必须的 
  2. ### %define nginx_user nginx       #这是我们自定义了一个宏,名字为nginx_user值为nginx,%{nginx_user}
1.The introduction section      #介绍区域段 
Name: nginx 包名 必须存在
Version: 1.3.10 版本号
一定要与tar包的一致 必须存在
Release: 1%{?dist} 必须存在
Summary: Robust, small and high performance HTTP and reverse proxy server 软件包简介 必须存在
Group: System Environment/Daemons 软件包所属组 必须存在

License: BSD
URL: http://nginx.net/
BuildRoot: %_topdir/$RPM_BUILD_ROOT

BuildRequires: pcre-devel,zlib-devel,openssl-devel,perl-devel,perl(ExtUtils::Embed) 指定安装此包时前必须安装那些包
Requires: pcre,openssl 指定安装此包时依赖那些包
Source0: %{name}-%{version}.tar.gz 指定要进行编译的源码包 %{name}-%{version}.tar.gz等于nginx-1.3.10.tar.gz

%description 对软件包作用的描述


The Prep section 准备阶段,解压source并cd进去
%prep 宏开始
%setup -q 宏的作用静默模式解压并cd

%patch0 -p0 如果需要在这打补丁,依次写


The Build Section 编译制作阶段,进行编译 
%build
./configure \
--prefix=/usr/ \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre
make %{?_smp_mflags} make后面的意思是:如果就多处理器的话make时并行编译

Install section  安装阶段 
%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=%RPM_BUILD_ROOT


%clean
rm -rf $RPM_BUILD_ROOT

%pre
if [ $1 == 1 ]; then
%{_sbindir}/useradd -c "Nginx user" -s /bin/false -r -d %{nginx_home} %{nginx_user} 2>/dev/null || :
fi

%post
if [ $1 == 1 ]; then
/sbin/chkconfig --add %{name}
fi

%preun
if [ $1 = 0 ]; then
/sbin/service %{name} stop >/dev/null 2>&1
/sbin/chkconfig --del %{name}
fi

%postun
if [ $1 == 2 ]; then
/sbin/service %{name} upgrade || :
fi

%files
%defattr(-,root,root,-)
%doc LICENSE CHANGES README

%changelog
*2012-01-07 更改记录


编辑好spec文件之后进行最后的测试打包
rpmbuild
-bp 执行到pre
-bc 执行到 build段
-bi 执行install段
-bl 检测有文件没包含
-bs 只生成src的rpm
-bb 只生二进制的rpm
-ba 既生成src.rpm又生成二进制rpm

我们通常只需要生成 二进制的rpm包就可以了
生成src的rpm包公相当于将工作车间中的相关文件进行打包

nginx-1.3.10-1.el6.src.rpm

将src包展开
rpm2cpio
nginx-1.3.10-1.el6.src.rpm | cpio -id 展开之后可以看到编辑的各种文件