rpm包如何製作 個人經驗

2021-08-30 02:33:12 字數 4620 閱讀 2638

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分為兩大類,

1 二進位製類包,包括rpm安裝包(一般分為i386和x86等幾種)和調式資訊包等。

2 原始碼類包,原始碼包和開發包應該歸位此類。

它們之間的關係是,最先我們按rpm打包要求改造軟體專案原始碼,當符合要求之後就可以使用rpmbuild命令來生成不同的rpm包,同時生成的包之間版本是直接對應的,比如相同的原始碼包將生成完全相同的二進位制rpm包。當你在網上查詢rpm包時,一般你可以在rpms目錄中找到預編譯的二進位製包,而原始碼包則會在srpms目錄內。

我們這裡提到的rpm製作就是指改造軟體源**使之符合rpm打包要求的過程,這也可以等價為rpm原始碼包的製作過程,因為當你有了原始碼包就可以直接編譯得到二進位制安裝包和其他任意包。

rpm包的製作,即是rpm原始碼包的製作。

這裡我想說說rpm包工作的原理,這將有助於全面的了解rpm包管理系統的知識。

rpm是為解決原始碼包不易安裝(需要編譯)和軟體包相互之間依賴(是rpm包管理器可以一定程度解決依賴問題)問題,它通過在探測原始碼包在build和install階段的動作獲得最終生成的需要安裝的系統裡的檔案,並記錄下一些必要的操作(比如安裝完成後執行某項操作),然後把此組成為乙個整體,當在使用者安裝此包時把前面獲得的所有問題和記錄的所有操作原原本本的作用的實際系統上。

為乙個普通的原始碼打rpm包,需要下面一些操作:

首先需要對專案的makefile作必要的改造以支援rpm打包操作(實際上此操作不是絕對的,spec文件和makefile的是協調統一工作的,只要他們之間配合好了其他都無所謂,我們一般只是推薦大家盡量按行業標準規範操作而已);

其次是針對當前專案撰寫spec文件,spec文件包括了rpm打包過程的操作內容和新生成的rpm包的基本資訊等,它的作用物件是打包程式rpmbuild。

1 準備打包環境

fedora系統下使用如下命令安裝rpmbuild

#yum install rpmbuild

rpmbuild的工作目錄如下,

~/rpmbuild

~/rpmbuild/sources

~/rpmbuild/specs

~/rpmbuild/build

~/rpmbuild/rpms

~/rpmbuild/rpms/i386

~/rpmbuild/srpms

如果你的使用者目錄主目錄下沒有類似目錄結構,你可以通過乙個工具軟體來自動配置和生成,如下。

#yum install rpmdevtools

下了執行自動配置命令自動生成如上目錄,並配置一些必要操作。

#rpmdev-setuptree

rpmdev-setuptree命令預設將再當前使用者主目錄下建立乙個rpm構建根目錄結構,

如果需要改變次預設位置,可以修改配置檔案:~/.rpmmacros中變數_topdir對應

的值即可。

一般rpmbuild會在當前使用者的主目錄下自動建立如上目錄結構,如果在你對應使用者的構建目錄中沒有自動建立如上目錄,你可以通過手動方式建立。上面目錄的使用是這樣分配的,sources放置打包資源,包括原始碼打包檔案和補丁檔案等;specs目錄放置spec文件;build打包過程中的工作目錄;rpms目錄存放生成的二進位製包,rpm包根據硬體平台不同分類,i386表示生成i386結構的包將存放在該目錄下;srpms目錄存放生成的原始碼包。

2 撰寫spec文件

