转载地址【请查看作者原文】
http://hlee.iteye.com/blog/343499
http://laoguang.blog.51cto.com/6013350/1103628
关键字
spec脚本包括很多关键字,主要有:
引用
Name:
软件包的名称,后面可使用%{name}的方式引用
Summary:
软件包的内容概要
Version:
软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用
Release:
发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用
Group:
软件分组,建议使用标准分组
License:
软件授权方式,通常就是GPL
Source:
源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BuildRoot:
这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:
%{_tmppath}/%{name}-%{version}-%{release}-root
或
%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。
后面可使用$RPM_BUILD_ROOT
方式引用。
URL:
软件的主页
Vendor:
发行商或打包组织的信息,例如RedFlag Co,Ltd
Disstribution:
发行版标识
Patch:
补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
Prefix:
%{_prefix}
这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
Prefix:
%{_sysconfdir}
这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
Build Arch:
指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值
Requires:
该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:
libpng-devel >= 1.0.20 zlib
※“>=”号两边需用空格隔开,而不同软件名称也用空格分开
还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定
Provides:
指明本软件一些特定的功能,以便其他rpm识别
Packager:
打包者的信息
%description
软件的详细说明
spec脚本主体
spec脚本的主体中也包括了很多关键字和描述,下面会一一列举。我会把一些特别需要留意的地方标注出来。
%prep
预处理脚本
%setup -n %{name}-%{version}
把源码包解压并放好
通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中。
一般用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。
%patch
打补丁
通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。一般参数为:
%patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录
%Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件
◎补充一下
引用
%setup 不加任何选项,仅将软件包打开。
%setup -n newdir 将软件包解压在newdir目录。
%setup -c 解压缩之前先产生目录。
%setup -b num 将第num个source文件解压缩。
%setup -T 不使用default的解压缩操作。
%setup -T -b 0 将第0个源代码文件解压缩。
%setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。
%patch 最简单的补丁方式,自动指定patch level。
%patch 0 使用第0个补丁文件,相当于%patch ?p 0。
%patch -s 不显示打补丁时的信息。
%patch -T 将所有打补丁时产生的输出文件删除。
%configure
这个不是关键字,而是rpm定义的标准宏命令。意思是执行源代码的configure配置
在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行
,使用标准写法,会引用/usr/lib/rpm/marcros中定义的参数。
另一种不标准的写法是,可参考源码中的参数自定义,例如:
引用
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}
%build
开始构建包
在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make的工作
,常见写法:
引用
make %{?_smp_mflags} OPTIMIZE="%{optflags}"
都是一些优化参数,定义在/usr/lib/rpm/marcros中
%install
开始把软件安装到虚拟的根目录中
在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。
常见内容有:
%makeinstall
这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:
引用
make DESTDIR=$RPM_BUILD_ROOT install
或 引用
make prefix=$RPM_BUILD_ROOT install
需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:
引用
install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/
%clean
清理临时文件
通常内容为:
引用
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
rm -rf $RPM_BUILD_DIR/%{name}-%{version}
※注意区分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指开头定义的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/asianux/BUILD,其中,前面的才是%file需要的。
%pre
rpm安装前执行的脚本
%post
rpm安装后执行的脚本
%preun
rpm卸载前执行的脚本
%postun
rpm卸载后执行的脚本
%preun %postun 的区别是什么呢?
前者在升级的时候会执行,后者在升级rpm包的时候不会执行
%files 定义那些文件或目录会放入rpm中
这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。
如果描述为目录,表示目录中除%exclude外的所有文件。
%defattr (-,root,root)
指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755
%exclude
列出不想打包到rpm中的文件
※小心,如果%exclude指定的文件不存在,也会出错的。
%changelog
变更日志
※特别需要注意的是:%install部分使用的是绝对路径,而%file部分使用则是相对路径,虽然其描述的是同一个地方。千万不要写错。
就是%file中必须明白,用的是相对目录 引用
%files
%defattr(-,root,root)
%{_bindir}
%{_libdir}
%{_datadir}
%exclude %{_libdir}/debug
如何编写%file段
由于必须在%file中包括所有套件中的文件,所以,我们需要清楚编译完的套件到底包括那些文件?
常见的做法是,人工模拟一次编译的过程:
这样,整个套件的内容就会被放到/usr/local/xxx中,可根据情况编写%file和%exclude段。
※当然,这个只能对源码按GNU方式编写,并使用GNU autotool创建的包有效,若自定义Makefile则不能一概而论。
关于rpm中的执行脚本
如果正在制作的rpm包是准备作为放到系统安装光盘中的话,则需要考虑rpm中定义的脚本是否有问题。由于系统在安装的时候只是依赖于一个小环境进行,而该环境与实际安装完的环境有很大的区别,所以,大部分的脚本在该安装环境中都是无法生效,甚至会带来麻烦的。
所以,对于这样的,需要放到安装光盘中的套件,不加入执行脚本是较佳的方法。
另外,为提供操作中可参考的信息,rpm还提供了一种信号机制:不同的操作会返回不同的信息,并放到默认变量$1中。
引用
0代表卸载、1代表安装、2代表升级
一.RPM制作步骤
我们在企业中有的软件基本都是编译的,我们每次安装都得编译,那怎么办呢?那就根据我们的需求制作RPM安装包吧。先来说说基本布骤:
1.Planning what you want 计划做什么rpm包。软件的?库的?
2.Gathering the software to package 收集原材料,即收集源码包
3.Patch the software as need 如果需要打补丁,收集补丁文件。此布骤不是必须
4.Outling any dependenies确定依赖关系包
------------------ 上述动作可由我们手动编译一次软件来确定 -------------------
5.Building RPMs 开始动手制作RPM包
5.1 Set up the directory stucture 设定好目录结构,我们在这些目录中制作我们的RPM包,我们需要下列目录
BUILD源代码解压后的存放目录
RPMS 制作完成后的RPM包存放目录,里面有与平台相关的子目录
SOURCES 收集的源材料,补丁的存放位置
SPECS SPEC文件存放目录
SRMPS 存放SRMPS生成的目录
5.2 Place the Sources in the right directory 把源材料放到正确的位置
5.3 Create a spec file that tell rpmbuild command what to do 创建spec文件,这是纲领文件,rpmbuild命令根据spec文件来制作合适的rpm包
5.4 Build the source and binary RPMS 制作src或二进制rpm包
6.Test RPMS 测试制作的PRM包
7.Add signature for RPM 为RPM包签名
二.RPM包制作实例
我还是用连贯的 话为大家叙述一遍吧,我们首先确实我们要为什么做rpm包,通常我们是为一些软件,比如httpd,nginx等,然后去收集这些软件包的源代码,如果有 需要的话也收集这些补丁文件,手动编译安装一下这个软件(当然如果是不需要编译的就不用演练了),确定依赖的软件包,并记录下来,下面开始准备制作 tengine的PRM包吧:
1.建立一个普通用户,有普通用户来制作rpm,用root的可能会因为代码问题导致毁灭的后果
useradd ibuler
su - ibuler
2.确定我们在 哪个目录下制作RPM,通常这个目录我们topdir,这个需要在宏配置文件中指定,这个配置文件称为macrofiles,它们通常为 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,这个在rhel 5.8中可以通过rpmbuild --showrc | grep macrofiles 查看,6.3的我使用这个找不到,但使用是一样的。你可以通过rpmbuild --showrc | grep topdir 查看你系统默认的工作车间
rpmbuild --showrc | grep topdir
-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
我们还是自定义工作目录(或车间)吧
vi ~/.rpmmacros
%_topdir /home/ibuler/rpmbuild ##目录可以自定义
mkdir ~/rpmbuild
3.在topdir下建立需要的目录
cd ~/rpmbuild
mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
4.把收集的源码放到SOURCES下
cp /tmp/tengine-1.4.2.tar.gz SOURCES ##事先放好的
5.在SPECS下建立重要的spec文件
cd SPECS
vi tengine.spec ##内容见后讲解,rhel6.3会自动生成模板
6.用rpmbuild命令制作rpm包,rpmbuild命令会根据spec文件来生成rpm包
rpmbuild
-ba 既生成src.rpm又生成二进制rpm
-bs 只生成src的rpm
-bb 只生二进制的rpm
-bp 执行到pre
-bc 执行到 build段
-bi 执行install段
-bl 检测有文件没包含
我们可以一步步试,先rpmbuild -bp ,再-bc 再-bi 如果没问题,rpmbuild -ba 生成src包与二进制包吧
7.安装测试有没有问题,能否正常安装运行,能否正常升级,卸载有没有问题
root用户测试安装:
cd /tmp
cp /home/ibuler/rpmbuild/RPMS/x86_64/tengine-1.4.2-1.el6.x86_64.rpm /tmp
rpm -ivh tengine-1.4.2-1.el6.x86_64.rpm ##测试安装
rpm -e tengine ##测试卸载,如果版本号比原来的高,升级测试
8.如果没问题为rpm包签名吧,防止有人恶意更改 ##这个先不写了,有点晚了,以后补上
到此整个流程完毕。下面来说说其中最最重要的spec的格式,先说最简单的,最容易实现的
到此一个简单的tengine RPM包制作好了。
三.RPM包制作拓展
下面我们来拓展一下,比如:我们想为tengine增加控制脚本,可以通过 start|stop控制,我们还想更换一下默认的首页index.html,默认的fastcgi_params是不能直接连接php的,所以我们替换 为新的配置文件,我们也可以用设置好的nginx.conf替换原来的nginx.conf。基于上述步骤下面继续
1.把修改后的首页文件index.html,控制脚本init.nginx,fastCGI配置文件fastcgi_params,Nginx配置文件nginx.conf 放到SOURCES中 。
[ibuler@ng1 rpmbuild]$ ls SOURCES/
fastcgi_params index.html init.nginx nginx.conf tengine-1.4.2.tar.gz
2 编辑tengine.spec,修改
2.1 介绍区域的SOURCE0下增加如下
Source0: %{name}-%{version}.tar.gz
Source1: index.html
Source2: init.nginx
Source3: fastcgi_params
Source4: nginx.conf
2.2 安装区域增加如下
make install DESTDIR=%{buildroot}
%{__install} -p -D %{SOURCE1} %{buildroot}/usr/html/index.html #%{__install}这个宏代表install命令
%{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx
%{__install} -p -D %{SOURCE3} %{buildroot}/etc/nginx/fastcgi_params
%{__install} -p -D %{SOURCE4} %{buildroot}/etc/nginx/nginx.conf
2.3 脚本区域增加如下
%post
if [ $1 == 1 ];then
/sbin/chkconfig --add nginx
fi
2.4 %file区域增加如下
%files
%defattr (-,root,root,0755)
/etc/
/usr/
/var/
%config(noreplace) /etc/nginx/nginx.conf #%config表明这是个配置文件noplace表明不能替换
%config(noreplace) /etc/nginx/fastcgi_params
%doc /usr/html/index.html #%doc表明这个是文档
%attr(0755,root,root) /etc/rc.d/init.d/nginx #%attr后面的是权限,属主,属组
3. 生成rpm文件测试
rpmbuild -ba tengine.spec
4. 安装测试
到此RPM包制作完毕,你可以根据你的需求制作RPM包吧。
四.RPM包签名
1.生成GPG签名密钥,我用的是root用户
gpg --gen-key
Your selection?1 ##默认即可
What keysize do you want? (2048) 1024 ##密钥长度
Key is valid for? (0) 1y ##有效期
Is this correct? (y/N) y ##确认
Real name: LaoGuang ##密钥名称
Email address: ibuler@qq.com ##邮件
Comment: GPG-RPM-KEY ##备注
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
Enter passphrase OK ##使用空密码,也可以输入
有时可能因为随机数不够导致卡在那里,这时候你就yum 安装几个包组,马上就够了。
2.查看成生的密钥
[root@ng1 dev]# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub 1024R/49C99488 2012-11-28 [expires: 2013-11-28]
uid LaoGuang (GPG-RPM-KEY)
sub 1024R/69BA199D 2012-11-28 [expires: 2013-11-28]
3.导出公钥以供大家使用验证
gpg --export -a "LaoGuang" > RPM-GPG-KEY-LaoGuang
4.编缉 .rpmmacros说明我们用哪一个密钥加密,我们用root加密的那就在/root下编辑
vi ~/.rpmmacros
%_gpg_name LaoGuang
5.为rpm包加签名
rpm --addsign tengine-1.4.2-1.el6.x86_64.rpm
Enter pass phrase: ##输入密钥
Pass phrase is good.
tengine-1.4.2-1.el6.x86_64.rpm:
到此签名添加成功,下面来验证
6.讲刚才导出的公钥导入rpm中
rpm --import RPM-GPG-KEY-LaoGuang
7.验证
rpm --checksig tengine-1.4.2-1.el6.x86_64.rpm
tengine-1.4.2-1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
到此整个过程完毕,你也试试吧
Group:
软件包所属类别,具体类别有:
Amusements/Games (娱乐/游戏)
Amusements/Graphics(娱乐/图形)
Applications/Archiving (应用/文档)
Applications/Communications(应用/通讯)
Applications/Databases (应用/数据库)
Applications/Editors (应用/编辑器)
Applications/Emulators (应用/仿真器)
Applications/Engineering (应用/工程)
Applications/File (应用/文件)
Applications/Internet (应用/因特网)
Applications/Multimedia(应用/多媒体)
Applications/Productivity (应用/产品)
Applications/Publishing(应用/印刷)
Applications/System(应用/系统)
Applications/Text (应用/文本)
Development/Debuggers (开发/调试器)
Development/Languages (开发/语言)
Development/Libraries (开发/函数库)
Development/System (开发/系统)
Development/Tools (开发/工具)
Documentation (文档)
System Environment/Base(系统环境/基础)
System Environment/Daemons (系统环境/守护)
System Environment/Kernel (系统环境/内核)
System Environment/Libraries (系统环境/函数库)
System Environment/Shells (系统环境/接口)
User Interface/Desktops(用户界面/桌面)
User Interface/X (用户界面/X窗口)
User Interface/X Hardware Support (用户界面/X硬件支持)
测试通过实例:
cat rpmbuild/SPECS/tengine.spec
# This is a sample spec file for test rpm package
%define _prefix /usr/local/nginx
%define _user nobody
%define _user_uid 99
%define _group nobody
%define _group_uid 99
%define _sbin_path /usr/sbin
%define name Tengine
%define summary Tengine for Webserver
%define version 2.1.2
%define release 1
%define license GPL
%define group Application/WebServer
%define source tengine-%{version}.tar.gz
%define url http://tengine.taobao.org/
%define vendor Taobao
%define packager webuser
Name: tengine
Version: 2.1.2
Vendor: Taobao
Release:1
Summary:GUN Tengine2.1.2
Group:Application/WebServer
License:GPL
URL: http://tengine.taobao.org/
Source0:tengine-%{version}.tar.gz
Source1: index.html
Source2: nginx
Source3: fastcgi_params
Source4: nginx.conf
Packager: webuser
#BuildRoot:/www/rpmbuild/%{name}-%{version}-%{release}-rpmbuild
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
#BuildRequires:gcc>=4.4.7, gcc-c++>=4.4.7, zlib-devel>=1.2.3, pcre-devel>=8.12, openssl-devel>=1.0.1e, autoconf>=2.63, automake>=1.11.1
#BuildRequires: mhash-devel
#BuildRequires: libxml2-devel
#BuildRequires: libxslt-devel
#BuildRequires: libgd-devel
#
#Requires:gcc>=4.4.7, gcc-c++>=4.4.7, zlib-devel>=1.2.3, pcre-devel>=8.12, openssl-devel>=1.0.1e, autoconf>=2.63, automake>=1.11.1
#Requires: mhash-devel
#Requires: libxml2-devel
#Requires: libxslt-devel
#Requires: libgd-devel
%description
The GNU Tengine WEB Server program.
%prep
%setup -q -n tengine-%{version}
%build
./configure \
--user=nobody \
--group=nobody \
--prefix=/usr/local/nginx \
--with-ipv6 \
--with-debug \
--with-http_sub_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_spdy_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_perl_module \
--with-pcre \
--add-module=../ngx_cache_purge-2.3
make
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%{__install} -p -D %{SOURCE1} %{buildroot}/usr/local/nginx/html/index.html
%{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx
%{__install} -p -D %{SOURCE3} %{buildroot}/usr/local/nginx/conf/fastcgi_params
%{__install} -p -D %{SOURCE4} %{buildroot}/usr/local/nginx/conf/nginx.conf
mkdir -p %{buildroot}/%{_initrddir}
(
cat <
#!/bin/bash
# tengine Startup script for the tengine HTTP Server
# this script create it by Luo Hui at 2008.11.11.
# if you find any errors on this scripts,please contact Luo Hui.
# and send mail to farmer.luo at gmail dot com.
#
# chkconfig: - 85 15
# description: tengine is a high-performance web and proxy server.
# processname: tengine
# tengine pidfile: /var/run/tengine.pid
# tengine config: /usr/local/tengine/conf/nginx.conf
nginxd=%{_prefix}/sbin/nginx
nginx_config=%{_prefix}/conf/nginx.conf
nginx_pid=/var/run/tengine.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
ulimit -HSn 65535
# Start tengine daemons functions.
nginx_start() {
if [ -e $nginx_pid ];then
echo "tengine already running...."
exit 1
fi
if [ ! -d %{_prefix}/logs ];then
mkdir -p %{_prefix}/logs
fi
if [ ! -d %{_prefix}/tmp ]; then
mkdir -p %{_prefix}/tmp
fi
if [ -e $nginx_pid ];then
echo "tengine already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $nginxd -c ${nginx_config}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/tengine
return $RETVAL
}
# Stop tengine daemons functions.
nginx_stop() {
echo -n $"Stopping $prog: "
killproc $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/tengine $nginx_pid
}
# reload tengine service functions.
nginx_reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${nginx_pid}`
killproc $nginxd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
nginx_start
;;
stop)
nginx_stop
;;
reload)
nginx_reload
;;
restart)
nginx_stop
nginx_start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: tengine {start|stop|restart|reload|status|help}"
exit 1
esac
exit $RETVAL
EOF
) >%{buildroot}/%{_initrddir}/tengine
chmod 755 %{buildroot}/%{_initrddir}/tengine
%clean
rm -rf %{buildroot}
%pre
grep -q ^%{_group}: /etc/group || %{_sbin_path}/groupadd -g %{_group_gid} %{_group}
grep -q ^%{_user}: /etc/passwd || %{_sbin_path}/useradd -g %{_group} -u %{_user_uid} -d %{_prefix} -s /sbin/nologin -M %{_user}
%post
chkconfig --add tengine
chkconfig --level 345 tengine on
%preun
chkconfig --del tengine
#%postun
#if [ $1 = 0 ]; then
# userdel %{_user} > /dev/null 2>&1 || true
#fi
%files
%defattr(-,root,root,-)
%dir %{_prefix}/
%attr(0755,%{_user},%{_group}) %dir %{_prefix}/logs
%dir %{_prefix}/modules
%dir %{_prefix}/sbin
%dir %{_prefix}/conf
%dir %{_prefix}/html
%{_prefix}/sbin/nginx
%{_prefix}/sbin/dso_tool
%{_prefix}/conf/module_stubs
%{_prefix}/conf/fastcgi.conf
%{_prefix}/conf/fastcgi_params.default
%{_prefix}/conf/win-utf
%{_prefix}/conf/koi-utf
%{_prefix}/conf/nginx.conf.default
%{_prefix}/conf/fastcgi.conf.default
%config(noreplace) %{_prefix}/conf/fastcgi_params
%{_prefix}/conf/koi-win
%{_prefix}/conf/mime.types
%config(noreplace) %{_prefix}/conf/nginx.conf
%{_prefix}/conf/mime.types.default
%{_prefix}/conf/scgi_params
%{_prefix}/conf/scgi_params.default
%{_prefix}/conf/uwsgi_params
%{_prefix}/conf/uwsgi_params.default
%{_prefix}/html/50x.html
%{_prefix}/html/index.html
/usr/lib64/perl5/perllocal.pod
/usr/local/lib64/perl5/auto/nginx/.packlist
/usr/local/lib64/perl5/auto/nginx/nginx.bs
/usr/local/lib64/perl5/auto/nginx/nginx.so
/usr/local/lib64/perl5/nginx.pm
%{_prefix}/conf/browsers
%{_prefix}/include/nginx.h
%{_prefix}/include/ngx_alloc.h
%{_prefix}/include/ngx_array.h
%{_prefix}/include/ngx_atomic.h
%{_prefix}/include/ngx_auto_config.h
%{_prefix}/include/ngx_auto_headers.h
%{_prefix}/include/ngx_buf.h
%{_prefix}/include/ngx_channel.h
%{_prefix}/include/ngx_conf_file.h
%{_prefix}/include/ngx_config.h
%{_prefix}/include/ngx_connection.h
%{_prefix}/include/ngx_core.h
%{_prefix}/include/ngx_crc.h
%{_prefix}/include/ngx_crc32.h
%{_prefix}/include/ngx_crypt.h
%{_prefix}/include/ngx_cycle.h
%{_prefix}/include/ngx_errno.h
%{_prefix}/include/ngx_event.h
%{_prefix}/include/ngx_event_busy_lock.h
%{_prefix}/include/ngx_event_connect.h
%{_prefix}/include/ngx_event_openssl.h
%{_prefix}/include/ngx_event_pipe.h
%{_prefix}/include/ngx_event_posted.h
%{_prefix}/include/ngx_event_timer.h
%{_prefix}/include/ngx_file.h
%{_prefix}/include/ngx_files.h
%{_prefix}/include/ngx_gcc_atomic_x86.h
%{_prefix}/include/ngx_hash.h
%{_prefix}/include/ngx_http.h
%{_prefix}/include/ngx_http_busy_lock.h
%{_prefix}/include/ngx_http_cache.h
%{_prefix}/include/ngx_http_config.h
%{_prefix}/include/ngx_http_core_module.h
%{_prefix}/include/ngx_http_perl_module.h
%{_prefix}/include/ngx_http_reqstat.h
%{_prefix}/include/ngx_http_request.h
%{_prefix}/include/ngx_http_script.h
%{_prefix}/include/ngx_http_spdy.h
%{_prefix}/include/ngx_http_spdy_module.h
%{_prefix}/include/ngx_http_ssi_filter_module.h
%{_prefix}/include/ngx_http_ssl_module.h
%{_prefix}/include/ngx_http_upstream.h
%{_prefix}/include/ngx_http_upstream_round_robin.h
%{_prefix}/include/ngx_http_v2.h
%{_prefix}/include/ngx_http_v2_module.h
%{_prefix}/include/ngx_http_variables.h
%{_prefix}/include/ngx_inet.h
%{_prefix}/include/ngx_linux.h
%{_prefix}/include/ngx_linux_config.h
%{_prefix}/include/ngx_list.h
%{_prefix}/include/ngx_log.h
%{_prefix}/include/ngx_md5.h
%{_prefix}/include/ngx_murmurhash.h
%{_prefix}/include/ngx_open_file_cache.h
%{_prefix}/include/ngx_os.h
%{_prefix}/include/ngx_palloc.h
%{_prefix}/include/ngx_parse.h
%{_prefix}/include/ngx_pipe.h
%{_prefix}/include/ngx_proc.h
%{_prefix}/include/ngx_process.h
%{_prefix}/include/ngx_process_cycle.h
%{_prefix}/include/ngx_proxy_protocol.h
%{_prefix}/include/ngx_queue.h
%{_prefix}/include/ngx_radix_tree.h
%{_prefix}/include/ngx_rbtree.h
%{_prefix}/include/ngx_regex.h
%{_prefix}/include/ngx_resolver.h
%{_prefix}/include/ngx_segment_tree.h
%{_prefix}/include/ngx_setaffinity.h
%{_prefix}/include/ngx_setproctitle.h
%{_prefix}/include/ngx_sha1.h
%{_prefix}/include/ngx_shmem.h
%{_prefix}/include/ngx_shmtx.h
%{_prefix}/include/ngx_slab.h
%{_prefix}/include/ngx_socket.h
%{_prefix}/include/ngx_string.h
%{_prefix}/include/ngx_sysinfo.h
%{_prefix}/include/ngx_syslog.h
%{_prefix}/include/ngx_thread.h
%{_prefix}/include/ngx_time.h
%{_prefix}/include/ngx_times.h
%{_prefix}/include/ngx_trie.h
%{_prefix}/include/ngx_user.h
/usr/local/share/man/man3/nginx.3pm
%{_initrddir}/tengine
%doc /usr/local/nginx/html/index.html
%attr(0775,root,root) /etc/rc.d/init.d/nginx
%changelog
* Mon Jul 4 2016 Beijing
- ver 2.1.2