首先在制作rpm时通常都不使用root用户进行制作(因为root用户权限太大一旦出错可能对系统造成无法挽回的损失),都建议使用普通用户进行编包.useradd users 建立普通用户进行编包安装rpm-buildyum 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 ### 0.define section #自定义宏段,这个不是必须的 ### %define nginx_user nginx #这是我们自定义了一个宏,名字为nginx_user值为nginx,%{nginx_user}
- -14: _builddir %{_topdir}/BUILD
- -14: _buildrootdir %{_topdir}/BUILDROOT
- -14: _rpmdir %{_topdir}/RPMS
- -14: _sourcedir %{_topdir}/SOURCES
- -14: _specdir %{_topdir}/SPECS
- -14: _srcrpmdir %{_topdir}/SRPMS
- -14: _topdir %{getenv:HOME}/rpmbuild
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.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_ROOTBuildRequires: 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 展开之后可以看到编辑的各种文件