系统环境redhat 5.7
软件:nginx-1.4.5 + nginx_upstream_check_module
1,安装打包工具及软件环境
# yum install gcc rpm-build pcre-devel pcre rpmdevtools
2,创建所需要的目录
BUILD #编译之前,如解压包后存放的路径
BUILDROOT #编译后存放的路径
RPMS #打包完成后rpm包存放的路径
SOURCES #源包所放置的路径
SPECS #spec文档放置的路径
SPRMS #源码rpm包放置的路径
其实以上参数值都是在/usr/lib/rpm/macros文件中定义的,这些目录默认路径都在/usr/src/redhat/目录中。笔者在第一次制作rpm包时直接修改的该文件的值,其实最好不要修改该文件的值,只需要在家目录定义自己需要的值即可。 可以在当前用户目录下的.rpmmacros文件(如果没有,则创建)中修改,格式为:
% _topdir pathname
创建命令自动创建需要的目录:
# rpmdev-setuptree
# tree rpmbuild/
rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
查看配置是否生效:
# rpmbuild --showrc | grep topdir
-14: _builddir %{_topdir}/BUILD
-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir /root/rpmbuild
3,下载相关源码包及解压
# wget http://nginx.org/download/nginx-1.4.7.tar.gz -O /root/rpmbuild/SOURCES/nginx-1.4.7.tar.gz
# wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.zip -O /root/rpmbuild/SOURCES/nginx_upstream_check_module.zip
# cd /root/rpmbuild/SOURCES/
# unzip nginx_upstream_check_module.zip
4,创建spec文件
spec文件是制作rpm包的关键,定义了rpmbuild命令生成时需要遵循的一些规则。
# vim /root/rpmbuild/SPECS/nginx.spec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# 这个区域定义的Name、Version这些字段对应的值可以在后面 # 通过%{name},%{version}这样的方式来引用,类似于C语言中的宏 # Name制定了软件的名称 Name: nginx # 软件版本 Version: 1.4 . 7
# 释出号,也就是第几次制作rpm,dist这个宏变量一般在/etc/rpm/macros.dist文件中定义 Release: 1 %{?dist}
# 软件的介绍,必须设置,最好不要超过 50 个字符
Summary: Nginx from lishengjia # 软件的分组,可以通过/usr/share/doc/rpm- 4.8 . 0 /GROUPS文件中选择,也可以
# 在相应的分类下,自己创建一个新的类型,例如这里的Server Group: Application/Server # 许可证类型 License: GPL # 软件的源站 URL: http: //nginx.org
# 制作rpm包的人员信息 Packager: lishengjia < 825137600 @qq.com>
# 源码包的名称,在%_topdir/SOURCE下,如果有多个源码包的话,可以通过 # Source1、Source2这样的字段来指定其他的源码包 Source0: %{name}-%{version}.tar.gz Source1: nginx_upstream_check_module.zip # BuildRoot指定了make install的测试安装目录,通过这个目录我们可以观察 # 生成了哪些文件,方便些files区域。如果在files区域中写的一些文件报 # 不存在的错误,可以查看%_topdir/BUILDROOT目录来检查有哪些文件。 buildroot: %_topdir/BUILDROOT Prefix: /opt/apps_install/nginx- 1.4 . 7
# 制作过程需要的工具或软件包 BuildRequires: gcc,make # 安装时依赖的软件包 Requires: pcre,pcre-devel,openssl # 软件的描述,这个可以尽情地写 %description Nginx is a http server
%prep cd %_topdir/SOURCES/ tar xf nginx- 1.4 . 7 .tar.gz
cd nginx- 1.4 . 7
patch -p1 < %_topdir/SOURCES/nginx_upstream_check_module-master/check_1. 2.6 +.patch
# 编译阶段,和直接编译源代码类似,具体的操作或指定的一些参数由configure文件决定。 %build cd $RPM_SOURCE_DIR/nginx- 1.4 . 7
pwd ./configure --prefix=%{prefix} -- with -mail -- with -mail_ssl_module \
-- with -http_realip_module -- with -http_stub_status_module -- with -http_ssl_module \
-- with -pcre --add-module=../nginx_upstream_check_module-master
# make后面的意思是:如果是多处理器,则并行编译 make %{?_smp_mflags} # 安装阶段 %install # 先删除原来的测试安装的,只有在制作失败了%{buildroot}目录才会有内容, # 如果成功的话,目录下会被清除。 # %{buildroot}指向的目录不是BuildRoot(%_topdir/BUILDROOT)指定的目录, # 而是该目录下名称与生成的rpm包名称相同的子目录。 # 指定安装目录,注意不是真实的安装目录,是在制作rpm包的时候指定的 # 安装目录,如果不指定的话,默认就会安装到configure命令中指定的prefix路径, # 所以这里一定要指定DESTDIR rm -rf %{buildroot} cd $RPM_SOURCE_DIR/nginx- 1.4 . 7
make DESTDIR= "%{buildroot}" install
# 安装前执行的脚本,语法和shell脚本的语法相同 %pre # 安装后执行的脚本 %post # 卸载前执行的脚本,我这里的做的事情是在卸载前将nginx服务器停掉 %preun MSG=`ps aux | grep nginx | grep -v "grep" `
if [ -z "$MSG" ];then
killall nginx 1 >/dev/ null 2 >/dev/ null
fi
# 卸载完成后执行的脚本 %postun # 清理阶段,在制作完成后删除安装的内容 %clean rm -rf %{buildroot} #指定要包含的文件 %files #设置默认权限,如果没有指定,则继承默认的权限 %defattr (-,root,root, 0755 )
%{prefix} |
5,制作rpm
# rpmbuild -bb nginx.spec
如果命令执行没有报错,则会在如下目录产生rpm包
# ls RPMS/x86_64/nginx-1.4.7-1.x86_64.rpm
RPMS/x86_64/nginx-1.4.7-1.x86_64.rpm