RPM原理詳解-spec文件

RPM原理詳解-spec文件

隨着RedHat Linux的風靡全球,其軟件包管理工具及格式RPM也得到推廣。基於RPM源代碼開放、安裝卸載簡單、升級維護方便及查詢功能強大的特點,越來越多的開發者喜歡採用RPM格式來發布自己的軟件包。RPM包裏面都包含可執行的二進制程序,這個程序和Windows的軟件包中的.exe文件類似是可執行的。

製作RPM軟件包並不是一件複雜的工作,其中的關鍵在於編寫SPEC軟件包描述文件。要想製作一個rpm軟件包就必須寫一個軟件包描述文件(SPEC)。這個文件中包含了軟件包的諸多信息,如軟件包的名字、版本、類別、說明摘要、創建時要執行什麼指令、安裝時要執行什麼操作、以及軟件包所要包含的文件列表等等。

一、編寫spec腳本
由前面的日誌瞭解到,生成rpm除了源碼外,最重要的就是懂得編寫.spec腳本。rpm建包的原理其實並不複雜,可以理解爲按照標準的格式整理一些信息,包括:軟件基礎信息,以及安裝、卸載前後執行的腳本,對源碼包解壓、打補丁、編譯,安裝路徑和文件等。
實際過程中,最關鍵的地方,是要清楚虛擬路徑的位置,以及宏的定義。

二、關鍵字

spec腳本包括很多關鍵字,主要有:

Name:

軟件包的名稱,後面可使用%{name}的方式引用

Summary

軟件包的內容概要

Version

軟件的實際版本號,例如:1.0.1等,後面可使用%{version}引用

Release

發佈序列號,例如:1linuxing等,標明第幾次打包,後面可使用%{release}引用

Group

軟件分組,建議使用標準分組

License

軟件授權方式,通常就是GPL

Source

源代碼包,可以帶多個用Source1、Source2等源,後面也可以用%{source1}、%{source2}引用

BuildRoot

這個是安裝或編譯時使用的“虛擬目錄”,考慮到多用戶的環境,一般定義爲:
%{_tmppath}/%{name}-%{version}-%{release}-root

%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}
該參數非常重要,因爲在生成rpm的過程中,執行make install時就會把軟件安裝到上述的路徑中,在打包的時候,同樣依賴“虛擬目錄”爲“根目錄”進行操作。
後面可使用$RPM_BUILD_ROOT 方式引用。

URL

軟件的主頁

Vendor

發行商或打包組織的信息,例如RedFlag Co,Ltd

Disstribution

發行版標識

Patch

補丁源碼,可使用Patch1、Patch2等標識多個補丁,使用%patch0或%{patch0}引用

Prefix

%{_prefix} 這個主要是爲了解決今後安裝rpm包時,並不一定把軟件安裝到rpm中打包的目錄的情況。這樣,必須在這裏定義該標識,並在編寫%install腳本的時候引用,才能實現rpm安裝時重新指定位置的功能

Prefix

%{_sysconfdir} 這個原因和上面的一樣,但由於%{_prefix}指/usr,而對於其他的文件,例如/etc下的配置文件,則需要用%{_sysconfdir}標識

Build Arch

指編譯的目標處理器架構,noarch標識不指定,但通常都是以/usr/lib/rpm/marcros中的內容爲默認值

Requires

該rpm包所依賴的軟件包名稱,可以用>=或<=表示大於或小於某一特定版本,例如:
libpng-devel >= 1.0.20 zlib
※“>=”號兩邊需用空格隔開,而不同軟件名稱也用空格分開
還有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是針對不同階段的依賴指定

Provides

指明本軟件一些特定的功能,以便其他rpm識別

Packager

打包者的信息

%description

軟件的詳細說明

三、spec腳本主體
spec腳本的主體中也包括了很多關鍵字和描述,下面會一一列舉。我會把一些特別需要留意的地方標註出來。

%prep

預處理腳本

%setup -n %{name}-%{version}

把源碼包解壓並放好
通常是從/usr/src/asianux/SOURCES裏的包解壓到/usr/src/asianux/BUILD/%{name}-%{version}中。
一般用%setup -c就可以了,但有兩種情況:一就是同時編譯多個源碼包,二就是源碼的tar包的名稱與解壓出來的目錄不一致,此時,就需要使用-n參數指定一下了。

%patch

打補丁
通常補丁都會一起在源碼tar.gz包中,或放到SOURCES目錄下。一般參數爲:
%patch -p1 使用前面定義的Patch補丁進行,-p1是忽略patch的第一層目錄
%Patch2 -p1 -b xxx.patch 打上指定的補丁,-b是指生成備份文件

%configure

