应生产环境中rpm编译需求,现记录下rpm包编译制作过程:

一、SRPM(Source rpm)包的制作rpm包的过程:

即没有编译过的原始文件,一般对应软件的官网上都有下载。

1.下载*.src.rpm包并安装,默认/usr/src/redhat/SPECS目录下会生成对应的.spec文件.

说明下/usr/src/redhat/...目录结构:

BUILD编译过程中有一些暂存资料都会放在这个目录中
RPMS编译成功之后,将打包的文件放在这个目录中,下有i386,i586,i686,noarch等目录....
SOURCES放置软件的原始文件如tar.gz包或配置文件
SPECS.spec编译文件
SRPMS类似RPMS,如果需生成src.rpm形式,会打包到此目录

2.编译.spec文件

3.运行rpmbuild  -ba   rpm-name.spec

执行完后产生的二进制RPM包会生成在RPMS目录的系统架构目录下.

注:32位的系统只能生成在i386下的32位包。无法生成64位软件包,这个经由同事实践。  

生成的包一样可以进行安装/卸载,如安装相同的包,可加上--force(强制替换)选项.

升级:rpm -Uvh  --force  rpm-name.rpm

 

二、tar.gz源码包制作rpm包的过程:

1.下载解压rpm-name.tar.gz对应软件包

2. 找到.spec文件编辑(有些软件不一定有spec文件,只能网上找对应spec模板或自己编写)

3.将源码包复制到/usr/src/redhat/SOURCES/...   原因看前面目录结构说明。

4.运行rpmbuild  -ba  rpm-name.spec 

生成rpm文件/usr/src/redhat/RPMS/.../rpm-name.rpm

 

三、.spec文件的框架结构:主要是虚拟路径的位置和宏定义。

1.全局配置  包含软件基础信息。

2.%prep 预处理部分:

由一些参数组成一个shell脚本从SOURCE中解压源码和应用补丁到BULID目录准备编译。

3.%bulid 编译和准备软件包部分:

运行在上下目录中指定的源码目录,编译过程中调用脚本 .config在本地的目录(%configure中配置的可以通过运行rpm -eval %configure来查看它的配置)

4.%install部分(使用绝对路径)

用来做rpm安装所需的文件,这些打包的文件会复制到前面讲的BuildRoot目录树中,通常/var/tmp/...目录.

5.%clean 部分 

清理rpmbulid后的一些临时文件。

其中的%pre,%post 脚本运行在包安装前后的交互。

如安装前设置:

 
  
  1. %pre  
  2. if [ $1 == 1 ]; then  
  3.     %{_sbindir}/useradd -c "Nginx user" -s /bin/false -r -d %{nginx_home} %{nginx_user} 2>/dev/null || :  
  4. fi  
  5. 安装前创建nginx用户并设置家目录. 

%preun,%postun 脚本运行在包卸载前后的交互。

如卸载前设置:

 
  
  1. %preun  
  2. if [ $1 = 0 ]; then  
  3.     /sbin/service %{name} stop >/dev/null 2>&1  
  4.     /sbin/chkconfig --del %{name}  
  5. fi  
  6. 停止服务 

6.%files部分 (使用相对路径)

任何打包的文件都需要在这个包的详细文件列表中,定义哪些文件/目录放入到rpm包中。注意虚拟目录进行,不可写绝对路径,以免系统文件的更改,应用宏或变量来表示相对路径。

7.%changlog部分

记录包修改记录。

rpm包内容的组成其实就是:tar.gz源码包,补丁包,.spec脚本文件.

 

spec文件的深度说明可参考:http://hlee.iteye.com/blog/343499