閱讀704 返回首頁    go 技術社區[雲棲]


rpmbuild 文檔

創建 RPM
RPM 創建相當簡單, 你隻需要獲得軟件源碼就可以嚐試創建
創建 RPM 步驟通常分為:
 1. 獲得需要創建 RPM 的源碼
 2. 獲得對應補丁
 3. 創建 spec 文件
 4. 確保一切文件放置在合適位置
 5. 創建 RPM
通常操作, RPM 都會創建二進製與源碼包

spec 文件
我們會對 spec 文件進行討論, spec 文件用於創建軟件包, 用於描述如何創建軟件並定義編譯後, 定義二進
製文件安裝位置, 定義文件列表等信息

spec 文件需要按照標準格式進行命名,  packagename-version-release.spec 假如你具有一個軟件包的多個
版本, 確保你每個源碼都具有完整的 spec 文件

spec 文件命名規則例:  eject-2.0.2-1.spec


Summary: A program that ejects removable media using software control.
Name: sniffer
Version: 2.1.4.9
Release: 3
Copyright: GPL
Group: System Environment/Base
Source: https://xxx/xxxx/xxx/eject-2.1.4.9.tar.gz
Patch:
BuildRoot: $RPM_SOURCE_DIR

%description
The sniffer program use to ...

%prep
%setup -q

%build
make

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/man/man1

install -s -m 755 eject $RPM_BUILD_ROOT/usr/bin/eject
install -m 644 eject.1 $RPM_BUILD_ROOT/usr/man/man1/eject.1

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc README TODO COPYING ChangeLog

/usr/bin/eject
/usr/man/man1/eject.1

%changelog
* 2012-03-03  <xxx@xxx.com>
- auto rebuild in the new build environment (release 3)

 

spec 文件中, 具有下麵的一些語法標準, 你必須按照標準使用

Summary: 軟件包的描述, 隻能夠使用一行

Name: 打算編譯後的 RPM 軟件包命名

Version: 打算編譯後的 RPM 版本字符串

Release: 編譯後的 RPM 版本發行號

Copyright: 版權, 常見有 GPL, BSD, MIT, public domain, distributable, 或 commercial.

Group: 組工具(能夠被 YUM 調用)

Source: 通常定義軟件下載來源, 便於以後更新

Patch: 描述補丁下載來源, 便於以後更新

 注意: Patch, source 文件都需要存放到 SOURCE 目錄中才能夠被編譯時發現

Group: 參考 /usr/share/doc/rpm*/GROUPS 文件, 代表軟件屬於軟件庫中的那個組

BuildRoot: 定義軟件包編譯, 安裝的根目錄

%description 不屬於 header 部分, 用於綜合描述軟件功能, 你可以用於描述包信息, 允許使用多行信息

 


%prep 屬於 spec 第二部分, 用於定義打補丁, 配置並編譯源碼
有一點需要注意:
這個章節中會執行 shell 腳本, 你隻需要創建 sh 腳本, 並存放到 %prep 之後, 並調用 macro 宏編譯
第一個 macro 是 %setup, 用於解壓並進入到源碼目錄, 常見選項有

-n name 將會把 name 作為編譯目錄, 默認是 packagename-version 或者 {NAME}{VERSION}
-c 將會在解壓軟件後自動進入目錄
-b 隻用於在多個源碼文件時候, 直接解壓, 不進入目錄
-a 進入目錄後再解壓源碼
-T 假如這是第二個源碼則需要使用, 意味著覆蓋默認解壓源碼操作, 並需要 -b 0 或 -a 0 對主程序解壓
-D 在解壓後不刪除軟件包, 如果需要多次 %setup 配置時, 可以使用


第二個 macro 是 %patch 用於為源碼進行打補丁, 可以參數如下

不帶參數, 則直接應用該補丁
-p 定義目錄位置, 如 /u/howard/src/blurfl/blurfl.c 文件
 -p0 -> /u/howard/src/blurfl/blurfl.c
 -p1 -> u/howard/src/blurfl/blurfl.c
 -p4 -> blurfl/blurfl.c
-b 將會保留打補丁前文件為 filename.extension


假如上述宏定義正確, 你可以配置 sh 腳本, 腳本需要利用 %build 宏進行執行, 參考下麵例子


之前已經描述對軟件進行解壓, 打補丁, 並進入到源碼目錄
當前部分中不需要任何宏定義, 你隻需要定義有效腳本, 並由 sh 執行合法的命令(包括注釋)

