rpmbuild的原理,意义,具体参考官方文档
http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/index.html
一、rpmbuild大致步骤
英文 |
中文 |
1.Set up the directory structure |
建立目录结构 |
2.Place the sources in the right directory |
将源文件放入正确目录 |
3.Create a spec file that tells the rpmbuild command what to do |
建立一个spec的文件,编辑rpmbuild命令要做什么 |
4.Build the source andbinary RPMs |
建立源码及二进制包 |
二、rpmbuild各目录的作用
BUILD |
The rpmbuild command builds software in this directory |
RPMS |
The rpmbuild command stores binary RPMs it reates in this irectory |
SOURCES |
You should put the sources for the application in this directory |
SPECS |
You should place the spec file for each RPM you plan to make in this directory |
SRPMS |
The rpmbuild command places source RPMs in this directory |
三、rpmbuild安装配置步骤
3.1、安装rpm-build软件包
在制作rpm包之前,需要安装rpm-build这个软件包
[[email protected] ~]# yum -y install rpm-build 增加一个普通用户,不要以root身份来进行rpmbuild,危险操作,慎重,慎重! [[email protected]test01 ~]# useradd kuangl [[email protected]test01 ~]# su – kuangl |
3.2、创建rpmbuild所需要的目录
[[email protected]test01 software]$ mkdir -pv rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} mkdir: 已创建目录 “rpmbuild” mkdir: 已创建目录 “rpmbuild/BUILD” mkdir: 已创建目录 “rpmbuild/RPMS” mkdir: 已创建目录 “rpmbuild/SOURCES” mkdir: 已创建目录 “rpmbuild/SPECS” mkdir: 已创建目录 “rpmbuild/SRPMS” [[email protected]test01 software]$ echo "% _topdir/home/kuangl/rpmbuild" >~/.rpmmacros [[email protected]test01 software]$ 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/home/admin/rpmbuild |
3.3、rpmbuild系统内置变量
查看rpmbuild的内置变量
[[email protected]test01 software]$ rpmbuild --showrv |
3.4、默认的spec格式如下
[[email protected]test01 SPECS]$ pwd /home/kuangl/software/rpmbuild/SPECS [[email protected]test01 SPECS]$ vim test.spec |
随便建立个以spec结尾的文件名,会出现以下信息
Name: Version: Release:1%{?dist} Summary: Group: License: URL: Source0: BuildRoot:%(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: Requires: %description %prep %setup -q %build %configure make %{?_smp_mflags} %install rm -rf %{buildroot} make install DESTDIR=%{buildroot} %clean rm -rf %{buildroot} %files %defattr(-,root,root,-) %doc %changelog |
3.5、Spec文件中常用的变量
变量 |
系统目录 |
RPM_BUILD_DIR: |
/$HOME/rpmbuild/BUILD |
RPM_BUILD_ROOT: |
/$HOME/rpmbuild/BUILDROOT |
%{_sysconfdir}: |
/etc |
%{_sbindir}: |
/usr/sbin |
%{_bindir}: |
/usr/bin |
%{_datadir}: |
/usr/share |
%{_mandir}: |
/usr/share/man |
%{_libdir}: |
/usr/lib64 |
%{_prefix}: |
/usr |
%{_localstatedir}: |
/usr/var |
3.6、rpmbuild的步骤
%prep预处理脚本程序(prep)开始执行" %setup %build"编译连接脚本程序(build)开始执行" make %install"安装脚本程序(install)开始执行" make install %clean"建包结束后清理脚本程序(clean)开始执行" %pre"安装前执行脚本程序(pre)开始执行" %post"安装后执行脚本程序(post)开始执行" %preun"卸载前执行脚本程序(preun)开始执行" %postun"卸载后执行脚本程序(postun)开始执行" %veryfiscript "软件包校验脚本程序(verifyscript)开始执行" %triggerin -- xiuwu"软件包安装时触发脚本程序(triggerin)开始执行" %triggerun -- yuntaishan < 2.0 "软件包卸载前触发脚本程序(triggerun)开始执行" %triggerpostun – dapubu"软件包卸载后触发脚本程序(triggerpostun)开始执行" %files %defattr (-,root,root) %config /etc/funkey.def %doc %changelog更改日志 |
四、实例说明
4.1、Nginx 实例为例
# %define nginx_home %{_localstatedir}/cache/nginx %define nginx_user nginx %define nginx_group nginx # 软件包的内容概要 Summary: high performance web server #软件包的名称 Name: nginx #软件包的版本 Version: 1.2.6 #软件包的发布实际版本号 Release: 1%{?dist}.ngx #发行商或者打包组织的信息 Vendor: nginx inc. #软件的主页 URL: http://nginx.org/ #源代码包,可以带多个source0,source1等源,后面可以用%{source},%{source1}引用 Source0: http://nginx.org/download/%{name}-%{version}.tar.gz Source1: logrotate Source2: nginx.init Source3: nginx.sysconf Source4: nginx.conf Source5: nginx.vh.default.conf Source6: nginx.vh.example_ssl.conf Source7: nginx.suse.init #软件授权方式 License: 2-clause BSD-like license %if 0%{?suse_version} #软件分组 Group: Productivity/Networking/Web/Servers %else Group: System Environment/Daemons %endif #安装或者编译时使用的“虚拟目录” BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root #需要依赖的软件包 BuildRequires: zlib-devel BuildRequires: pcre-devel BuildRequires: perl %if 0%{?suse_version} BuildRequires: libopenssl-devel Requires(pre): pwdutils %else BuildRequires: openssl-devel Requires: initscripts >= 8.36 Requires(pre): shadow-utils Requires(post): chkconfig %endif #指明本软件一些特定的功能,以便与其他rpm识别 Provides: webserver #软件的详细说明 %description nginx [engine x] is a HTTP and reverse proxy server, as well as a mail proxy server %package debug Summary: debug version of nginx Group: System Environment/Daemons Requires: nginx %description debug not stripped version of nginx build with the debugging log support #预处理脚本 %prep %setup -q #开始构建包 %build ./configure \ --prefix=%{_sysconfdir}/nginx/ \ --sbin-path=%{_sbindir}/nginx \ --conf-path=%{_sysconfdir}/nginx/nginx.conf \ --error-log-path=%{_localstatedir}/log/nginx/error.log \ --http-log-path=%{_localstatedir}/log/nginx/access.log \ --pid-path=%{_localstatedir}/run/nginx.pid \ --lock-path=%{_localstatedir}/run/nginx.lock \ --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \ --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \ --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \ --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \ --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \ --user=%{nginx_user} \ --group=%{nginx_group} \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-mail \ --with-mail_ssl_module \ --with-file-aio \ --with-debug \ --with-cc-opt="%{optflags} $(pcre-config --cflags)" \ $* make %{?_smp_mflags} %{__mv} %{_builddir}/%{name}-%{version}/objs/nginx \ %{_builddir}/%{name}-%{version}/objs/nginx.debug ./configure \ --prefix=%{_sysconfdir}/nginx/ \ --sbin-path=%{_sbindir}/nginx \ --conf-path=%{_sysconfdir}/nginx/nginx.conf \ --error-log-path=%{_localstatedir}/log/nginx/error.log \ --http-log-path=%{_localstatedir}/log/nginx/access.log \ --pid-path=%{_localstatedir}/run/nginx.pid \ --lock-path=%{_localstatedir}/run/nginx.lock \ --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \ --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \ --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \ --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \ --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \ --user=%{nginx_user} \ --group=%{nginx_group} \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-mail \ --with-mail_ssl_module \ --with-file-aio \ --with-ipv6 \ --with-cc-opt="%{optflags} $(pcre-config --cflags)" \ $* make %{?_smp_mflags} #开手机把软件安装到虚拟的根目录中 %install %{__rm} -rf $RPM_BUILD_ROOT %{__make} DESTDIR=$RPM_BUILD_ROOT install %{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx %{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/ %{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default %{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf %{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx %{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx %{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx %{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d %{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf %{__install} -m 644 -p %{SOURCE4} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf %{__install} -m 644 -p %{SOURCE5} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/default.conf %{__install} -m 644 -p %{SOURCE6} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/example_ssl.conf %{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig %{__install} -m 644 -p %{SOURCE3} \ $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx # install SYSV init stuff %{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir} %if 0%{?suse_version} %{__install} -m755 %{SOURCE7} \ $RPM_BUILD_ROOT%{_initrddir}/nginx %else %{__install} -m755 %{SOURCE2} \ $RPM_BUILD_ROOT%{_initrddir}/nginx %endif # install log rotation stuff %{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d %{__install} -m 644 -p %{SOURCE1} \ $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx %{__install} -m644 %{_builddir}/%{name}-%{version}/objs/nginx.debug \ $RPM_BUILD_ROOT%{_sbindir}/nginx.debug #清理临时文件 %clean %{__rm} -rf $RPM_BUILD_ROOT #定义哪些文件或者目录会放入rpm中 %files %defattr(-,root,root) %{_sbindir}/nginx %dir %{_sysconfdir}/nginx %dir %{_sysconfdir}/nginx/conf.d %config(noreplace) %{_sysconfdir}/nginx/nginx.conf %config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf %config(noreplace) %{_sysconfdir}/nginx/conf.d/example_ssl.conf %config(noreplace) %{_sysconfdir}/nginx/mime.types %config(noreplace) %{_sysconfdir}/nginx/fastcgi_params %config(noreplace) %{_sysconfdir}/nginx/scgi_params %config(noreplace) %{_sysconfdir}/nginx/uwsgi_params %config(noreplace) %{_sysconfdir}/nginx/koi-utf %config(noreplace) %{_sysconfdir}/nginx/koi-win %config(noreplace) %{_sysconfdir}/nginx/win-utf %config(noreplace) %{_sysconfdir}/logrotate.d/nginx %config(noreplace) %{_sysconfdir}/sysconfig/nginx %{_initrddir}/nginx %dir %{_datadir}/nginx %dir %{_datadir}/nginx/html %{_datadir}/nginx/html/* %attr(0755,root,root) %dir %{_localstatedir}/cache/nginx %attr(0755,root,root) %dir %{_localstatedir}/log/nginx %files debug #%attr(权限,属主,属组) %attr(0755,root,root) %{_sbindir}/nginx.debug #rpm安装前执行的脚本 %pre # Add the "nginx" user getent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group} getent passwd %{nginx_user} >/dev/null || \ useradd -r -g %{nginx_group} -s /sbin/nologin \ -d %{nginx_home} -c "nginx user"%{nginx_user} exit 0 #rpm安装后执行的脚本 %post # Register the nginx service if [ $1 -eq 1 ]; then /sbin/chkconfig --add nginx # print site info cat <<BANNER --------------------------------------------------------------------- Thanks for using NGINX! Check out our community web site: * http://nginx.org/en/support.html If you have questions about commercial support for NGINX please visit: * http://www.nginx.com/support.html -------------------------------------------------------------------- BANNER fi #preunrpm卸载前执行的脚本 %preun #$0代表卸载,$1代表安装,$2代表升级 if [ $1 -eq 0 ]; then /sbin/service nginx stop > /dev/null 2>&1 /sbin/chkconfig --del nginx fi #postrun 人拼命卸载后执行的脚本 %postun if [ $1 -ge 1 ]; then /sbin/service nginx upgrade &>/dev/null || : fi #变更日志 %changelog * Tue Dec 11 2012 Sergey Budnevitch <[email protected]> - 1.2.6 |
4.2、实例分解说明
4.2.1、定义变量
%define nginx_home %{_localstatedir}/cache/nginx %define nginx_user nginx %define nginx_group nginx |
4.2.2、软件包的内容概要描述
Summary: high performance web server |
4.2.3、软件包的名称
后面可使用%{name}的方式引用,具体命令需跟源包一致
Name: nginx |
4.2.4、软件的实际版本号
具体命令需跟源包一致
Version: 1.2.6 |
4.2.5、软件包的发布实际版本号
Release: 1%{?dist}.ngx |
4.2.6、发行商或者打包组织的信息
Vendor: nginx inc. |
4.2.7、软件的主页
URL: http://nginx.org/ |
4.2.8、源代码包
可以带多个source0,source1等源,后面可以用%{SOURCE0},%{SOURCE1}引用
Source0: http://nginx.org/download/%{name}-%{version}.tar.gz Source1: logrotate Source2: nginx.init Source3: nginx.sysconf Source4: nginx.conf Source5: nginx.vh.default.conf Source6: nginx.vh.example_ssl.conf Source7: nginx.suse.init Source8: nginx.vh.example.conf |
4.2.9、软件授权方式
License: 2-clause BSD-like license %if 0%{?suse_version} |
4.2.10、软件分组
Group: Productivity/Networking/Web/Servers %else Group: System Environment/Daemons %endif |
4.2.11、安装或者编译时使用的“虚拟目录
考虑到多用户的环境,一般定义为
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root |
该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。
后面可使用$RPM_BUILD_ROOT 方式引用。
4.2.12、需要依赖的软件包
BuildRequires: zlib-devel BuildRequires: pcre-devel BuildRequires: perl %if 0%{?suse_version} BuildRequires: libopenssl-devel Requires(pre): pwdutils %else BuildRequires: openssl-devel Requires: initscripts >= 8.36 Requires(pre): shadow-utils Requires(post): chkconfig %endif |
4.3.13、指明本软件一些特定的功能,以便与其他rpm识别
Provides: webserver |
4.3.14、软件的描述信息明
%description nginx [engine x] is a HTTP and reverse proxy server, as well as a mail proxy server %package debug Summary: debug version of nginx Group: System Environment/Daemons Requires: nginx %description debug not stripped version of nginx build with the debugging log support |
4.3.15、预处理脚本
%prep |
#该段内容为安装前脚本程序。它在软件包安装之前执行,通常是检测操作环境,建立有关目录,清理多余文件等等,为软件包的顺利安装做准备。本段很少使用,其段名格式为: %pre [子包选项]
4.3.16、解压源码
%setup -q |
4.3.17、打补丁
%patch |
此宏利用系统中的patch命令,来给指定的源程序包打补丁,从而将程序升级。其使用格式为:
%patch [-P N] [-p N] [-b name] [-E] |
注: []所括为可选项
(1) 当没有任何选项时:
没有任何选项时,该宏使用的是默认的补丁文件(第0个补丁文件),即由文件头Patch或Patch0域所定义的文件
patch命令用了两个选项:(有关patch命令用法,详见其用户手册)
* -p :这个选项用于确定patch所要操作的文件。它针对补丁文件头部的文件名,删除名字中指定数目个
斜杠(/)前面的所有字符,从而得到要操作的文件名。
* -s :这个选项指示patch在打补丁过程中不输出任何信息,即使有错误发生。
(2) -P N :
使用此选项以指示RPM使用第N个补丁文件(由文件头PatchN域定义)。
(3) -p N :
此选项与其参数是由%patch宏直接传给patch命令的。请参见上面patch命令所用的-p选项的介绍。
(4) -b name :
当有多个patch命令操作同一个文件时,patch会将原文件换名保存(其后缀变作.orig)
(5) -E :
此选项直接传给patch命令,其作用是:如果一个文件打完补丁后内容为空(字节数为0),则删除这个文件。
4.3.18、开始构建包
%build |
此
为编译段,其内容为编译脚本程序。该程序完成源程序的编译和连接。一个最简单的例子就是程序中仅有一个make命令。这适用于大部分情况,因为多数软件均
有自己的makefile,这样通过make命令就可实现编译与连接。如果没有makefile的话,需要软件包制作者自己在编译段书写上一系列的编译连
接命令。
./configure \ --prefix=%{_sysconfdir}/nginx/ \ --sbin-path=%{_sbindir}/nginx \ --conf-path=%{_sysconfdir}/nginx/nginx.conf \ --error-log-path=%{_localstatedir}/log/nginx/error.log \ --http-log-path=%{_localstatedir}/log/nginx/access.log \ --pid-path=%{_localstatedir}/run/nginx.pid \ --lock-path=%{_localstatedir}/run/nginx.lock \ --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \ --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \ --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \ --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \ --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \ --user=%{nginx_user} \ --group=%{nginx_group} \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-mail \ --with-mail_ssl_module \ --with-file-aio \ --with-ipv6 \ --with-debug \ --with-cc-opt="%{optflags} $(pcre-config --cflags)" \ $* make %{?_smp_mflags} %{__mv} %{_builddir}/%{name}-%{version}/objs/nginx \ %{_builddir}/%{name}-%{version}/objs/nginx.debug ./configure \ --prefix=%{_sysconfdir}/nginx/ \ --sbin-path=%{_sbindir}/nginx \ --conf-path=%{_sysconfdir}/nginx/nginx.conf \ --error-log-path=%{_localstatedir}/log/nginx/error.log \ --http-log-path=%{_localstatedir}/log/nginx/access.log \ --pid-path=%{_localstatedir}/run/nginx.pid \ --lock-path=%{_localstatedir}/run/nginx.lock \ --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \ --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \ --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \ --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \ --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \ --user=%{nginx_user} \ --group=%{nginx_group} \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-file-aio \ --with-ipv6 \ --with-cc-opt="%{optflags} $(pcre-config --cflags)" \ $* make %{?_smp_mflags} |
4.3.19、把软件安装到虚拟的根目录中
%install |
此
为安装段,其内容是安装脚本程序。该程序将已编译连接好的执行程序或其它文件存放到指定目录下,这些程序或文件供RPM打包时使用。一个最简单的例子就是
程序中仅用一个make install命令,从而完成安装。这也需要相应的软件有makefile维护文件。没有的话,软件包制作者也得自己写指令。
%{__rm} -rf $RPM_BUILD_ROOT %{__make} DESTDIR=$RPM_BUILD_ROOT install %{__mkdir} -p $RPM_BUILD_ROOT%{_datadir}/nginx %{__mv} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/html $RPM_BUILD_ROOT%{_datadir}/nginx/ %{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/*.default %{__rm} -f $RPM_BUILD_ROOT%{_sysconfdir}/nginx/fastcgi.conf %{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/log/nginx %{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/run/nginx %{__mkdir} -p $RPM_BUILD_ROOT%{_localstatedir}/cache/nginx %{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d %{__rm} $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf %{__install} -m 644 -p %{SOURCE4} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/nginx.conf %{__install} -m 644 -p %{SOURCE5} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/example.txt %{__install} -m 644 -p %{SOURCE6} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/example_ssl.conf %{__install} -m 644 -p %{SOURCE8} \ $RPM_BUILD_ROOT%{_sysconfdir}/nginx/conf.d/example.conf %{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig %{__install} -m 644 -p %{SOURCE3} \ $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/nginx # install SYSV init stuff %{__mkdir} -p $RPM_BUILD_ROOT%{_initrddir} %if 0%{?suse_version} %{__install} -m755 %{SOURCE7} \ $RPM_BUILD_ROOT%{_initrddir}/nginx %else %{__install} -m755 %{SOURCE2} \ $RPM_BUILD_ROOT%{_initrddir}/nginx %endif # install log rotation stuff %{__mkdir} -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d %{__install} -m 644 -p %{SOURCE1} \ $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/nginx %{__install} -m644 %{_builddir}/%{name}-%{version}/objs/nginx.debug \ $RPM_BUILD_ROOT%{_sbindir}/nginx.debug |
4.3.20、清理临时文件
%clean %{__rm} -rf $RPM_BUILD_ROOT |
4.3.21、定义哪些文件或者目录会放入rpm中
%files %defattr(-,root,root) %{_sbindir}/nginx %dir %{_sysconfdir}/nginx %dir %{_sysconfdir}/nginx/conf.d %config(noreplace) %{_sysconfdir}/nginx/nginx.conf #%config(noreplace) %{_sysconfdir}/nginx/conf.d/default.conf %config(noreplace) %{_sysconfdir}/nginx/conf.d/example.conf %config(noreplace) %{_sysconfdir}/nginx/conf.d/example_ssl.conf %config(noreplace) %{_sysconfdir}/nginx/conf.d/example.txt %config(noreplace) %{_sysconfdir}/nginx/mime.types %config(noreplace) %{_sysconfdir}/nginx/fastcgi_params %config(noreplace) %{_sysconfdir}/nginx/scgi_params %config(noreplace) %{_sysconfdir}/nginx/uwsgi_params %config(noreplace) %{_sysconfdir}/nginx/koi-utf %config(noreplace) %{_sysconfdir}/nginx/koi-win %config(noreplace) %{_sysconfdir}/nginx/win-utf %config(noreplace) %{_sysconfdir}/logrotate.d/nginx %config(noreplace) %{_sysconfdir}/sysconfig/nginx %{_initrddir}/nginx %dir %{_datadir}/nginx %dir %{_datadir}/nginx/html %{_datadir}/nginx/html/* %attr(0755,root,root) %dir %{_localstatedir}/cache/nginx %attr(0755,root,root) %dir %{_localstatedir}/log/nginx %files debug |
4.3.22、设置权限
#%attr(权限,属主,属组) %attr(0755,root,root) %{_sbindir}/nginx.debug |
4.3.23、安装前后执行动作
#rpm安装前执行的脚本
%pre # Add the "nginx" user getent group %{nginx_group} >/dev/null || groupadd -r %{nginx_group} getent passwd %{nginx_user} >/dev/null || \ useradd -r -g %{nginx_group} -s /sbin/nologin \ -d %{nginx_home} -c "nginx user"%{nginx_user} exit 0 |
4.3.24、#rpm安装后执行的脚本
%post |
该段内容为安装后脚本程序。它在软件包安装完成之后执行,常用来建立符号连接,修改系统配置文件,运行ldconfig程序等,以利软件的正常运
#preunrpm卸载前执行的脚本
[ -d "/opt/web/www" ] [ "$?" != "0" ]&& mkdir -p /opt/web/www # Register the nginx service if [ $1 -eq 1 ]; then /sbin/chkconfig nginx on /sbin/service nginx start #ngpassword is a tool for nginx to create password cat >/usr/sbin/ngpassword <<EOF #!/usr/bin/perl use strict; my \$pw=\$ARGV[0] ; print crypt(\$pw,\$pw)."\n"; EOF chmod 755 /usr/sbin/ngpassword fi |
%preun |
#$1代表动作
0代表卸载
1代表安装
2代表升级
if [ $1 -eq 0 ]; then /sbin/service nginx stop > /dev/null 2>&1 /sbin/chkconfig --del nginx fi #postrun rpm卸载后执行的脚本 %postun if [ $1 -ge 1 ]; then /sbin/service nginx upgrade &>/dev/null || : fi |
4.2.25、变更日志
%changelog * Thu Jan 31 2013change config file<[email protected]> - 1.2.6 |
五、rpmbuild命令参数详解
5.1、rpmbuild 基本格式
rpmbuild [options] [spec文档|tarball包|源码包]
[[email protected]test01 SPECS]$ rpmbuild -ba nginx.spec |
5.2、spec文档建立有以下选项
选项 |
含义 |
-bp |
文件中安装执行前的地方 |
-bc |
执行spec的%pre和%build 段(准备并编译) |
-bi |
执行spec中%pre,%build与%install(准备,编译并安装) |
-bl |
检查spec中的%file段(查看文件是否齐全) |
-ba |
建立源码与二进制包(常用) |
-bb |
只建立二进制包(常用) |
-bs |
只建立源码包 |
5.3、tarball包建立,与spec类似
选项 |
含义 |
-tp |
对应-bp |
-tc |
对应-bc |
-ti |
对应-bi |
-ta |
对应-ba |
-tb |
对应-bb |
-ts |
对应-bs |
5.4、从源码包建立
选项 |
含义 |
--rebuild |
建立二进制包,通-bb |
其他的一些选项
选项 |
含义 |
--buildroot=DIRECTORY |
确定以root目录建立包 |
--clean |
完成打包后清除BUILD下的文件目录 |
--nobuild |
不进行%build的阶段 |
--nodeps |
不检查建立包时的关联文件 |
--rmsource |
完成打包后清除SOURCES |
--rmspec |
完成打包后清除SPEC |
--target=CPU-VENDOR-OS |
确定包的最终使用平台 |
RPMBUILD