RPMBUILD

1 安裝軟件

Yum install rpm-build -y

2 瞭解結構

drwxr-xr-x.3root root  27Jul2815:06BUILD

drwxr-xr-x.2root root   6Jul2810:38BUILDROOT

drwxr-xr-x.2root root   6Jul2810:38RPMS

drwxr-xr-x.2root root8192Sep1113:28SOURCES

drwxr-xr-x.2root root  91Sep1113:28SPECS

drwxr-xr-x.2root root   6Jul2810:38SRPMS

3 src.rpm包組成


.tar.gz源碼(可以是別的類型)

.patch補丁軟件

spec腳本

4 執行編譯工作

Rpmbuild –ba *.spec

2.3 配置文件

Spec腳本文件是rpm包組成的重要文件,其配置如下圖所示:


<b>Name:</b>軟件包的名稱,後面可使用%{name}的方式引用


<b>Summary:</b>軟件包的內容概要

<b>Version:</b>軟件的實際版本號,例如:1.0.1等,後面可使用%{version}引用

<b>Release:</b>發佈序列號,例如:1linuxing等,標明第幾次打包,後面可使用%{release}引用

<b>Group:</b>軟件分組,建議使用標準分組

<b>License:</b>軟件授權方式,通常就是GPL

<b>Source:</b>源代碼包,可以帶多個用Source1、Source2等源,後面也可以用%{source1}、%{source2}引用

<b>BuildRoot:</b>這個是安裝或編譯時使用的“虛擬目錄”,考慮到多用戶的環境,一般定義爲:%{_tmppath}/%{name}-%{version}-%release}-root

或%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u}-n}

該參數非常重要,因爲在生成rpm的過程中,執行make install時就會把軟件安裝到上述的路徑中,在打包的時候,同樣依賴“虛擬目錄”爲“根目錄”進行操作。後面可使用$RPM_BUILD_ROOT方式引用。

 

URL:軟件的主頁

<b>Vendor:</b>發行商或打包組織的信息,例如SELINUXPLUS.COM Cloud

<b>Disstribution:</b>發行版標識

<b>Patch:</b>補丁源碼,可使用Patch1、Patch2等標識多個補丁,使用%patch0或%{patch0}引用

P<b>refix:</b>%{_prefix}這個主要是爲了解決今後安裝rpm包時,並不一定把軟件安裝到rpm中打包的目錄的情況。這樣,必須在這裏定義該標識,並在編寫%install腳本的時候引用,才能實現rpm安裝時重新指定位置的功能

Prefix:%{_sysconfdir}這個原因和上面的一樣,但由於%{_prefix}指/usr,而對於其他的文件,例如/etc下的配置文件,則需要用%{_sysconfdir}標識

<b>Build Arch:</b>指編譯的目標處理器架構,noarch標識不指定,但通常都是以/usr/lib/rpm/marcros中的內容爲默認值

<b>Requires:</b>該rpm包所依賴的軟件包名稱,可以用&gt;=或&lt;=表示大於或小於某一特定版本,例如:libpng-devel&gt;=1.0.20zlib

“&gt;=”號兩邊需用空格隔開,而不同軟件名稱也用空格分開

還有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、<b>BuildRequires</b>等都是針對不同階段的依賴指定

<b>Provides:</b>指明本軟件一些特定的功能,以便其他rpm識別

<b>Packager:</b>打包者的信息

<b>%description</b>軟件的詳細說明

spec腳本主體

spec腳本的主體中也包括了很多關鍵字和描述,下面會一一列舉。我會把一些特別需要留意的地方標註出來。

%prep預處理腳本

 

%setup-n%{name}-%{version}把源碼包解壓並放好

 

通常是從SOURCES裏的包解壓到/BUILD/%{name}-%{version}中。

一般用%setup-c就可以了,但有兩種情況:一就是同時編譯多個源碼包,二就是源碼的tar包的名稱與解壓出來的目錄不一致,此時,就需要使用-n參數指定一下了。

%patch打補丁

 

通常補丁都會一起在源碼tar.gz包中,或放到SOURCES目錄下。一般參數爲:

%patch-p1使用前面定義的Patch補丁進行,-p1是忽略patch的第一層目錄

 

%Patch2-p1-bxxx.patch打上指定的補丁,-b是指生成備份文件

 

&nbsp;

引用

%setup不加任何選項,僅將軟件包打開。

 

%setup-nnewdir將軟件包解壓在newdir目錄。

 

%setup-c解壓縮之前先產生目錄。

 

%setup-bnum將第num個source文件解壓縮。

 

%setup-T不使用default的解壓縮操作。

 

%setup-T-b0將第0個源代碼文件解壓縮。

 

%setup-c-nnewdir指定目錄名稱newdir,並在此目錄產生rpm套件。

 

%patch最簡單的補丁方式,自動指定patchlevel。

 

%patch0使用第0個補丁文件,相當於%patch?p0。

 

%patch-s不顯示打補丁時的信息。

 

%patch-T將所有打補丁時產生的輸出文件刪除。

 

&nbsp;

%configure這個不是關鍵字,而是rpm定義的標準宏命令。意思是執行源代碼的configure配置

 

在BUILD/%{name}-%{version}目錄中進行,使用標準寫法,會引用/usr/lib/rpm/marcros中定義的參數。

另一種不標準的寫法是,可參考源碼中的參數自定義,例如:

引用

CFLAGS="$RPM_OPT_FLAGS"CXXFLAGS="$RPM_OPT_FLAGS"./configure--prefix=%{_prefix}

%build開始構建包

 

在BUILD/%{name}-%{version}目錄中進行make的工作,常見寫法:

引用

make%{?_smp_mflags}OPTIMIZE="%{optflags}"

都是一些優化參數,定義在/usr/lib/rpm/marcros中

%install開始把軟件安裝到虛擬的根目錄中

 

在BUILD/%{name}-%{version}目錄中進行makeinstall的操作。這個很重要,因爲如果這裏的路徑不對的話,則下面%file中尋找文件的時候就會失敗。常見內容有:

%makeinstall這不是關鍵字,而是rpm定義的標準宏命令。也可以使用非標準寫法:引用makeDESTDIR=$RPM_BUILD_ROOTinstall

 

或引用make prefix=$RPM_BUILD_ROOTinstall

需要說明的是,這裏的%install主要就是爲了後面的%file服務的。所以,還可以使用常規的系統命令:

引用

install-d$RPM_BUILD_ROOT/

cp-a*$RPM_BUILD_ROOT/

%clean清理臨時文件

 

通常內容爲:

引用["$RPM_BUILD_ROOT"!="/"]&amp;&amp;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/asianux/BUILD,其中,前面的纔是%file需要的。

%prerpm安裝前執行的腳本

 

%postrpm安裝後執行的腳本

 

%preunrpm卸載前執行的腳本

 

%postunrpm卸載後執行的腳本

 

%preun%postun的區別是什麼呢?

 

前者在升級的時候會執行,後者在升級rpm包的時候不會執行

%files定義那些文件或目錄會放入rpm中

 

這裏會在虛擬根目錄下進行,千萬不要寫絕對路徑,而應用宏或變量表示相對路徑。如果描述爲目錄,表示目錄中除%exclude外的所有文件。

%defattr(-,root,root)指定包裝文件的屬性,分別是(mode,owner,group),-表示默認值,對文本文件是0644,可執行文件是0755

 

%exclude列出不想打包到rpm中的文件。如果%exclude指定的文件不存在,也會出錯的。

 

%changelog變更日誌(注意時間格式)


查看marcros宏:


[root@localhost~]# cat /etc/rpm/macros.dist

# dist macros.

%rhel7

 %dist.el7.Selinuxplus.com#發行標記

 %el71

2.4 工程調試

工程調試運行時,可以在用戶指定的環境目錄下執行,如只需要構建src rpm包:


rpmbuild--nodeps--define"%_topdir `pwd`"-bs SPECS/xxxx.spec

orrpmbuild -bs *.spec文件

如果需要構建rpm的二進制代碼和源碼

rpmbuild--nodeps--define"%_topdir `pwd`"-ba SPECS/xxxx.spec

orrpmbuild-ba *.spec文件

2.5 其他事項

1、rpm包構建不建議在root環境下構建。

2、注意構建所需要的依賴關係


Yum install $(grep ^BuildRequires:  *.spec|awk '{print $2}')


3、注意rpm編譯過程的錯誤,前期主要是依賴關係,後期過程可能是一些測試錯誤,注意分析錯誤問題,讓編譯進行下去。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章