你當前工作的目錄會在源碼的根目錄中,假如需要, 你可以 cd 到子目錄中

變量 RPM_OPT_FLAGS 調用 /usr/lib/rpm/rpmrc 變量, 用於定義機器架構, 該變量屬於可選變量


安裝
不需要使用任何宏定義, 你隻需要定義安裝時必須的命令, 可以對軟件包進行安裝, 或者對 makefile 打
補丁, 也可以調用 sh 腳本, 注意, 當前目錄為源碼根目錄

變量 RPM_BUILD_ROOT 由 header 部分中 Buildroot 進行定義, 推薦 使用 build root

清除係統
建議在生成軟件包後, 清除編譯目錄, %clean 宏能夠幫助你清除軟件, 隻需要利用命令清除編譯目錄就可以
注意: 不要把 RPM_BUILD_ROOT 設定為 /

可選地 pre 與 post 安裝與反安裝腳本
你可以利用 %pre %post 存放腳本, 並在 RPM 安裝前/後進行執行, 最常見的例子是在 RPM 安裝後執行
ldconfig 命令, 導入合適的共享庫, 下麵描述可用的宏

%pre 安裝前腳本

%post 安裝後腳本

%preun 執行 %pre 反安裝腳本

%postun 執行 %post 反安裝腳本

腳本需要使用 magic number 進行定義 #!/bin/sh.


文件
這個章節描述你必須列出二進製包文件, RPM 不知道 make install 時候需要安裝什麼文件
下麵宏能夠用於定義一些安裝信息

%doc 用於標記安裝二進製時候並發源碼包中的文檔, 文檔將會安裝到 /usr/share/doc/name-ver-release
目錄, 你可以利用 %doc 安裝多個文件

%config 用於標記軟件包配置文件, 包括例如 sendmail.cf, passwd 等,假如你反安裝軟件包並希望刪除
配置文件, 任何未改變過的文件都會被刪除, 而改變過的則重命名為 xx.rpmsave 文件, 可以利用宏定義
多個配置文件

%defattr 允許你定義文件默認屬性, 屬性定義為 (mode, owner, group) 如(644, oracle, dba)

%file -f <filename> 允許你列出源碼目錄中的任意文件, 例如你具有一個包, 那麼可以創建包的文件列表
你隻需要在這裏包含文件列表, 而不需要列出文件

Changelog
 當軟件包進行升級時的標記, 假如你修改一個存在的 RPM, 那麼建議你進行升級標記
 格式很簡單, 每行都需要以 * 然後跟隨一個日期, 你的姓名, EMAIL.
 建議使用下麵的方法定義時間

date +"%a %b %d %Y"

餘下部分是文字列, 沒有固定格式, 你可以用於整理一些相關信息

 

源碼樹目錄
第一件事, 你需要配置編譯源目錄, 你需要利用 /etc/rpmrc 文件,  但大部分人直接使用 /usr/src

你需要創建下麵的目錄用於編譯代碼

BUILD  目錄用於 RPM 編譯
SOURCES  用於存放源碼, 補丁, RPM 會自動從該目錄自動尋找
SPECS  存放 SPEC 文件
RPMS  二進製軟件編譯後存放位置
SRPMS  源碼 RPM 存放位置

 

 

編譯測試
可能需要幹淨的源碼編譯, 而不使用 RPM,  解壓源碼, 改變目錄命名為 $NAME.orig, 再次解壓源碼, 使用這個源碼進行
編譯, 進入到源碼並按照下麵步驟進行編譯, 假如你需要作出修改, 打補丁, 必須在編譯後清除源碼目錄, 確保以後其他
不需要的文件, 然後回到主目錄, 然後執行下麵信息創建自己的補丁

diff -uNr dirname.orig dirname > ../SOURCES/dirname-linux.patch


生成文件列表
現在源碼用於編譯, 並安裝, 查看安裝輸出, 然後創建文件列表到 spec 文件中,

 
利用軟件包生成 RPM
當完成 SPEC 文件後, 你可以嚐試創建軟件包, 利用下麵命令
rpm -ba foobar-1.0.spec


-b能夠與下麵參數進行配合使用
p 代表隻執行 spec 文件中 prep 部分
c 隻執行 prep 與編譯, 常用於你無法確保源碼是否能夠完整編譯,
i 執行 prep, compile, install
b prep, compile, install 隻創建一個二進製包
a 創建源碼與二進製包

 

最後更新:2017-04-02 22:16:31

  上一篇:go rpmbuild 使用筆記
  下一篇:go android中各種顏色在drawable.xml的值