有時候爲了部署本身的包更方便一些,咱們會製做本身的RPM包,製做RPM包都有哪些步驟呢,學習這些步驟就是本文的目的。在Centos下製做RPM包依賴rpm-build這個包,因此須要提早安裝好該軟件包。 node
RPM生成要素 python
在redhat下,rpm包的默認製做路徑在/usr/src/redhat下: 數據庫
/usr/src/redhat --BUILD #編譯以前,如解壓包後存放的路徑 --BUILDROOT #編譯後存放的路徑 --RPMS #打包完成後rpm包存放的路徑 --SOURCES #源包所放置的路徑 --SPECS #spec文檔放置的路徑 --SPRMS #源碼rpm包放置的路徑centos並無該目錄,這可咋辦,其實在那個目錄製做rpm是沒有關係的,只要設置好配置文件就行。通常咱們都把源碼打包成tar.gz格式而後存放於SOURCES路徑下,而在SPECS路徑下編寫spec文檔,經過命令打包後,默認會把打包後的rpm包放在RPMS下,而源碼包會被放置在SRPMS下。
先看看rpmbuild命令的用法: centos
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 #對應-bs3 從源碼包創建
--rebuild #創建二進制包,通-bb --recompile #同-bi* rpmbuild的其餘參數
--buildroot=DIRECTORY #肯定以root目錄創建包 --clean #完成打包後清除BUILD下的文件目錄 --nobuild #不進行%build的階段 --nodeps #不檢查創建包時的關聯文件 --nodirtokens --rmsource #完成打包後清除SOURCES --rmspec #完成打包後清除SPEC --short-cricuit --target=CPU-VENDOR-OS #肯定包的最終使用平臺
再來看看spec文件編寫規則 ide
1 spec的關鍵字 函數
Name:用來定義軟件包的名稱,後面可使用%{name}的方式引用,不能包含空格,且必須惟一 Summary: 軟件包的內容概要,只能用一句話來歸納 Version: 軟件的實際版本號,具體命令需跟源包一致,後面可使用%{version}使用,不容許出現連字符'-',會被認爲非法字符 Release: 發佈序列號,具體命令需跟源包一致,後面可使用%{release}使用,通常是一個整數,也是rpm包版本信息的一部分 License: 軟件受權方式,一般就是GPL Source: 源代碼包,能夠帶多個用Source一、Source2等源,後面也能夠用%{source1}、%{source2}引用 buildroot在rpmbuild在製做rpm包的時候,會把編譯生成的二進制文件和庫文件先安裝到一個臨時目錄,而後再結合spec文件從這個臨時目錄中提取文件 ,壓縮生成rpm文件,這個臨時目錄就是buildroot所標示的目錄 BuildRoot: 這個是安裝或編譯時使用的「虛擬目錄」,考慮到多用戶的環境,通常定義爲:%{_tmppath}/%{name}-%{version}-%{release}-root 該參數很是重要,由於在生成rpm的過程當中,執行make install時就會把軟件安裝到上述的路徑中,在打包的時候,一樣依賴「虛擬目錄」爲「根目錄」進行操做。後面可以使用$RPM_BUILD_ROOT 方式引用。 URL: 軟件的主頁 Vendor: 發行商或打包組織的信息,例如RedFlag Co,Ltd Disstribution: 發行版標識 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硬件支持) ---------------------------------------------------- Patch: 補丁源碼,可以使用Patch一、Patch2等標識多個補丁,使用%patch0或%{patch0}引用 prefix主要用於定義可從新定義安裝位置的包,也就是在安裝時能夠經過--prefix來定義包的安裝路徑 Prefix: %{_prefix} 這個主要是爲了解決從此安裝rpm包時,並不必定把軟件安裝到rpm中打包的目錄的狀況。這樣,必須在這裏定義該標識,並在編寫%install腳本的時候引用,才能實現rpm安裝時從新指定位置的功能 Prefix: %{_sysconfdir} 這個緣由和上面的同樣,但因爲%{_prefix}指/usr,而對於其餘的文件,例如/etc下的配置文件,則須要用%{_sysconfdir}標識 Requires: 該rpm包所依賴的軟件包名稱,能夠用>=或<=表示大於或小於某一特定版本,「>=」號兩邊需用空格隔開,而不一樣軟件名稱也用空格分開 Conflicts: 該包與哪些軟件包衝突 Provides: 該包提供了什麼,一般是包名或者虛擬包名 Packager: 打包者的信息,能夠是名字或者郵件地址 %dscription 軟件的詳細說明,描述信息能夠有多行,若是提供的描述信息是以空格開始的,則該信息單獨顯示在一行,若是信息前沒有空格,則認爲描述信息是一個段落2 spec的主體,主體中也包括了不少關鍵字和描述
%prep 預處理腳本, %setup -n %{name}-%{version} 把源碼包解壓並放好 注:可根據你的源碼的名字格式,來確認解壓後名字的格式,不然可能致使install的時候找不到對應的目錄 ◎補充一下 %setup 不加任何選項,僅將軟件包打開。 %setup -n newdir 將軟件包解壓在newdir目錄。 %setup -c 解壓縮以前先產生目錄。 %setup -b num 將第num個source文件解壓縮。 %setup -T 不使用default的解壓縮操做。 %setup -T -b 0 將第0個源代碼文件解壓縮。 %setup -q 指不顯示輸出(quietly) %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 %clean 清理臨時文件 一般內容爲: [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT" ※注意區分$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外的全部文件。 %deffattr (-,root,root) 指定包裝文件的屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執行文件是0755 %exclude 列出不想打包到rpm中的文件 ※當心,若是%exclude指定的文件不存在,也會出錯的。 %changelog 變動日誌3 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/var
其實以上參數值都是在/usr/lib/rpm/macros文件中定義的,筆者在第一次製做rpm包時直接修改的該文件的值,其實最好不要修改該文件的值,只須要在家目錄定義本身須要的值便可。 工具
下一篇開始實戰,go... post