安装:

yum  install -y rpm-build

目录介绍:

默认目录在  /root/rpmbuild

BUILD :你要打包的文件将会在这里编译(编译rpm包的临时目录)

BUILDROOT: 在虚拟安装(make install)的目录(编译后生成的软件临时安装目录)

RPMS :存放生成的二进制的rpm包(生成的可安装的rpm安装包所在目录)

SOURCES :你要编译的源码包会被copy到这里(所有源代码和补丁文件的存在目录)

SPECS :你执行的spec文件会被copy到这里(存放SOEC文件的目录)

SRPMS :软件最终的rpm源码格式存放路径

rpmbuild用法:

rpmbuild {-ba|-bb|-bp|-bc|-bi|-bl|-bs} [rpmbuild-options] SPECFILE...

rpmbuild -ba ***.spec //建立源码包和二进制包buildsourceandbinarypackagesfrom

rpmbuild-bb  ***.spec//只建立二进制包buildbinarypackageonlyfrom

rpmbuild -bs ***.spec//只建立源码包buildsourcepackageonlyfrom

rpmbuild{-ta|-tb|-tp|-tc|-ti|-tl|-ts}[rpmbuild-options]TARBALL...

rpmbuild -ta ***.tar.gz//建立源码包和二进制包 buildsourceandbinarypackagesfrom

rpmbuild -tb  ***.tar.gz//只建立二进制包   buildbinarypackageonlyfrom

rpmbuild  -ts ***.tar.gz//只建立源码包buildsourcepackageonlyfrom

rpmbuild{--rebuild|--recompile}SOURCEPKG...

rpmbuild --rebuild   ***.src.rpm//只建立二进制包buildbinarypackagefrom

Spec文件:

Name: 软件包的名称,后面可使用%{name}的方式引用

Summary: 软件包的内容概要

Version: 软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用

Release: 发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用

Group: 软件分组,建议使用标准分组

License: 软件授权方式,通常就是GPL

Source0: 源代码包,可以带多个用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 软件的详细说明

%prep 预处理脚本

%setup -n %{name}-%{version} 把源码包解压并放好

通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中。

一般用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。

%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 打补丁

通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。一般参数为:

%patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录

%Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件

◎补充一下

%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卸载后执行的脚本

%files 定义那些文件或目录会放入rpm中

这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。 如果描述为目录,表示目录中除%exclude外的所有文件。

%defattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755

%exclude 列出不想打包到rpm中的文件

※小心,如果%exclude指定的文件不存在,也会出错的。

%changelog 变更日志

一.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                           ##测试卸载,如果版本号比原来的高,升级测试

05-07 12:18