spec撰寫是打包rpm的核心,也算是最難的一步,好在我們可以從參照乙個簡單的模板檔案開始,在可以實現基本功能的基礎上再一步一步的擴充文件內容,直至完全達到要求。下面是乙個簡單的spec文件,其中包括了一些說明資訊(注:#後面的內容為說明資訊),該spec文件是對乙個測試的軟體專案hellorpm寫的,hellorpm軟體包編譯後僅有乙個執行檔案、乙個手冊檔案和乙個專案說檔案。

hellorpm.spec文件的內容如下:

#軟體包簡要介紹

summary: hellorpm is a test program。

#軟體包的名字

name: hellorpm

#軟體包的主版本號

version: 2.2.6

#軟體包的次版本號

release: 1

#源**包,預設將在上面提到的sources目錄中尋找

source0: %-%.tar.gz

#授權協議

license: gpl

#定義臨時構建目錄,這個位址將作為臨時安裝目錄在後面引用

buildroot:%/%-%-%-root

#軟體分類

group: development/tools

#軟體包的內容介紹

%description

the hellorpm program is a test.

#表示預操作字段,後面的命令將在原始碼**build前執行

%prep

#構建build環境,將解壓原始碼壓縮包到build目錄

%setup -q

#build欄位,將通過直接呼叫原始碼目錄中自動構建工具完成原始碼編譯操作

%build

#呼叫原始碼目錄中的configure命令

./configure

#在原始碼目錄中執行自動構建命令make

make

#安裝字段

%install

#呼叫原始碼中安裝執行指令碼

make destdir=$rpm_build_root install

#檔案說明字段,宣告多餘或者缺少都將可能出錯

%files

#設定檔案許可權屬性

%defattr(-,root,root)

#宣告/usr/local/bin/hellorpm將出現在軟體包中

/usr/local/bin/hellorpm

#宣告並設定檔案屬性

%doc %attr(0444,root,root) /usr/local/man/man1/hellorpm.1

#同上,宣告文件檔案

%doc readme

這個文件需要說明的一點:

buildroot:%/%-%-%-root

上面buildroot變數表示的是原始碼的臨時按照目錄,rpmbuild就是通過次目錄獲得將要按照到系統中的所有檔案,而在spec文件後面make install 命令中的引數destdir=$rpm_build_root即是對該引數的引用,這個引數將傳給makefile檔案一告訴自動構建工具應該安裝檔案那裡(實際上我再前文提到過的makefile需要作一些改造以適應rpm的構建就包括此操作,你的makefile檔案中至少要知道在rpm構建過程中引用此引數的值去控制安裝操作的目標)。

如上乙個簡單的spec文件撰寫完成,下面把乙個名為hellorpm-2.2.6.tar.gz的原始碼壓縮檔案放到

rpmbuild根目錄下的sources目錄下(注,確保此歸檔檔案解壓後的目錄為hellorpm-2.2.6,

否則會有問題)。

到此乙個完整的rpm打包環境已經構建完成,下面我們就可以開始構建二進位制和源**rpm包。

3 構建rpm包

構建rpm包是有命令rpmbuild在spec的指導下完成。

開始構建操作,首先進入到當前使用者的rpmbuild根目錄(即上面提到的目錄環境)。

#cd ~/rpmbuild/

執行如何命令,-ba表示build all,即生成包括二進位製包和源**包的所有rpm包,下來如果正常的話,rpmbuild將正常退出,同時在rpms目錄和srpms目錄中將生成對應的rpm包。

#rpmbuild -ba specs/hellorpm.spec

這裡僅僅介紹了乙個最簡單軟體的最簡單的rpm的打包操作過程,諸如帶有共享檔案的需要進行複雜配置的具有複雜依賴關係的等等的專案的打包以及後期的維護,包括補丁的製作我將在下來的時間完成補充更新,今天時間不早了,該休息了!

注:費了大半夜的功夫,搞出這麼個令人不滿意的文件,我思考著,這樣做有多少意義呢?不敢重**明輪子的,站到巨人的肩膀你才能看得更遠,是這樣嗎?

是不是下週開始立個計畫,每週至少翻譯三篇fedora官網的文件給自己練練手。那糟糕的英語,唉!

rpm包製作流程

步驟一 安裝rpm build軟體 1.安裝rpm build包 yum y install rpm build 2.生成rpmbuild目錄結構 rpmbuild ba nginx.spec 會報錯,沒有檔案或目錄 可以忽略 會自動生成跟目錄 3.準備工作,將原始碼軟體複製到sources目錄 c...

RPM包製作教程

一 rpm介紹 rpm 前是red hat package manager 的縮寫,本意是red hat 軟體包管理,顧名思義是red hat 貢獻出來的軟體包管理 現在應為rpm package manager的縮寫。在fedora redhat mandriva suse yellowdog等主...

RPM包的製作

注意事項 製作rpm包最好不要使用root使用者,以防止製作過程中不慎執行有害命令 需要安裝的依賴包 yum install gcc rpm build rpm devel rpmlint make python bash coreutils diffutils patch rpmdevtoolss...