linux制做RPM包


制作rpm

1.制作流程

1.1 前期工作

       1)創建打包用的目錄rpmbuild/{BUILD,SPECS,RPMS, SOURCES,SRPMS}

              建議使用普通用戶,在用戶家目錄中創建

       2)確定好制作的對象,是源碼包編譯打包還只是一些庫文件打包

       3)編寫SPEC文件

       4)開始制作

  1.2 RPM制作過程

       1)讀取並解析 filename.spec 文件

2)運行 %prep 部分來將源代碼解包到一個臨時目錄,並應用所有的補丁程序。

3)運行 %build 部分來編譯代碼。

4)運行 %install 部分將代碼安裝到構建機器的目錄中。

5)讀取 %files 部分的文件列表,收集文件並創建二進制和源 RPM 文件。

6)運行 %clean 部分來除去臨時構建目錄。

補充說明:

       BUILD目錄:制作車間,二進制tar.gz包的解壓后存放的位置,並在此目錄進行編譯安裝

       SPECS目錄:存放SPEC文件

       RPMS目錄:存放制作好的rpm

       SOURCES目錄:存放源代碼

       SRPMS目錄:存放編譯好的二進制rpm

       BUILDROOT目錄:此目錄是在BUILD目錄中執行完make install之后生成的目錄,里面存放的是編譯安裝好的文件,他是./configure—prefix指定path的根目錄

1.3制作工具:rpmbuild

       制作過程的幾個狀態

       rpmbuild -bp   執行到%prep

       rpmbuild -bc   執行到%build中的config

       rpmbuild -bi         執行至%build中的install

       rpmbuild -ba    編譯后做成rpm包和src.rpm

rpmbuild -bs        僅制作src.rpm

rpmbuild -bb    僅制作rpm     

 

2.SPEC文件

2.1 spec文件參數:

自定義軟件包基本參數:

Name   軟件包名字

Version  軟件包版本

Release    軟件包修訂號

Summary  軟件包簡單描述

Group  軟件包所屬組。必須是系統定義好的組

License   軟件授權方式,通常就是GPL

Vendor  軟件包發型廠商

Packager   軟件包打包者

URL   軟件包的url

Source  定義打包所需的源碼包,可以定義多個,后面使用%{SOURCE}調用

Patch  定義補丁文件,后面可以使用%{Patch}調用

BuildRoot  定義打包時的工作目錄

BuildRequires  定義打包時依賴的軟件包

Requires  定義安裝時的依賴包,形式為Package name  或者 Package  >= version

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

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

%package 定義一個子包

%description  詳細描述信息

 

自定義打包參數;

%prep  預處理段,默認是解壓源碼包,可以自定義shell命令和調用RPM宏命令

%post rpm安裝后執行的命令,可以自定義shell命令和調用RPM宏命令

%preun rpm卸載前執行的命令,可以自定義shell命令和調用RPM宏命令

%postun rpm卸載后執行的命令,可以自定義shell命令和調用RPM宏命令

%patch  打補丁階段

%build  編譯安裝段,此段包含./configure make 安裝階段

%install 安裝階段,會把編譯好的二進制文件安裝到BUILDROOT為根的目錄下

%files  文件段,定義軟件打包時的文件,分為三類--說明文檔(doc),配置文件(config)及執行程序,還可定義文件存取權限,擁有者及組別。其路徑為相對路徑

%changelog  定義軟件包修改的日志

 

 

2.2補充:

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硬件支持)

 

%setup 的用法

       %setup 不加任何選項,僅僅打開源碼包

       %setup -n   newdir  將軟件包解壓至新目錄(重命名解壓的包),默認

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

%setup -b num 將第numsource文件解壓縮。

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

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

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

%setup -q  解壓不輸出信息

%Patch用法

       先使用Patch{n}定義補丁包,然后使用%patch{n}或者%{patch{n}}來調用打補丁

補丁號命名規則

              0-9 Makefileconfigure 等的補丁

