linux rpm 包制作详解
一、RPM介紹
RPM 前是Red Hat?Package Manager 的縮寫,本意是Red Hat 軟件包管理,顧名思義是Red Hat 貢獻出來的軟件包管理;現(xiàn)在應(yīng)為RPM Package Manager的縮寫。在Fedora、RedHat、Mandriva、SUSE、YellowDog等主流發(fā)行版本,以及在這些版本基礎(chǔ)上二次開發(fā)出來的發(fā)行版采用; RPM包中除了包括程序運行時所需要的文件,也有其它的文件;一個RPM包中的應(yīng)用程序,有時除了自身所帶的附加文件保證其正常以外,還需要其它特定版本文件,這就是軟件包的依賴關(guān)系。
RPM可以讓用戶直接以binary方式安裝軟件包,并且可替用戶查詢是否已經(jīng)安裝了有關(guān)的庫文件;在用RPM刪除程序時,它又會聰明地詢問用戶是否要刪除有關(guān)的程序。如果使用RPM來升級軟件,RPM會保留原先的配置文件,這樣用戶就不用重新配置新的軟件了。RPM保留一個數(shù)據(jù)庫,這個數(shù)據(jù)庫中包含了所有的軟件包的資料,通過這個數(shù)據(jù)庫,用戶可以進行軟件包的查詢。RPM雖然是為Linux而設(shè)計的,但是它已經(jīng)移值到SunOS、Solaris、AIX、Irix等其它UNIX系統(tǒng)上了。RPM遵循GPL版權(quán)協(xié)議,用戶可以在符合GPL協(xié)議的條件下自由使用及傳播RPM。
二、RPM包分類
rpm分為兩大類,
1 二進制類包,包括rpm安裝包(一般分為i386和x86等幾種)和調(diào)式信息包等
2 源碼類包,源碼包和開發(fā)包應(yīng)該歸位此類
它們之間的關(guān)系是,最先我們按rpm打包要求改造軟件項目源碼,當(dāng)符合要求之后就可以使用rpmbuild命令來生成不同的rpm包,同時生成的包之間版本是直接對應(yīng)的,比如相同的源碼包將生成完全相同的二進制rpm包。當(dāng)你在網(wǎng)上查找rpm包時,一般你可以在RPMS目錄中找到預(yù)編譯的二進制包,而源碼包則會在SRPMS目錄內(nèi)。
我們這里提到的RPM制作就是指改造軟件源代碼使之符合RPM打包要求的過程,這也可以等價為RPM源碼包的制作過程,因為當(dāng)你有了源碼包就可以直接編譯得到二進制安裝包和其他任意包。
三、RPM包制作介紹
RPM包的制作,即是RPM源碼包的制作。
RPM包工作的原理
RPM是為解決源碼包不易安裝(需要編譯)和軟件包相互之間依賴(是RPM包管理器可以一定程度解決依賴問題)問題,它通過在探測源碼包在build和install階段的動作獲得最終生成的需要安裝的系統(tǒng)里的文件,并記錄下一些必要的操作(比如安裝完成后執(zhí)行某項操作),然后把此組成為一個整體,當(dāng)在用戶安裝此包時把前面獲得的所有問題和記錄的所有操作原原本本的作用的實際系統(tǒng)上。
把一個普通的源碼打成RPM包,需要下面一些操作
1、先需要對項目的Makefile作必要的改造以支持RPM打包操作(實際上此操作不是絕對的,SPEC文檔和Makefile的是協(xié)調(diào)統(tǒng)一工作的,只要他們之間配合好了其他都無所謂,我們一般只是推薦大家盡量按行業(yè)標(biāo)準(zhǔn)規(guī)范操作而已)
2、次是針對當(dāng)前項目撰寫SPEC文檔,SPEC文檔包括了RPM打包過程的操作內(nèi)容和新生成的RPM包的基本信息等,它的作用對象是打包程序rpmbuild。
四、RPM包制作過程
1 準(zhǔn)備打包環(huán)境
執(zhí)行如下命令安裝rpmbuild和rpmdevtools
#yum install rpmbuild
#yum install rpmdevtools
執(zhí)行如下命令來生成rpmbuild的工作目錄
#rpmdev-setuptree
工作目錄結(jié)構(gòu)如下,
~/rpmbuild
~/rpmbuild/SOURCES? ? ? ? ? ? ? #放置打包資源,包括源碼打包文件和補丁文件等
~/rpmbuild/SPECS? ? ? ? ? ? ? ? #放置SPEC文檔
~/rpmbuild/BUILD? ? ? ? ? ? ? ? #打包過程中的工作目錄
~/rpmbuild/RPMS? ? ? ? ? ? ? ? #存放生成的二進制包
~/rpmbuild/RPMS/i386? ? ? ? ? ? #存放生成的i386結(jié)構(gòu)包
~/rpmbuild/SRPMS? ? ? ? ? ? ? ? #存放生成的源碼包
提示:rpmdev-setuptree命令默認將再當(dāng)前用戶主目錄下創(chuàng)建一個RPM構(gòu)建根目錄結(jié)構(gòu),如果需要改變次默認位置,可以修改配置文件:~/.rpmmacros中變量_topdir對應(yīng)的值即可。
2、載源碼包到SOURCES目錄,不需要解壓
cd SOURCES/
wget http://nginx.org/download/nginx-1.2.1.tar.gz
3、撰寫Spec文件
SPEC撰寫是打包RPM的核心,也算是最難的一步,好在我們可以從參照一個簡單的模板文件開始,在可以實現(xiàn)基本功能的基礎(chǔ)上再一步一步的擴充文檔內(nèi)容,直至完全達到要求。下面是一個簡單的SPEC文檔,其中包括了一些說明信息(注:#后面的內(nèi)容為說明信息),該SPEC文檔是對一個測試的軟件項目hellorpm寫的,hellorpm軟件包編譯后僅有一個執(zhí)行文件、一個手冊文件和一個項目說文件。
nginx.spec文檔的內(nèi)容如下:
#
# Example spec file for nginx
#
#軟件包簡要介紹
Summary: high performance web server
#軟件包的名字
Name: nginx
#軟件包的主版本號
Version: 1.2.1
#軟件包的次版本號
Release: 1.el5.ngx
#授權(quán)協(xié)議
License: 2-clause BSD-like license
#軟件分類
Group: Applications/Server
Source: http://nginx.org/download/nginx-1.2.1.tar.gz
URL: http://nginx.org/
Distribution: Linux
Packager: zhumaohai <admin@www.linuxidc.com>
?
#軟件包的內(nèi)容介紹
%description
nginx [engine x] is a HTTP and reverse proxy server, as well as
a mail proxy server
#表示預(yù)操作字段,后面的命令將在源碼代碼BUILD前執(zhí)行
%prep
rm -rf $RPM_BUILD_DIR/nginx-1.2.1
zcat $RPM_SOURCE_DIR/nginx-1.2.1.tar.gz | tar -xvf -
#BUILD字段,將通過直接調(diào)用源碼目錄中自動構(gòu)建工具完成源碼編譯操作??
%build
cd nginx-1.2.1
#調(diào)用源碼目錄中的configure命令?
./configure --prefix=/usr/local/nginx
#在源碼目錄中執(zhí)行自動構(gòu)建命令make
make
#安裝字段
%install
cd nginx-1.2.1
#調(diào)用源碼中安裝執(zhí)行腳本??
make install
%preun
if [ -z "`ps aux | grep nginx | grep -v grep`" ];then
killall nginx >/dev/null
exit 0
fi
#文件說明字段,聲明多余或者缺少都將可能出錯
%files
#聲明/usr/local/nginx將出現(xiàn)在軟件包中
/usr/local/nginx
4、構(gòu)建RPM包
開始構(gòu)建操作,首先進入到當(dāng)前用戶的rpmbuild根目錄
#cd ~/rpmbuild/
#rpmbuild -ba SPECS/nginx.spec
提示:-ba表示build all,即生成包括二進制包和源代碼包的所有RPM包,如果正常的話,rpmbuild將正常退出,同時在RPMS目錄和SRPMS目錄中將生成對應(yīng)的RPM包。
?
?
?
?
?
?
?
?
?
?
?
?
?
參考地址:http://www.linuxidc.com/Linux/2015-08/121748.htm
?
轉(zhuǎn)載于:https://www.cnblogs.com/disanyuzhou/p/6830955.html
總結(jié)
以上是生活随笔為你收集整理的linux rpm 包制作详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更新KB915597补丁后导致“您的wi
- 下一篇: string的内存管理问题