RPM打包步驟說明html
參考:http://blog.chinaunix.net/uid-21123336-id-1830527.htmlpython
1、 RPM簡介
RPM最初是Red Hat Package Manager的縮寫,本意是Red Hat軟件包管理,顧名思義是Red Hat貢獻出來的軟件包管理;如今應爲RPM Package Manager的縮寫。在Fedora、Redhat、Mandriva、SuSE、YellowDog等主流發行版本,以及在這些版本基礎上二次開發出來的發行版採用;RPM包中除了包括程序運行時所須要的文件,也有其它的文件;一個RPM包中的應用程序,有時除了自身所帶的附加文件保證其正常之外,還須要其它特定版本文件,這就是軟件包的依賴關係。
RPM是爲解決源碼包不易安裝(須要編譯)和軟件包相互之間依賴(是RPM包管理器能夠必定程度解決依賴問題)問題,它經過在探測源碼包在build和install階段的動做得到最終生成的須要安裝的系統裏的文件,並記錄下一些必要的操做(好比安裝完成後執行某項操做),而後把此組成爲一個總體,當在用戶安裝此包時把前面得到的全部問題和記錄的全部操做原本來本的做用的實際系統上。
RPM可讓用戶直接以binary方式安裝軟件包,而且可替用戶查詢是否已經安裝了有關的庫文件;在用RPM刪除程序時,它又會詢問用戶是否要刪除有關的程序。若是使用RPM來升級軟件,RPM會保留原先的配置文件,這樣用戶就不用從新配置新的軟件了。RPM保留一個數據庫,這個數據庫中包含了全部的軟件包的資料,經過這個數據庫,用戶能夠進行軟件包的查詢。RPM雖然是爲Linux而設計的,可是它已經移值到SunOS、Solaris、AIX、Irix等其它UNIX系統上了。RPM遵循GPL版權協議,用戶能夠在符合GPL協議的條件下自由使用及傳播RPM。
2、 RPM打包環境配置
Linux系統中使用rpmbuild軟件來完成rpm打包。首先安裝rpmbuild:
#yum –y install rpmbuild
rpmbuild的工做目錄以下,
~/rpmbuild #放置打包過程當中解壓後的文件夾
~/rpmbuild/SOURCES #放置打包資源,包括源碼打包文件和補丁文件等
~/rpmbuild/SPECS #放置SPEC文檔(打包配置文件)
~/rpmbuild/BUILD #打包過程當中的工做目錄
~/rpmbuild/RPMS #存放生成的二進制包,RPM包根據硬件平臺不一樣分類,分爲x_86.4和i386(.rpm)
~/rpmbuild/SRPMS #存放生成的源碼包(.src.rpm)
若是你的用戶目錄主目錄下沒有相似目錄結構,你能夠經過一個工具軟件來自動配置和生成,以下。
#yum install rpmdevtools
安裝完成後,運行自動配置命令自動生成如上目錄。
#rpmdev-setuptree
rpmdev-setuptree命令默認將再當前用戶主目錄下建立一個RPM構建根目錄結構,若是須要改變此默認位置,能夠修改配置文件:~/.rpmmacros中變量_topdir對應的值便可。
#pwd
/root
# cat .rpmmacros
%_topdir %(echo $HOME)/rpmbuild
%_smp_mflags -j3
%__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
3、 RPM打包spec文件配置
SPEC撰寫是打包RPM的核心,也算是最難的一步,好在建立一個spec文件會自動生成一個簡單的模板,能夠在此模板的基礎上再一步一步的擴充文檔內容,直至徹底達到要求。下面是一個簡單的SPEC文檔,其中包括了一些說明信息(注:#後面的內容爲說明信息),該SPEC文檔是對setuptools軟件寫的,setuptools的源碼包是從上下載的.zip包。此處的安裝步驟根據手動按裝步驟來寫便可。
setuptools.spec文檔的內容以下:
=================================================================
Summary: this is a test program。#軟件包簡要介紹
Name: setuptools #軟件包的名字
Version: 1.0.0 #軟件包的主版本號
Release: 1 #軟件包的次版本號
Source0: %{name}-%{version}.zip #源代碼包,默認將在上面提到的SOURCES目錄中尋找
License: GPL #受權協議
#定義臨時構建目錄,這個地址將做爲臨時安裝目錄在後面引用
BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root
Requires:pysvn = 1.6.2-3.el5 #依賴的軟件及版本
Group: Development/Tools #軟件分類
%description #軟件包的內容介紹
The program is a test.
%prep #表示預操做字段,後面的命令將在源碼代碼BUILD前執行
%setup -q #構建BUILD環境,將解壓源碼壓縮包到BUILD目錄
%install #安裝字段
python setup.py install #調用源碼中安裝執行腳本
%files #文件說明字段,聲明多餘或者缺乏都將可能出錯
%defattr(-,root,root,-) #聲明並設置文件屬性
%doc README.txt #聲明解壓後目錄中的README.txt 文件將出如今rpm軟件包中
4、 構建RPM包
1.完成spec文件的編寫,將源碼包setuptools.1.0.0.zip(根據spec文件縮寫,此處爲.zip源碼包)放置到~/rpmbuild/SOURCES目錄下。
接下來咱們就執行構建rpm包命令:
#cd ~/rpmbuild/SPECS #spec文件所在目錄
#rpmbuild –ba setuptools.spec #-ba表示build all
配置spec文件沒錯的話,這個步驟很順利就完成,而後可在~/rpmbuild/RPMS目錄下看到咱們打出的rpm包。
執行安裝此rpm包:
#rpm -ivh setuptools-8.0.4-1.el6.x86_64.rpm
error: Failed dependencies:
pysvn = 1.6.2-3.el5 is needed by setuptools-8.0.4-1.el6.x86_64
這個說明是有依賴的軟件,須要先安裝所依賴軟件。
5、 遇到的問題
1.配置了依賴的軟件和版本,而且已經放置被依賴軟件正確版本到yum庫,可是一直都是找不到對應的依賴版本軟件,報錯以下:
--> Running transaction check
---> Package setuptools.x86_64 0:8.0.4-1.el6 will be installed
--> Processing Dependency: pysvn=1.7.6-1 for package: setuptools-8.0.4-1.el6.x86_64
--> Finished Dependency Resolution
Error: Package: setuptools-8.0.4-1.el6.x86_64 (base)
Requires: pysvn=1.7.6-1
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles –nodigest
經查看並驗證,此處問題出如今spec文件的:Requires:pysvn=1.7.6-1
此處‘=’兩邊必須有空格,不然識別爲一個軟件的名稱,非軟件名稱及版本。
軟件的版本要寫全面而且是和yum庫裏的軟件版本一直,不然就報找不到該依賴的版本。
Resolving Dependencies
--> Running transaction check
---> Package setuptools.x86_64 0:8.0.4-1.el6 will be installed
--> Processing Dependency: pysvn = 1.7 for package: setuptools-8.0.4-1.el6.x86_64
--> Finished Dependency Resolution
Error: Package: setuptools-8.0.4-1.el6.x86_64 (base)
Requires: pysvn = 1.7
Available: pysvn-1.6.2-3.el5.x86_64 (base)
pysvn = 1.6.2-3.el5
Available: pysvn-1.7.6-1.el6.x86_64 (base)
pysvn = 1.7.6-1.el6
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
2.打包完成以後經過rpm –qlp XXXX.rpm查看軟件中的文件結果以下:
#rpm -qlp hellorpm-1.0.0-1.el6.x86_64.rpm
(contains no files)
一直覺得是本身打包失敗呢,這個如果在spec文件中%files下沒有指定要放在包中的文件,就不會顯示文件。如上setuptools.spec中聲明瞭README.txt,結果以下:
#rpm -qlp setuptools-8.0.4-1.el6.x86_64.rpm
usr/share/doc/setuptools-8.0.4
/usr/share/doc/setuptools-8.0.4/README.txt
web
6、 spec文件字段詳解
Group:
軟件分組,建議使用標準分組,軟件包所屬類別,具體類別有:
Amusements/Games (娛樂/遊戲)
Amusements/Graphics(娛樂/圖形)
Applications/Archiving (應用/文檔)
Applications/Communications(應用/通信)
Applications/Databases (應用/數據庫)
Applications/Editors (應用/編輯器)
Applications/Emulators (應用/仿真器)
Applications/Engineering (應用/工程)
Applications/File (應用/文件)
Applications/Internet (應用/因特網)
Applications/Multimedia(應用/多媒體)
Applications/Productivity (應用/產品)
Applications/Publishing(應用/印刷)
Applications/System(應用/系統)
Applications/Text (應用/文本)
Development/Debuggers (開發/調試器)
Development/Languages (開發/語言)
Development/Libraries (開發/函數庫)
Development/System (開發/系統)
Development/Tools (開發/工具)
Documentation (文檔)
System Environment/Base(系統環境/基礎)
System Environment/Daemons (系統環境/守護)
System Environment/Kernel (系統環境/內核)
System Environment/Libraries (系統環境/函數庫)
System Environment/Shells (系統環境/接口)
User Interface/Desktops(用戶界面/桌面)
User Interface/X (用戶界面/X窗口)
User Interface/X Hardware Support (用戶界面/X硬件支持)
License:
軟件受權方式,一般就是GPL
Source:
源代碼包,能夠帶多個用Source一、Source2等源,後面也能夠用%{source1}、%{source2}引用。
NoSource:0 #第一個源碼不包含在包中
Patch:
補丁源碼,可以使用Patch一、Patch2等標識多個補丁,使用%patch0或%{patch0}引用,
補丁 ID 規則
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等都是針對不一樣階段的依賴指定。
※注意區分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指開頭定義的BuildRoot,而$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 變動日誌數據庫