RPM打包對於應用程序是十分有用的,可以下載,可以卸載,可以升級,可打補丁,可用於軟件的發布和管理,以及以後可能的軟件store。如果我們使用MIC2,更換kenrel,如果需要制作的usbimg通過安裝方式能夠成功啟動,我們必須對我們自己新的kernel進行打包。
我們通過一個簡單的hello world例子來打一個名字為hello的rpm包。 我收集了網上的資料,結合自己的實驗給出下面的內容。有很多的信息來自共產主義的網絡。RPM全稱是 Red Hat Package Manager(Red Hat包管理器)。幾乎所有的 Linux 發行版本都使用這種形式的軟件包管理安裝、更新和卸載軟件。RPM有五種基本的操作功能(不包括創建軟件包):安裝、卸載、升級、查詢、和驗證。
/** hello.c */
#include
int main(){
printf("Hello, world! version 1.0.0\n");
}
這個是最簡單的例子,放置在目錄hello-1.0.0/的下面,在這個目錄下面,有一個可執行的configure文件和Makefile文件。注意,configure的權限必須是可執行的,否則在打包的過程中會報錯。這麼簡單的程序,我們也沒有什麼特別需要配置的。如下:
echo "hello, This is configure file, do noting."
Makefile程序如下,屬於常規寫法 ,唯一需要注意的是我們增加了一個DESTDIR的參數,這個與後面打包的相關:
CC = gcc
CFLAGS =
INCLUDE =
OBJECTS = hello.o
TARGET = hello
DESTDIR =
all: $(TARGET)
hello.o:
$(CC) -c hello.c
$(TARGET): $(OBJECTS)
$(CC) -o hello $(OBJECTS)
install:
cp $(TARGET) $(DESTDIR)/usr/local/bin/$(TARGET)
rm: clean
clean:
rm -f *.o
rm $(TARGET) /usr/local/bin/$(TARGET)
接著我們將目錄進行tar,得到hello-1.0.0.tar.gz。如果我們得到一個tar.gz的源代碼,通常處理就是一、解壓;二、configure;三、make,四、make install。我們的例子中具備了這些步驟,雖然configure我們並沒有任何實際的動作,只是走了形式。
在當前用戶目錄~下面建立rpmbuild,例如/home/wei/rpmbuild,rpmbuild有五個子目錄,我們可以先建立SOURCES和SPECS,其他的三個目錄在打包的過程中可以自動生成。將hello-1.0.0.tar.gz放置在SOURCES目錄下面,在SPECS目錄下面寫我們的spec文件,這是打包的關鍵,這個文件是構造我們rpm包的腳本文件。
#################### 文件頭 #####################
Summary : GNU hello test for rpm building //這是對軟件包的描述
Name : hello //這是軟件包的名稱, 最終RPM軟件包是用該名字與版本號,釋出號及體系號來命名軟件包的
Version : 1.0.0 //這是軟件包的版本
Release : 1 //這是RPM的版本號,如果修復了spec文件中內容重新發布該rpm,應該增加發行版號
Source0 : %{name}-%{version}.tar.gz //源程序軟件包的名字,這裡是源文件的壓縮包,即hello-1.0.0.tar.gz,如果有多個,可以有Source0,Source1
License : GPL //軟件包所采用的版權規則。具體有:GPL(自由軟件),BSD,MIT,Public Domain(公共域),Distributable(貢獻),commercial(商業),Share(共享)等
Group : Development/Tools //表示軟件類型, 幫助其他人在管理RPM程序中按照組來列出RPM
Vendor : WEI //軟件開發者的名字
%description //這是對軟件包的描述,這個以及上面的信息,在安裝rpm後,可以通過rpm –qi hello中獲得
The GNU hello little program is used to test how to building a simple
rpm, just for study.
#################### %prep段 #####################
#從這裡開始就是嵌入spec的shell文本。這個段是預處理段,通常用來執行一些解開源程序包的命令,為下一步的編譯安裝作准備。%prep負責對軟件包解包。在最常見情況下,您只要用 %setup 宏即可,它會做適當的事情,在構建目錄下解包源 tar 文件。加上 -q 項只是為了減少輸出。將會在~/rpmbuild/BUILD目錄下面解開壓縮包
#對於打補丁的部分也放置在這裡
%prep
%setup -q
#################### %build段 #####################
#本段是建立段,所要執行的命令為生成軟件包服務,如make 命令。編譯該軟件包。該 shell 腳本從軟件包的子目錄下運行,在我們的例子中,將會在~/rpmbuild/BUILD/hello-1.0.0/下面執行。和通常的編譯一樣,我們執行./configure文件,以及進行make。這裡給出編譯過程中執行的步驟。如果編譯kernel,我們可能會寫上make bzImage等等。
%build
./configure
make
#################### %install段 #####################
#在構建系統上安裝軟件包。為了最後能封裝成rpm,我們需要將所需封裝的文件及其安裝的目錄放置在$RPM_BUILD_ROOT(即~/rpmbuild/BUILDROOT/hello-1.0.0-1.i386)下面。例如我們需要將編譯後的可執行文件hello最終方式在/usr/local/bin下面,那麼我們需要將hello拷貝到~rpmbuild/BUILDROOT/hello-1.0.0-1.i386/usr/local/bin/hello。
%install
install -d $RPM_BUILD_ROOT/usr/local/bin
make install DESTDIR=$RPM_BUILD_ROOT
#################### %clean段 #####################
#刪除臨時文件,在最後執行
%clean
rm –rf $RPM_BUILD_ROOT
#################### %file段 #####################
# 文件段,用於定義軟件包所包含的文件,分為三類--說明文檔(doc),配置文件(config)及執行程序,還可定義文件存取權限,擁有者及組別。
#列出應該捆綁到 RPM 中的文件,並能夠可選地設置許可權和其它信息。可以使用 一次 %defattr 來定義缺省的許可權、所有者和組;在這個示例中, %defattr(-,root,root) 會安裝 root 用戶擁有的所有文件,使用當 RPM 從構建系統捆綁它們時它們所具有的任何許可權。可以用 %attr(permissions,user,group) 覆蓋個別文件的所有者和許可權。可以在 %files 中用一行包括多個文件
#可以通過在行中添加 %doc 或 %config 來標記文件。 %doc 告訴 RPM 這是一個文檔文件,因此如果用戶安裝軟件包時使用 --excludedocs ,將不安裝該文件。您也可以在 %doc 下不帶路徑列出文件名,RPM 會在構建目錄下查找這些文件並在 RPM 文件中包括它們,並把它們安裝到 /usr/share/doc/%{name}-%{version} 。以 %doc 的形式包括 README 和 ChangeLog 這樣的文件是個好主意。
#%config 告訴 RPM 這是一個配置文件。在升級時,RPM 將會試圖避免用 RPM 打包的缺省配置文件覆蓋用戶仔細修改過的配置。
%files
%defattr(-,root,root)
/usr/local/bin/hello
#%doc /usr/local/info/hello.info
#%doc %attr(0444,root,root) /usr/local/man/man1/hello.1
#%doc COPYING AUTHORS README NEWS
#################### %changelog段 #####################
#修改日志段。你可以將軟件的每次修改記錄到這裡,保存到發布的軟件包中,以便查詢之用。每一個修改日志都有這樣一種格式:第一行是:* 星期 月 日 年 修改人電子信箱。其中:星期、月份均用英文形式的前3個字母,用中文會報錯。接下來的行寫的是修改了什麼地方,可寫多行。一般以減號開始,便於後續的查閱。這個例子中我們不需要這個部分。 如果是發布下一個版本可以加上如下的內容。
* Mon Jul 6 2009 Name –1.0.1-1
- modified …… 可以多行,表面增加或者修改的地方
此外,在開始部分,通過BuildRequires:列出軟件編譯必須依賴的軟件包,如果有人用你的src.rpm自己編譯,會提示他需要安裝這些包才能編譯。通過Requires:是軟件運行時依賴的軟件包,這個非常重要,因為倉庫安裝要依賴它來同時安裝其他依賴的軟件包(雖然rpm有自動依賴關系判定,但不能100%保險)。
除了上面這些部分外,還有%pre(在安裝包之前運行), %post(在安裝包之後運行), %preun(在卸載包之前運行), %postun(在卸載包之後運行)。例如我們可以在%post中加上某些鏈接的文件。
在這個例子中,我們在make install中增加了輔助參數DESTDIR,我曾考慮過在configure的配置來進行,但是IBM工程師的文檔建議:請注意不 要使用./configure --prefix=$RPM_BUILD_ROOT 。這會在假設整個軟件包文件的最終位置是構建根的情況下安裝整個軟件包。這可能沒有關系,但任何需要在運行時找到其安裝文件的程序都將失敗,因為當 RPM 最終安裝到用戶系統後,這些文件就不再位於構建根之下 ― 那只是您構建系統上的一個臨時目錄。
之後我們執行:rpmbuild –ba hello.spec,我們將在~/rpmbuild/RPMS得到:hello-1.0.0-1.i386.rpm和hello-debuginfo-1.0.0-1.i386.rpm, 在~rpmbuild/SPRMS中得到hello-1.0.0-1.src.rpm。
如果我們只想得到二進制的rpm包,使用rpmbuild -bb,我們在RPMS中得到hello-1.0.0-1.i386.rpm,如果只想得到源代碼包,使用rpmbuild –bs,我們在SRPMS中得到hello-1.0.0-1.src.rpm。如果只需要生成源文件,使用rpmbuild -bp,我們將在BUILD目錄下面得到打好補丁的source code。
我們運行rpmbuild –ivh hello-1.0.0-1.i386就可以安裝hello rpm包。
有一篇很好的參考文檔:
http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part1/
http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part2/
http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part3/
附:在fc10中,我們直接通過vi hello.spec,已經有相關的模板在裡面。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/flowingflying/archive/2009/07/07/4324774.aspx