Build rpm包,需要的输入包括三个部分:源码、patches、spec文件。

##源码

源码打成tar包,以用于build。

##Patches

主要有两种Patches:

  1. 解决跟目标系统有关的问题。如修改makefiles,将应用安装到合适的目录;或者解决跨平台冲突等。
  2. 为编译准备合适的环境,如配置环境变量等。

##Spec文件

Spec文件定义如何build rpm包的步骤。一个spec文件主要分为8个部分:

###Preamble

序言,即关于rpm包的信息,如对该包的功能描述、版本号等,也可以指定源码、patches等。

###Prep Section

预备,即从此处开始build包,主要是在build之前,如果有必要,就在prep这里对源码做一些工作,一般是解压源码的tar包,为其添加patches,该部分的内容为一个shell脚本。但是,RPM也提供了两个宏来简化该部分工作,一个是解压tar包,并cd到源码目录下,另一个是为源码添加patches。

###Build Section

Build部分也是由一个shell脚本组成,执行编译源码的命令。该部分也可以只执行make命令编译源码,或者根据需求使用更为复杂的命令去编译。

###Install Section

该部分同样包含一个shell脚本,执行安装软件的命令。如果有对应的makefile文件,该部分包含一个make install命令即可。

###Install and Uninstall Scripts

包在安装与卸载前后可能会需要在用户系统执行一些脚本。RPM支持在包安装前、安装后、卸载前、卸载后执行脚本。例如,如果包中包含一个shell,那么在安装或者卸载包后,就需要更新文件/etc/shells。

###Verify Section

尽管RPM会做很多验证工作,可能仍旧需要验证的脚本来验证超出RPM能力范围的部分。

###Clean Section

该部分很少使用,因为RPM本身就能够将clean工作做的很好,就是删除源码、spec文件等工作。

###File List

该部分由多个文件路径组成,这些文件会放入rpm包中,另外,还有一些宏,用于控制文件属性、哪些文件是文档、哪些文件爱你包含配置信息等。如果没有该部分,就build不出包来。

##总结

上述过程执行过后,会生成一个源码包文件和二进制包文件。

源码包文件就是一个格式化归档,包括如下内容:

  1. 源码tar包
  2. spec文件
  3. patches

二进制RPM文件即可安装文件。

##示例

###创建build所需的目录结构

RPM需要多个目录来执行build,这些目录在一个top-level目录,如/home/zj/redhat,该目录下有5个子目录,它们的功能如下所述:

  • SOURCES : 包含源文件、patches和图标文件。
  • SPECS : 包括spec文件。
  • BUILD : 源文件解压到该目录下,并在此执行build。
  • RPMS : 包含生成的二进制rpm包。
  • SRPMS : 包含源码rpm包。

###获取源码

下载cdplayer的源码文件到SOURCES下,我用的是cdp-0.33.tar.gz。

###创建Spec文件

####Preamble

#  
#   Example spec file for cdplayer app...
#  
Summary: A CD player app that rocks!
Name: cdp
Version: 0.33
Release: 1
Copyright: GPL
Group: Applications/Sound
Source: cdp-0.33.tar.gz
URL: http://sourceforge.net/projects/cdp/
Distribution: WSS Linux
Vendor: White Socks Software, Inc.
Packager: Santa Claus <sclaus@northpole.com>

%description
It slices!  It dices!  It's a CD player app that
can't be beat.  By using the resonant frequency
of the CD itself, it is able to simulate 20X
oversampling.  This leads to sound quality that
cannot be equaled with more mundane software...

####%prep

%prep
rm -rf $RPM_BUILD_DIR/cdp-0.33.tar.gz
zcat $RPM_SOURCE_DIR/cdp-0.33.tar.gz | tar -xvf -

此处使用到RPM环境变量,如$RPM_BUILD_DIR。prep递归删除build目录,以删除以前build的文件;然后,解压tar文件到build目录下。当然,如果需要打补丁,也是要在这里做的,此例中,不需要。

当然,也可以使用宏来使工作更为简单。上述prep也可写成如下:

%prep
%setup

####%build

%build
cd $RPM_BUILD_DIR/var/tmp/cdp-0.33
make

编辑好spec文件,执行rpmbuild -ba cdp.spec,执行过程中会出现很多问题,需要一一解决,最后在build make这一步出错,源码有问题,我也解决不了了。但是,对rpm包的build有一定的了解了,之后再多次尝试。