RPMBUILD

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

时间: 2024-10-12 15:13:04

RPMBUILD的相关文章

安装rpmbuild的过程

[email protected] Packages]# ls |grep rpmbuild 居然没有这个包,奇怪了!!! [[email protected] Packages]# ls |grep build  秘密~ libreoffice-report-builder-4.0.4.2-9.el6.x86_64.rpm rpm-build-4.8.0-37.el6.x86_64.rpm [[email protected] Packages]# rpm -ivh rpm-build-4.8

用rpmbuild打包php

Name:    php        Version:    5.3.28    Release:    1%{?dist}Summary:    php Group:        System Environment/DaemonsLicense:    GPLURL:        http://rolin.com/Source0:    http://aa.com/php/%{name}-%{version}.tar.gzSource1:    php.iniSource2:    p

Linux rpmbuild命令

一.简介 rpmbuild命令用于创建软件的二进制包和源代码包. 二.选项 参考:http://blog.sina.com.cn/s/blog_4ba5b45e0102e5r2.html http://www.jinbuguo.com/redhat/rpmbuild.html 三.实例 1 准备打包环境 执行如下命令安装rpmbuild和rpmdevtools #yum install rpmbuild #yum install rpmdevtools 执行如下命令来生成rpmbuild的工作目

linux之使用rpmbuild打rpm包

linux之使用rpmbuild打rpm包 前言: 已从事linux运维工作数年,感觉自己还是个小菜鸟,没有大神那么的钻研的精神.只是单纯热爱,喜欢对着黑色的屏幕敲击命令,喜欢这种感觉.为什么要做RPM包呢?因为之前公司使用的是开源软件环境,nginx,tomcat,java,等等等等,安装时流程:编译->标准化目录->标准化参数->部署代码.这样纯手操作的话需要一套部署文档,当然根据个人理解和个人功力的不同,部署出来效果都千奇百怪. 所以通过一个星期的学习,大概掌握了写spec,并且总

以打包fuse为例介绍rpm打包工具rpmbuild的使用和SPEC文件的编写

一.rpmbuild命令的安装 yum install rpm-build 二.用法 rpmbuild -bb XXXX.spec或者rpmbuild -ba XXX.tar.gz 三.目录概述 rpmbuild在运行后会在用户目录下生成一个rpmbuild的文件夹:[[email protected] rpmbuild]# ls ~/rpmbuild/BUILD BUILDROOT RPMS SOURCES SPECS SRPMS有四个目录:BUILD:你要打包的文件将会在这里编译;BUILD

rpmbuild打包过程控制,禁用“brp-java-repack-jars ”

rpmbuild打包有一个过程是这样的: /usr/lib/rpm/redhat/brp-compress   /usr/lib/rpm/redhat/brp-strip /usr/bin/strip   /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip   /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump   /usr/lib

构建本地yum源之rpmbuild

组内准备搭建内部yum源,在这之前需要规范软件的安装目录,并把现有的应用打包. 目前接触两种rpm打包工具,rpmbuild和fpm. - rpmbuild rpmbuild关键是spec文件编写. 环境搭建 yum -y install rpm-build rpmdevtools useradd rpm; su rpm 注: rpm打包需要特定目录下,在近期版本下rpmbuild可以在非root账号家目录下创建打包目录: rpmdev-setuptree [[email protected]

RPM包rpmbuild SPEC文件深度说明 【装载】

转载地址[请查看作者原文] http://hlee.iteye.com/blog/343499 http://laoguang.blog.51cto.com/6013350/1103628 上一篇日志写到,为什么要制作rpm包,以及如何使用.src.rpm文件生成rpm包.最后部分还看到.src.rpm的内容,实际上 就是由.tar.gz源码.补丁软件和.spec脚本组成的.由此知道,使用.spec生成rpm包是比较简单的,因为.src.rpm通常都是由软件开 发者或者第三方的专业制作人根据源码

使用rpm-build制作nginx的rpm包

一.RPM包的分类 RPM有五种基本的操作功能:安装.卸载.升级.查询和验证. linux软件包分为两大类: (1)二进制类包,包括rpm安装包(一般分为i386和x86等几种) (2)源码类包,源码包和开发包应该归位此类(.src.rpm). 有时候为了方便源码包的安装,和我们自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,当有了源码包就可以直接编译得到二进制安装包和其他任意包.spec file是制作rpm包最核心的部分,rpm包的制作就是根据spec file来实现的