使用rpmbuild构建rpm安装包

RPMRed Hat Package Manager)是用于 Linux分发版(distribution)的最常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。

 

 

1、  基本概念

RPM包命名方式:name-version-release.architecture.rpm ,如indent-2.2.6-1.x86_64.rpm,libevent-1.2-1.el6.x86_64.rpm等

 

RPM有五种基本的操作功能:安装、卸载、升级、查询和验证。这五种基本功能的实现仅仅需要用rpm + 选项 + rpm包就能轻易地实现。

安装:

rpm –ivhmysql-5.1.61-4.el6.i686.rpm

 

查询:

rpm –qa mysql:查询跟mysql有关的包。

 

删除:

rpm –emysql-5.1.61-4.el6.i686,一般的话都会先通过查询已经安装好的包,然后执行删除命令,上述命令,即可卸载掉系统安装好的rpm包。

 

升级:

    rpm –Uvh mysql-5.1.61-4.el6.i686.rpm

 

验证:

    rpm –Vmysql-5.1.61-4.el6.i686.rpm。对已经安装了的程序进行验证。

 

2、  一个简单的例子

为让读者明白生成RPM包的流程,我们在这里不使用默认目录,而是自行定义。

第一步,创建工作目录/data/rpmbuild

 

第二步,创建RPM打包过程所需子目录:

/data/rpmbuild/SPECS,存放rpmbuild打包所需要的spec文件

/data/rpmbuild/SOURCES,存放rpmbuild打包所需要的代码源文件

/data/rpmbuild/RPMS, 存放生成的rpm包

/data/rpmbuild/SRPMS, 存放生成的rpm源码包

/data/rpmbuild/BUILD, 打包过程的临时工作目录

/data/rpmbuild/BUILDROOT, 虚拟根目录,临时存放编译后文件

 

第三步,将源码文件放到SOURCES目录下                           

 

第四步:转入SPECS目录,编写indent.spec文件(文件名随意) 

 使用rpmbuild构建rpm安装包_第1张图片

第五步,rpm -ba filename.spec –define “_topdir /data/rpmbuild”。执行完毕后再RPMS目录中可看到生成的RPM文件:

其中带有debuginfo的RPM包为包含调试信息的安装包,不需要的话忽略即可,也可以通过修改配置项使之不生成。

 

3、  SPEC文件详解

A.     文件头

Summary:一句话概括软件包尽可能多的信息

Name:将要打包的软件名称

Version:将要打包的软件的源码版本

Release:将要打包的软件的发布版本号

Vendor:软件开发者的名字

Copyright:软件包所采用的版权规则,如GPL、commercial等

License:软件所使用的许可证

Group:软件包所属的类别

Packager:封包者名称

Source:源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用

 

BUILDROOT: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:%{_tmppath}/%{name}-%{version}-%{release}-root或

%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u}-n}

该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。后面可使用$RPM_BUILD_ROOT 方式引用

 

Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用

Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:libpng-devel >= 1.0.20 zlib 

 

B.     %description宏

软件的详细说明,这是SPEC文件中唯一可以跨行的部分,所以一般放在文件头的最后声明。

 

C.     %prep部分

这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可以有很多行,如我们常写的tar解包命令。

%setup -n %{name}-%{version} 把源码包解压并放好
通常是从/SOURCES里的包解压到BUILD/%{name}-%{version}中。一般用%setup-c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。

%patch打补丁,补丁一般在tar.gz包中,或者放到SOURCES目录下。一般参数为:

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

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

 

D.     %build部分

这一部分执行编译动作。一般执行configure,make等命令,如:

%configure --prefix=/usr

Make

 

E.      %install部分

这一部分执行安装动作。因为在一般情况下,我们仅仅是想完成打包工作,而并不像在本机安装相应的程序,因此我们往往使用虚拟根目录。

rm -rf $RPM_BUILD_ROOT

make DESTDIR=$RPM_BUILD_ROOT install

执行后,在BUILDROOT目录的下层目录下会看到,相应软件已经安装到该目录下。

 

F.      %clean

顾名思义,这一部分执行打包后的清理动作。如rm -rf $RPM_BUILD_ROOT

 

G.     %file部分

这一部分定义哪些文件或者目录会被放入到rpm中

%defattr(-,root,root,0755)指名安装时文件的用户,用户组和存取权限。一般形式如下:

%defattr(-,root,root,0755)

/usr/bin/event_rpcgen.py

/usr/include/evdns.h

/usr/lib64/libevent-1.4.so.2

执行安装命令后,libevent-1.4.so.2将被安装到/usr/lib64目录下。

 

H.     其他部分

%pre rpm安装前执行的脚本

%post rpm安装后执行的脚本

%preun rpm卸载前执行的脚本

%postun rpm卸载后执行的脚本



相关参考链接:http://book.51cto.com/art/201401/427743.htm

http://bbs.voip88.com/home.php?mod=space&uid=1&do=blog&id=727



你可能感兴趣的:(使用rpmbuild构建rpm安装包)