1. 程式人生 > >mysql RPM打包

mysql RPM打包

本文介紹如何通過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