一. rpmbuild介紹
顧名思義建立rpm包,它是用來指示轉換的源碼不定編譯成二進制文件的包,在centos下默認目錄爲/usr/src/redhat
二.目錄
/usr/src/redhat
--BUILD #編譯以前,如解壓包後存放的路徑
--BUILDROOT #編譯後存放的路徑
--RPMS #打包完成後rpm包存放的路徑
--SOURCES #源包所放置的路徑
--SPECS #spec文檔放置的路徑
--SPRMS #源碼rpm包放置的路徑
注:通常咱們都把源碼打包成tar.gz格式而後存放於SOURCES路徑下,而在SPECS路徑下編寫spec文檔,經過命令打包後,默認會把打包後的rpm包放在RPMS下,而源碼包會被放置在SRPMS下
三. rpmbuild相關命令
基本格式:rpmbuild [options] [spec文檔|tarball包|源碼包]
1. 從spec文檔創建有如下選項:
-bp #只執行spec的%pre 段(解開源碼包並打補丁,即只作準備)
-bc #執行spec的%pre和%build 段(準備並編譯)
-bi #執行spec中%pre,%build與%install(準備,編譯並安裝)
-bl #檢查spec中的%file段(查看文件是否齊全)
-ba #創建源碼與二進制包(經常使用)
-bb #只創建二進制包(經常使用)
-bs #只創建源碼包
2. 從tarball包創建,與spec相似
-tp #對應-bp
-tc #對應-bc
-ti #對應-bi
-ta #對應-ba
-tb #對應-bb
-ts #對應-bs
3. 從源碼包創建
--rebuild #創建二進制包,通-bb
--recompile #同-bi
4. 其餘的一些選項
--buildroot=DIRECTORY #肯定以root目錄創建包
--clean #完成打包後清除BUILD下的文件目錄
--nobuild #不進行%build的階段
--nodeps #不檢查創建包時的關聯文件
--nodirtokens
--rmsource #完成打包後清除SOURCES
--rmspec #完成打包後清除SPEC
--short-cricuit
--target=CPU-VENDOR-OS #肯定包的最終使用平臺
四. spec文檔的編寫
Name: 軟件包的名稱,後面可以使用%{name}的方式引用,具體命令需跟源包一致
Summary: 軟件包的內容概要
Version: 軟件的實際版本號,具體命令需跟源包一致
Release: 發佈序列號,具體命令需跟源包一致
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}引用
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: 補丁源碼,可以使用Patch一、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: 打包者的信息
scription 軟件的詳細說明
#spec腳本主體
spec腳本的主體中也包括了不少關鍵字和描述,下面會一一列舉。我會把一些特別須要留意的地方標註出來。
%prep 預處理腳本
%setup -n %{name}-%{version} 把源碼包解壓並放好
注:可根據你的源碼的名字格式,來確認解壓後名字的格式,不然可能致使install的時候找不到對應的目錄
一般是從/usr/src/redhat/SOURCES裏的包解壓到/usr/src/redhat/BUILD/%{name}-%{version}中。
通常用%setup -c就能夠了,但有兩種狀況:一就是同時編譯多個源碼包,二就是源碼的tar包的名稱與解壓出來的目錄不一致,此時,就須要使用-n參數指定一下了。
%patch 打補丁
一般補丁都會一塊兒在源碼tar.gz包中,或放到SOURCES目錄下。通常參數爲:
%patch -p1 使用前面定義的Patch補丁進行,-p1是忽略patch的第一層目錄
%Patch2 -p1 -b xxx.patch 打上指定的補丁,-b是指生成備份文件
◎補充一下
%setup 不加任何選項,僅將軟件包打開。
%setup -n newdir 將軟件包解壓在newdir目錄。
%setup -c 解壓縮以前先產生目錄。
%setup -b num 將第num個source文件解壓縮。
%setup -T 不使用default的解壓縮操做。
%setup -T -b 0 將第0個源代碼文件解壓縮。
%setup -c -n newdir 指定目錄名稱newdir,並在此目錄產生rpm套件。
%patch 最簡單的補丁方式,自動指定patch level。
%patch 0 使用第0個補丁文件,至關於%patch ?p 0。
%patch -s 不顯示打補丁時的信息。
%patch -T 將全部打補丁時產生的輸出文件刪除。
%build 開始構建包
在/usr/src/redhat/BUILD/%{name}-%{version}目錄中進行make的工做 ,常見寫法:
make %{?_smp_mflags} OPTIMIZE="%{optflags}"
都是一些優化參數,定義在/usr/lib/rpm/marcros中
%install 開始把軟件安裝到虛擬的根目錄中
在/usr/src/redhat/BUILD/%{name}-%{version}目錄中進行make install的操做。這個很重要,由於若是這裏的路徑不對的話,則下面%file中尋找文件的時候就會失敗。 常見內容有:
%makeinstall 這不是關鍵字,而是rpm定義的標準宏命令。也可使用非標準寫法:
make DESTDIR=$RPM_BUILD_ROOT install
或
make prefix=$RPM_BUILD_ROOT install
須要說明的是,這裏的%install主要就是爲了後面的%file服務的。因此,還可使用常規的系統命令:
install -d $RPM_BUILD_ROOT/ #創建目錄
cp -a * $RPM_BUILD_ROOT/
%clean 清理臨時文件
一般內容爲:
引用
[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
rm -rf $RPM_BUILD_DIR/%{name}-%{version}
※注意區分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:
$RPM_BUILD_ROOT是指開頭定義的BuildRoot,而$RPM_BUILD_DIR一般就是指/usr/src/redhat/BUILD,其中,前面的纔是%file須要的。
%pre rpm安裝前執行的腳本
%post rpm安裝後執行的腳本
%preun rpm卸載前執行的腳本
%postun rpm卸載後執行的腳本
%preun %postun 的區別是什麼呢?
前者在升級的時候會執行,後者在升級rpm包的時候不會執行
%files 定義那些文件或目錄會放入rpm中
這裏會在虛擬根目錄下進行,千萬不要寫絕對路徑,而應用宏或變量表示相對路徑。若是描述爲目錄,表示目錄中除%exclude外的全部文件。
fattr (-,root,root) 指定包裝文件的屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執行文件是0755
%exclude 列出不想打包到rpm中的文件
※當心,若是%exclude指定的文件不存在,也會出錯的。
%changelog 變動日誌
五. spec文檔中經常使用的幾個宏(變量)
1. RPM_BUILD_DIR: /usr/src/redhat/BUILD
2. RPM_BUILD_ROOT: /usr/src/redhat/BUILDROOT
3. %{_sysconfdir}: /etc
4. %{_sbindir}: /usr/sbin
5. %{_bindir}: /usr/bin
6. %{_datadir}: /usr/share
7. %{_mandir}: /usr/share/man
8. %{_libdir}: /usr/lib64
9. %{_prefix}: /usr
10. %{_localstatedir}: /usr/varnode