10-39 指定功能或包含他的文件的補丁

40-59 配置文件的補丁

60-79 字體或字符補丁

80-99 通過 xgettexize 得到的目錄情況的補丁

100- 其他補丁

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

%patch 0 使用第0個補丁文件,相當於%patch -p 0

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

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

%patch  -b name 在打補丁之前,將源文件加入name,缺省為.org

 

%file用法

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

       %attr(600,work,work)  指定特定的文件目錄權限

fattr (-,root,root)

 

本段是文件段,用於定義構成軟件包的文件列表,那些文件或目錄會放入rpm中,分為三類-說明文檔(doc),配置文件(config)及執行程序,還可定義文件存取權限,擁有者及組別。

 

這里會在虛擬根目錄下進行,千萬不要寫絕對路徑,而應用宏或變量表示相對路徑。

※特別需要注意的是:%install部分使用的是絕對路徑,而%file部分使用則是相對路徑,雖然其描述的是同一個地方。千萬不要寫錯。

%files  -f %{name}.lang tui

file1 #文件中也可以包含通配符,如*

file2

directory #所有文件都放在directory目錄下

%dir /etc/xtoolwait #僅是一個空目錄/etc/xtoolwait打進包里

%doc  表示這是文檔文件,因此如安裝時使用--excludedocs將不安裝該文件,

%doc /usr/X11R6/man/man1/xtoolwait.* #安裝該文檔

%doc README NEWS #安裝這些文檔到/usr/share/doc/%{name}-%{version} 或者 /usr/doc或者

%docdir #定義說明文檔的目錄,例如/root,在這一語句后,所有以/root開頭的行都被定義為說明文件。

%config /etc/yp.conf #標志該文件是一個配置文件,升級過程中,RPM會有如下動作。

%config(missisgok) /etc/yp.conf 此配置文件可以丟失,即使丟失了,RPM在卸載軟件包時也不認為這是一個錯誤,並不報錯。一般用於那些軟件包安裝后建立的符號鏈接文件,

/etc/rc.d/rc5.d/S55named文件,此類文件在軟件包卸載后可能需要刪除,所以丟失了也不要緊。

%config(noreplace) /etc/yp.conf

#該配置文件不會覆蓋已存在文件(RPM包中文件會以.rpmnew存在於系統,卸載時系統中的該配置文件會以.rpmsave保存下來,如果沒有這個選項,安裝時RPM包中文件會以.rpmorig存在於系統 )

覆蓋已存在文件(沒被修改),創建新的文件加上擴展后綴.rpmnew(被修改)