這個不是關鍵字,而是rpm定義的標準宏命令。意思是執行源代碼的configure配置
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進行 ,使用標準寫法,會引用/usr/lib/rpm/marcros中定義的參數。
另一種不標準的寫法是,可參考源碼中的參數自定義,例如:
引用
CFLAGS=”RPMOPTFLAGS"CXXFLAGS=" RPM_OPT_FLAGS” ./configure –prefix=%{_prefix}

%build

開始構建包
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進行make的工作 ,常見寫法:
引用
make %{?_smp_mflags} OPTIMIZE=”%{optflags}”
都是一些優化參數,定義在/usr/lib/rpm/marcros中

%install

開始把軟件安裝到虛擬的根目錄中
在/usr/src/asianux/BUILD/%{name}-%{version}目錄中進行make install的操作。這個很重要,因爲如果這裏的路徑不對的話,則下面%file中尋找文件的時候就會失敗。 常見內容有:
%makeinstall 這不是關鍵字,而是rpm定義的標準宏命令。也可以使用非標準寫法:
引用
make DESTDIR=RPMBUILDROOTinstallmakeprefix= RPM_BUILD_ROOT install
需要說明的是,這裏的%install主要就是爲了後面的%file服務的。所以,還可以使用常規的系統命令:
引用
install -d RPMBUILDROOT/cpa RPM_BUILD_ROOT/

%clean

清理臨時文件
通常內容爲:
引用
[ “RPM_BUILD_ROOT" != "/" ] && rm -rf " RPM_BUILD_ROOT”
rm -rf $RPM_BUILD_DIR/%{name}-%{version}

※注意區分RPMBUILDROOT RPM_BUILD_DIR:
RPMBUILDROOTBuildRoot RPM_BUILD_DIR通常就是指/usr/src/asianux/BUILD,其中,前面的纔是%file需要的。

%pre

rpm安裝前執行的腳本

%post

rpm安裝後執行的腳本

%preun

rpm卸載前執行的腳本

%postun

rpm卸載後執行的腳本

%files

定義那些文件或目錄會放入rpm中
這裏會在虛擬根目錄下進行,千萬不要寫絕對路徑,而應用宏或變量表示相對路徑。 如果描述爲目錄,表示目錄中除%exclude外的所有文件。

%defattr (-,root,root)

指定包裝文件的屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執行文件是0755

%exclude

列出不想打包到rpm中的文件
※小心,如果%exclude指定的文件不存在,也會出錯的。

%changelog

變更日誌

四、RPM包製作過程

1、 將需要製作的源碼包放到/usr/src/redhat/SOURCES 目錄下

2、 在/usr/src/redhat/SPECS 目錄下編寫SPEC腳本

3、 在/usr/src/redhat/SPECS目錄下,輸入 rpmbuild –bb “spec文件的名字” 以後,就開始編譯了

4、 編譯成功以後,在/usr/src/redhat/RPMS/x86_64下會找到所編譯成功的RPM包

實際上RPM包的製作原理就是根據spec腳本文件,將軟件安裝到指定的虛擬目錄中,按照指定的格式進行打包。安裝RPM包的時候,按照指定的格式安裝到指定的目錄下。

五、spec腳本文件範例

下面一製作memcached的源碼包爲例,介紹編寫spec腳本

Summary: Free & open source, high-performance,distributed memory object caching system

Name: memcached #軟件包的名稱

Version: 1.4.5 #軟件的實際版本號

Release: 1.139 #發佈序列號,後面的139是與系統包區分開

License: GPL #軟件授權方式,通常就是GPL

Group: Applications

Source: memcached-1.4.5.tar.gz #源代碼包

BuildRoot: %{_tmppath}/%{name}-%{version}-root #這個是安裝或編譯時使用的“虛擬目錄”

BuildRequires: libevent,libevent-devel #該rpm包所依賴的軟件包名稱

Url: http://memcached.org/

%description

Memcached is an in-memory key-value store for smallchunks of arbitrary data (strings, objects) from results of database calls, APIcalls, or page rendering.

%prep #預處理腳本

%setup –q #提取源碼到BUILD 目錄; -q 指不顯示輸出(quietly)

%build #開始構建包

./configure

make

%install

rm -rf %{buildroot}

make DESTDIR=$RPM_BUILD_ROOT install #將軟件安裝到虛擬目錄中

%files #定義哪些些文件或目錄會放入rpm中

%defattr(-, root, root, 0755) #指定包裝文件的屬性

/usr/local/ #利用rpm安裝以後,安裝文件的路徑

注: 卸載帶有依賴關係的RPM包的時候,儘量不要用yum remove 包名卸載, 建議用rpm –e 進行卸載。卸載包的時候,一定要看好需要卸載的包名。

發佈了35 篇原創文章 · 獲贊 8 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章