本文介绍如何通过mysql的源码包进行RPM包的打包。

主要的流程包括: 获取源码包-》解压-》在解压中编译并生成spec文件-》创建RPM工作目录-》拷贝spec文件和源码包到工作目录-》进行打包

获取源码包:
源码包可以到官网下载,或者到lanchpad上用bazaar下载。 从官网上一般只能下载最新GA的社区版,lanchpad上一般是最新的源码,虽然可以通过bazaar的版本管理revert到期望的版本,但有时候找不到期望版本对应的revno(bzr中标识修改版本的编号)。 如果想下载不同版本的GA的社区版和企业版对应的代码,可以到percona的网站上下载: http://s3.amazonaws.com/percona.com/downloads/community/mysql-5.5.18.tar.gz
具体的版本可以用来替换5.5.18。
注:mysql5.0以后,基本所有GA的社区版都是单数,GA的企业版都是双数。 企业版版本上一般要稍微落后与社区版。 例如目前,GA的社区版是5.5.19,GA的企业版是5.5.18。

生成spec文件:
mysql中的spec文件需要通过编译生成,生成后的spec文件在support-file文件夹内。
注:在编译过程中mysql通过cmake的configure_file命令通过mysql.spec.sh文件生成mysql.spec文件

创建工作目录:
新建一个工作目录,在其中新建如下文件夹:
shell>mkdir-prpm/{BUILD,RPMS/i386,SOURCES,SPECS,SRPMS}
BUILD目录:编译时存放临时文件
SOURCES目录:存放.tar.gz源码包
SPECS目录:存放spec文件
RPMS目录:存放打包好的rpm文件
SRPMS目录:存放src.rpm文件。
修改/home/【用户名】/.rpmmacros文件 (如果没有就新建)
添加如下内容:
%_topdir 工作目录路径
注:如果是X86_64机器,把i386替换一下就好

拷贝spec文件和源码包到工作目录:
把spec文件放到SPECS目录 (通过指定 _topdir 可以在任意地方执行spec文件 )
把源码包放到SOURCES目录

进行打包:
到SPECS目录,执行:

>rpmbuild -ba mysql.spec



执行结束后生成的rpm包就在 RPMS/i386下了。

关于打补丁:
mysql默认生成的 mysql.spec并不支持打补丁,所以需要我们自己写脚本去打补丁,或修改mysql.spec.sh文件。

下面是一个脚本例子: 这个脚本是在解压后没有进行编译的源码的上运行的

#!/bin/sh 
 

 #take patches   
    
  这里是打补丁,使用的是patch命令,也可以使用quilt 
 
 PS_DIR=$PWD 
 
 echo $PS_DIR 
 
 (cd patches; cat `cat series`) | patch -p1 -N -d $PS_DIR 
 

 #build rpm directory 
 
 rm -rf ~/rpmbuild 
 
 mkdir ~/rpmbuild 
 
 mkdir ~/rpmbuild/BUILD && mkdir ~/rpmbuild/BUILDROOT 
 
 mkdir ~/rpmbuild/RPMS && mkdir ~/rpmbuild/SOURCES && mkdir ~/rpmbuild/SPECS && ~/rpmbuild/SRPMS 
 

 #create tar.gz file 
 
 cd ../ && tar -zcvf mysql-5.5.18.tar.gz mysql-5.5.18 
 
 mv mysql-5.5.18.tar.gz ~/rpmbuild/SOURCES/ 
 

 #rpmbuild 
 
 cd mysql-5.5.18/support-files && rpmbuild -ba mysql.5.5.18.spec 
 

 关于直接修改mysql.spec.sh: 
 
 1. 添加依赖的gcc与libaio-devel 
 
 在spec.sh文件的的开始部分有个 
 
 # ---------------------------------------------------------------------------- 
 
 # Distribution support 
 
 # ---------------------------------------------------------------------------- 
 
 在其后的每个�fine distro_buildreq 中添加cmake libaio-devel


如:

�fine distro_buildreq  
   
   
   
   
   
  gcc-c++ gdbm-devel gperf ncurses-devel openldap2-client readline-devel zlib-devel cmake libaio-devel


找到spec文件中如下部分
####################

# Main spec file section


####################
在其后添加patch定义:

Patch: p.patch 
 
 Patch1:p1.patch 
 
 Patch2:p2.patch



最后找到预处理脚本程序的地方:

%prep 
 
 %setup -T -a 0 -c -n %{src_dir}



在其后添加打补丁的操作:

cd %{src_dir} 
 
 %patch -p1 
 
 %patch1 -p1 
 
 %patch2 -p1