首頁 > 軟體

RPM包製作方法

2020-06-16 17:55:18

一、RPM介紹

RPM 前是Red Hat Package Manager 的縮寫,本意是Red Hat 軟體包管理,顧名思義是Red Hat 貢獻出來的軟體包管理;現在應為RPM Package Manager的縮寫。在FedoraRedHat、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包製作過程

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.linuxidc.com>
 
#軟體包的內容介紹
%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包。

下面關於RPM包製作相關的內容你可能也喜歡

CentOS 中如何快速客製化二進位制的核心 RPM 包  http://www.linuxidc.com/Linux/2015-07/120197.htm

RPM包建立入門  http://www.linuxidc.com/Linux/2015-02/113559.htm

如何在Linux中建立RPM包?  http://www.linuxidc.com/Linux/2012-05/60278.htm

製作自己的rpm包 http://www.linuxidc.com/Linux/2013-06/86435.htm

Linux 下rpm安裝後的目錄結構和一些設定 http://www.linuxidc.com/Linux/2013-06/85761.htm

rpm與yum的綜合性介紹與範例演示 http://www.linuxidc.com/Linux/2013-05/84480.htm

Redhat Linux---rpm 命令詳解 http://www.linuxidc.com/Linux/2013-03/81971.htm

使用FPM輕鬆製作RPM包 http://www.linuxidc.com/linux/2014-06/103019.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-08/121748.htm


IT145.com E-mail:sddin#qq.com