httpd 2.4的rpm包製作

參考:

        http://rpm-guide.readthedocs.io/en/latest/rpm-guide.html

 http://laoguang.blog.51cto.com/6013350/1103628

 http://blog.csdn.net/u013639526/article/details/52355081


rpm製作簡介:


rpm包的製作時由rpmbuild這個軟件包來實現的,rpmbuild的工作流程大概是這樣的:

    1.找到源碼包,加壓並拷貝到編譯工作車間(官方文檔的翻譯,其實就是一個專門用來編譯的目錄)

    2.在編譯工作車間中編譯程序,並把編譯結果拷貝到臨時的目錄中

    3.對編譯後的程序進行打包,把rpm包和srpm包分別拷貝到對應目錄

    

    上面的流程都是在一個以.spec結尾的文件指導下完成的,所以說.spec是整個過程的靈魂人物,它決定了解壓前後的操作,源碼的編譯參數等等。可以說rpmbuild是一個框架,而.spec就是具體實現,rpmbuild在.spec的指導下對編碼進行編譯打包最後生成rpm包。

    

    通過上面的流程,我們也不難知道爲什麼rpmbuild需要以下幾個目錄:

        SPECS:存放spec文件

        SOURCES:存放源碼包和補丁等,rpmbuild會在這裏尋找源碼

        BUILD:工作車間,也是源碼編譯的路徑,在這個目錄下進行編譯

        RPMS:存放編譯好後的rpm包

        SRPMS:存放編譯好後的srpm包


        BUILDROOT:臨時存放編譯完的結果(這個不是官網說的必備的目錄,因爲只是臨時存放,打包完成後會被刪除,必備目錄是上面5個,我個人覺得有必要拿出來說下,方便理解工作流程)

安裝rpmbuild包的時候,默認在家目錄會生成以上5個目錄

注意:在使用rpmbuild的時候,要使用非管理員賬戶進行製作,這是爲了避免spec中使用了不安全的指令導致意外


    rpmbuild  --showrc可以查看所有的rpmbuild的環境變量,比如builddir表示工作車間的目錄位置等等,這些變量我們都可以修改以下文件修改(內容來自rpmbuild的man文檔):

       /usr/lib/rpm/macros

          /usr/lib/rpm/redhat/macros

           /etc/rpm/macros

           ~/.rpmmacros

    rpmbuild從/usr/lib/rpm/macro開始往下到~/.rpmmacros依次讀取配置,如果配置一樣,則後面的配置會覆蓋前面的配置,也就是說,如果我們想修改rpmbuild的環境變量,我們最好在當前用戶的家目錄底下建個.rpmmacros文件,它的語法也很簡單:

    %VARIABLE_NAME   VALUE

例如:

    %_topdir      %(echo $HOME)/rpmbuild

    值可以引用變量,#開頭表示註釋


httpd 2.4的打包:

系統:centos 6.5 64位


1.安裝rpm編譯環境

    yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils  -y


2.把源碼包放進SOURCES中

    cd /usr/local/src

    wget  http://mirror.bit.edu.cn/apache//httpd/httpd-2.4.27.tar.bz2

    wget  http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.6.2.tar.gz

    wget  http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.0.tar.gz

    tar xf httpd-2.4.27.tar.bz2

    tar xf apr-1.6.2.tar.gz 

    mv  apr-1.6.2  httpd-2.4.27/srclib/apr  

    tar xf apr-util-1.6.0.tar.gz 

    mv apr-util-1.6.0  httpd-2.4.27/srclib/apr-util

    tar -jcvf  httpd-2.4.27.tar.bz2  httpd-2.4.27  #這裏之所以解壓並重新歸檔壓縮,是因爲httpd依賴於apr,在.spec中指定這個過程比較麻煩,所以我就直接這麼做了

    mv httpd-2.4.27.tar.bz2 ~/rpmbuild/SOURCES

    mv httpd-2.4.27/build/rpm/httpd.init  ~/rpmbuild/SOURCES  #這個是爲了給rpm包提供個啓動腳本

    [root@cqhdtest]#vi  ~/rpmbuild/SOURCES/httpd  

HTTPD=/usr/local/apache2.4/bin/httpd

PIDFILE=/usr/local/apache2.4/logs/httpd.pid

    #這個是爲了提供給啓動腳本httpd的配置,請根據自己實際情況來,這裏我因爲要把httpd安裝在/usr/loacl/apache2.4/中所以這麼做


3.編寫spec文件(內容的解釋參考http://laoguang.blog.51cto.com/6013350/1103628,懶得再寫)

[root@cqhdtest SPECS]# vi httpd2.4.spec

Name:           httpd 
Version:        2.4.27
Release:        1%{?dist}
Summary:        a rpm package made by linzb 2017.7.6

License:        GPL
URL:           httpd-2.4.27.tar.bz2
Source0:       httpd-2.4.27.tar.bz2 
Source1:	httpd
Source2:	httpd.init

BuildRequires:  gcc
BuildRequires:  make

%description
a  web server 

%prep
%setup -q


%build
rm -rf %{buildroot}
./configure --prefix=/usr/local/apache2.4 --sysconfdir=/etc/httpd/conf   --with-included-apr   --with-included-apr-util --enable-mpms-shared=all  
make %{?_smp_mflags}
%install
%make_install
%{__install} -p -D %{SOURCE1} %{buildroot}/etc/sysconfig/httpd    
%{__install} -p -D %{SOURCE2} %{buildroot}/etc/rc.d/init.d/httpd

%post 
if [ $1 == 1 ];then 
        /sbin/chkconfig --add httpd 
fi 
%files
/etc
/usr

%changelog
* Tue May 31 2016 linzb <[email protected]> - 1.0-1
- First httpd 2.4 package


4.執行打包並測試安裝

    cd  ~/rpmbuild/SPECS

    rpmbuild -bb httpd2.4.spec 

    #如果沒出錯的話會在~/rpmbuild/RPMS下的對應架構目錄下生成兩個rpm包,一個是我們要的,一個是debug信息包,比如這裏我生成了:

    [root@cqhdtest SPECS]#ls  ../RPMS/x86_64/

        httpd-2.4.27-1.el6.x86_64.rpm

        httpd-debuginfo-2.4.27-1.el6.x86_64.rpm

    最後把包拷貝到對應平臺安裝測試即可


debug:

    1.編譯過程中提示: 'check-rpaths' detected a broken RPATH and will cause 'rpmbuild'  

*          to fail. To ignore these errors, you can set the '$QA_RPATHS' 

    解決方法:

    [root@cqhdtest SPECS]# vi ~/.rpmmacros 

        %_topdir      %(echo $HOME)/rpmbuild

        %_smp_mflags  -j3

        #%__arch_install_post   /usr/lib/rpm/check-rpaths   /usr/lib/rpm/check-buildroot  #註銷掉這行即可


    2.編譯完成的包,提示/etc/init.d  conflict with chkconfig字樣

        解決:啓動腳本install的時候,安裝到/etc/rc.d/init.d下


    3. %file段的目錄問題

        file段的目錄都是相對於buildroot這個變量指定的路徑的,也就是類似於chroot命令效果,如果你寫/etc相當於真實路徑爲%{buildroot}/etc


    編譯好的包我放在51cto下載中心了,歡迎排錯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章