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