RPM包制作

一、 RPM简介

RPM的英文全称是Redhat Package Manager,是应用于Linux的软件包管理器。虽然其名称中还带有RedHat的标志,但是其原始设计理念是开放式的,现在很多的Linux的发行版本都采用,算是公认的行业标准。

RPM可以用于软件的安装、升级、卸载、查询、校验等功能,非常适合我们公司目前的产品使用。

二、 RPM安装

1、 使用RPM

如果只是使用RPM的功能的话,系统默认都已经安装好了。

2、 使用RPM Build

使用RPM Build用来制作RPM包的话,则需要额外的安装程序,包括:

bzip2-1.0.3-4.el5_2.i386.rpm

elfutils-0.137-3.el5.i386.rpm

patch-2.5.4-29.2.3.el5.i386.rpm

rpm-build-4.4.2.3-18.el5.i386.rpm

unzip-5.52-3.el5.i386.rpm

三、 RPM制作

1、 制作RPM包,最重要的就是编写spec文件。spec文件是整个RPM包建立过程的中心,它的作用就如同编译程序时的Makefile文件。spec文件包含建立一个RPM包必需的信息,包括哪些文件是包的一部分以及它们安装在哪个目录下。这个文件一般分为如下的几节:

1Preamle(序言)

包含用户请求包的信息时所显示的内容。它可以包含包的功能描述、包的软件版本、版权信息和所属的包组等。

主要有以下几类:

A. 版本: Name,Version,Release 

这三样直接决定了你的RPM的文件名称,

Name是名称,Version为版本号,Release为子版本号

例如:Name为hello,Version为1.0.0,Release为1

则打出的包就叫hello-1.0.0-1.i386.rpm

B. 其它软件有关的信息: Group,License,URL,Summary 

这些就是描述信息:

License就是版权,通常可选("GPL""Commercial""Shareware"

Group是组织名称,URL是网址,Summary是简要说明

C. 先决条件: PreReq,Requires,BuildPreRep 

也就是所谓的依赖了:

PreReq是安装前需要的,Requires是安装后还需要的,

BuildPreRep是打包前需要的

D. 输入: Source[#],Patch[#] 

这里就是源码了,包括Source:源码、Patch:补丁

2Prep

Prep节进行实际的打包准备工作,它是使用节前缀%prep表示的。

它一般包含%setup%patch两个命令。

%setup用于将软件源码包解开,%patch可将补丁文件加入解开的源程序中。

%setup

-n newdir---------将压缩的软件源程序在newdir目录下解开。

-c ---------------在解开源程序之前先创建目录。

-b num------------在包含多个源程序时,将第num个源程序解压缩。

-T----------------不使用缺省的解压缩操作。

%patch

%patchN-------这里N是数字,表示使用第N个补丁文件,等价于%patch -P N

-p0-----------指定使用第一个补丁文件,-p1指定使用第二个补丁文件。

-s------------在使用补丁时,不显示任何信息。

-b name-------在加入补丁文件之前,将源文件名上加入name。若为指定此参数,则缺省源文件加入.orig

-T------------将所有打补丁时产生的输出文件删除。

3Build

这一节主要用于编译源码,它是使用节前缀%build表示的。

这一节一般由多个make命令组成。

4Install 

这一节主要用于完成实际安装软件必须执行的命令,它是使用节前缀%install表示的。这一节一般是由make install指令构成,但是有时也会包含cpmvinstall等指令。

5Clean

这一节所描述的内容表示在完成包建立的工作之后,自动执行此节下的脚本进行附加的清除工作,它是使用节前缀%clean表示的。

一般而言,这一节的内容是简单地使用rm -rf $RPM_BUILD_ROOT命令,不需要指定此节的其它内容。

(6)文件列表

这一节指定构成包的文件的列表,它是使用节前缀%files表示的。此外,它还包含一系列宏控制安装后的文件属性和配置信息。

注意:如果在 %files 下列出一个目录名,RPM 会包括该目录下的所有文件。通常这不是您想要的,特别对于 /bin 这样的目录。

(7)改动日志 

这一节主要描述软件的开发记录,它是使用节前缀%changlog表示的。这个段的内容是为了开发人员能详细的了解该软件的开发过程,对于包的维护极有好处。

我的spec文件例子:

#--------------------hello-1.0.0-1.spec----------------begin

Summary: a simple "hello world" app 

Name:hello 

Version: 1.0.0

Release: 1

License: GPL

URL: http://www.kodak.com

Source: %{name}-%{version}.tar.gz 

Vendor: Kodak Inc.

Packager:  Jerry Chen <[email protected]

Group: Applications/Multimedia

#指定了$RPM_BUILD_ROOT的值

BuildRoot:/var/tmp/%{name}-%{version}-%{release}-root

%description

a simple "hello world" app. you can do nothing useful with it.

%prep

#解压缩源代码包,进入源代码包目录

%setup –c

%build

#就是make

#make

%install

rm -rf $RPM_BUILD_ROOT

#编译好的二进制文件安装到环境变量$RPM_BUILD_ROOT所指定的目录中去。

#make DESTDIR="$RPM_BUILD_ROOT" install

%clean

rm -rf $RPM_BUILD_ROOT

%files

%defattr(-,root,root)

#hello文件放入最后生成的安装包中,其安装路径为/usr/local/bin

/usr/local/bin/hello

%changelog 

#--------------------hello-1.0.0-1.spec----------------end

2、编写好spec文件,也准备好了程序文件,就可以进行制作了

A、将源代码或者发布程序进行打包,打包规定为tar.gz格式,文件名为跟Source标记相对应(注:我在操作时,发现需要在打包时创建一个跟要打出的RPM包名称一样的目录才可以成功,就像hello-1.0.0-1一样的目录,不然会报错,原因不明,待以后调查)

B、将hello-1.0.0-1.tar.gz 和hello-1.0.0-1.spec文件放在同一目录下,之后执行

rpmbuild -bb hello-1.0.0-1.spec,参数-bb的意思是只建立二进制包,如果用参数-ba那么就建立源码和二进制包

C、之后,就可以在默认的生成目录下,/usr/src/redhat/RPMS/i386/下,看到已经生成的RPM文件:hello-1.0.0-1.i386.rpm

D、测试,将hello-1.0.0-1.i386.rpm放到另外一台机器上,执行命令

rpm –ivh hello-1.0.0-1.i386.rpm

可以看到执行的结果,并且检查/usr/local/bin/hello是否已经成功创建


打包说明:


1:将hello目录和hello.spec文件拷到centos系统任何一个目录下,比如:/root。


2:使用命令:tar czvf hello.tar.gz hello/ 压缩hello文件


3:将hello.tar.gz拷到/usr/src/redhat/SOURCE目录下


4:执行打包命令:rpmbuild -bb /root/hello.spec开始打包


5:执行完毕后,会在/usr/src/redhat/RPMS/i386目录下生成安装包,文件名为:hello-4.0.0-1.i386.rpm


6:命令:rpm -ivh hello-4.0.0-1.i386.rpm安装程序,程序安装目录为/opt/hello

你可能感兴趣的:(RPM包制作)