%{_bindir}/*

%config  /etc/aa.conf

%ghost /etc/yp.conf #該文件不應該包含在包中,一般是日志文件,其文件屬性很重要,但是文件內容不重要,用了這個選項后,僅將其文件屬性加入包中。

%attr(mode, user, group) filename #控制文件的權限如%attr(0644,root,root) /etc/yp.conf

如果你不想指定值,可以用-

%config %attr(-,root,root) filename #設定文件類型和權限

fattr(-,root,root) #設置文件的默認權限,-表示默認值,對文本文件是0644,可執行文件是0755

%lang(en) %{_datadir}/locale/en/LC_MESSAGES/tcsh* #用特定的語言標志文件

%verify(owner group size) filename #只測試owner,group,size,默認測試所有

%verify(not owner) filename #不測試owner,測試其他的屬性

所有的認證如下:

group  認證文件的組

maj    認證文件的主設備號

md5    認證文件的MD5

min    認證文件的輔設備號

mode   認證文件的權限

mtime  認證文件最后修改時間

owner  認證文件的所有者

size   認證文件的大小

symlink:認證符號連接

如果描述為目錄,表示目錄中出%exclude外的所有文件。

%files

fattr(-,root,root)

%doc

%{_bindir}/*

%{_libdir}/liba*

%{_datadir}/file

%{_infodir}/*

%{_mandir}/man[15]/*

%{_includedir}

%exclude %{_libdir}/debug

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

如果把

%files

fattr(-,root,root)

%{_bindir}

寫成

%files

fattr(-,root,root)

/usr/bin

則打包的會是根目錄下的/usr/bin中所有的文件。

%files libs

fattr(-,root,root)

%{_libdir}/*so.*

%files devel

fattr(-,root,root)

%{_includedir}/*

 

install的用法

       -b:為每個已存在的目的地文件進行備份;

       -d:創建目錄,類似mkdir -p

-D:創建目的地前的所有目錄,然后將來源復制到目的地。復制文件

-g:自行設置所屬的組;

-m:自行設置權限,而不是默認的rwxr-xr-x

-o:自行設置所有者

-p:以來源文件的修改時間作為相應的目的地的文件屬性

%pre %post %pretun %postun 用法

rpm提供了一種信號機制:不同的操作會返回不同的信息,並放到默認變量$1

 

0代表卸載、1代表安裝、2代表升級

    if [“$1” = “0” ] ;then

       comond

fi

用於判斷rpm的動作

2.3 典型的spec文件案例:

 
 

3.技巧:
1)如果要避免生成debuginfo包:這個是默認會生成的rpm包。則可以使用下面的命令

       echo '%debug_package %{nil}' >> ~/.rpmmacros

2)配置 RPM 在構建時使用新的目錄結構,而不是默認的目錄結構:
 echo "%_topdir $HOME/rpmbuild" > ~/.rpmmacros

 

 

4.使用FPM制作RPM

1)安裝:

       yum -y install ruby rubygems ruby-devel   安裝ruby gem

       gem install fpm                             安裝fpm工具

 

2)准備編譯安裝好的源碼包

       /usr/local/libiconv

 

3)打包:

       fpm  -f -s dir  -t rpm -n beyond-libiconv --epoch=0 -v '1.14' -C /usr/local  --iteration 1.el6  ./libiconv-1.14

 

參數解釋

 

-f 強制輸出,如果文件已存在,將會覆蓋源文件

-s 指定源文件為目錄 dir

-t  指定制作的包類型(rpmdeb solaris etc

-n  指定制作的包名

-- epoch  指定時間戳

-v  指定軟件版本

-C  指定軟件安裝的目錄

--iteration  指定軟件的適用平台

./libiconv-1.14  本次打包的文件

 

 

附加參數:

-e  可以在打包之前編譯 spec文件

-d  指定依賴的軟件包 用法 –d ‘Package’   –d ‘Package > version’

--description 軟件包描述

-p 生成的package文件輸出位置

--url   說明軟件包的url

--post-install :軟件包安裝完成之后所要運行的腳本;和”--after-install 意思一樣

--pre-install :軟件包安裝完成之前所要運行的腳本;和”--before-install 意思一樣

--post-uninstall :軟件包卸載完成之后所要運行的腳本;和”--after-remove”意思一樣

--pre-uninstall:軟件包卸載完成之前所要運行的腳本;和”--before-remove”意思一樣

 

fpm打包php案例:

fpm   -f -s dir -t rpm -n beyond-php --epoch=0 -v '5.2.14' -C /usr/local/ -p ./ --iteration 1.el6  -d 'beyond-libiconv' -d 'beyond-libmcrypt' -d 'beyond-mcrypt' -d 'beyond-mhash' -d 'libxml2' -d 'libxml2-devel'  -d 'zlib' -d 'zlib-devel' -d 'libpng' -d 'libpng-devel' -d 'freetype' -d 'freetype-devel' -d 'autoconf' -d 'gd' -d 'gd-devel' -d 'libjpeg' -d 'libjpeg-devel'  -d 'curl' -d 'curl-devel' -d 'mysql-devel' -d 'openssl' -d 'openssl-devel' -d 'openldap-devel' -d 'libtool-ltdl' -d 'libtool-ltdl-devel' --url http://sa.beyond.com/source/php-5.2.14.tar.gz --license GPL  --post-install ./preinstall.sh   /usr/local/php






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM