參考:
http://rpm-guide.readthedocs.io/en/latest/rpm-guide.html
http://laoguang.blog.51cto.com/6013350/1103628
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
<code>Name: httpd </code>
<code>Version: 2.4.27</code>
<code>Release: 1%{?dist}</code>
<code>Summary: a rpm package made by linzb 2017.7.6</code>
<code>License: GPL</code>
<code>URL: httpd-2.4.27.</code><code>tar</code><code>.bz2</code>
<code>Source0: httpd-2.4.27.</code><code>tar</code><code>.bz2 </code>
<code>Source1: httpd</code>
<code>Source2: httpd.init</code>
<code>BuildRequires: gcc</code>
<code>BuildRequires: </code><code>make</code>
<code>%description</code>
<code>a web server </code>
<code>%prep</code>
<code>%setup -q</code>
<code>%build</code>
<code>rm</code> <code>-rf %{buildroot}</code>
<code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr/local/apache2</code><code>.4 --sysconfdir=</code><code>/etc/httpd/conf</code> <code>--with-included-apr --with-included-apr-util --</code><code>enable</code><code>-mpms-shared=all </code>
<code>make</code> <code>%{?_smp_mflags}</code>
<code>%</code><code>install</code>
<code>%make_install</code>
<code>%{__install} -p -D %{SOURCE1} %{buildroot}</code><code>/etc/sysconfig/httpd</code>
<code>%{__install} -p -D %{SOURCE2} %{buildroot}</code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/httpd</code>
<code>%post </code>
<code>if</code> <code>[ $1 == 1 ];</code><code>then</code>
<code> </code><code>/sbin/chkconfig</code> <code>--add httpd </code>
<code>fi</code>
<code>%files</code>
<code>/etc</code>
<code>/usr</code>
<code>%changelog</code>
<code>* Tue May 31 2016 linzb <[email protected]> - 1.0-1</code>
<code>- First httpd 2.4 package</code>
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下載下傳中心了,歡迎排錯
本文轉自biao007h51CTO部落格,原文連結: http://blog.51cto.com/linzb/1949847,如需轉載請自行聯系原作者