spec文件寫作規範
spec文件寫作規範 2008-09-28 11:52:17
分類: LINUX
1.The RPM system assumes five RPM directories
BUILD:rpmbuild編譯軟件的目錄
RPMS:rpmbuild創建的binary RPM所存放的目錄
SOURCES:存放源代碼的目錄
SPEC:存放spec文件的目錄
SRPMS:rpmbuild創建的source RPM所存放的目錄
2.rpm內建的宏在文件/usr/lib/rpm/redhat/macros文件中有定義,這些宏基本上定義了目錄路徑或體系結構等等,rpm也包含了一組用於調試有問題的spec文件的宏,如下:
%dump:打印宏的值
%{echo:message} :打印信息到標準錯誤
%{error:message} :打印信息到標準錯誤,然後返回BADSPEC
%{expand:expression} :like eval, expands expression
%{F:file_exp} :擴展file_exp到一個文件名
%global name value :定義一個全局宏
%{P:patch_exp} :擴展patch_exp到一個補丁文件名
%{S:source_exp} :擴展source_exp到一個源碼文件名
%trace :跟蹤調試信息
%{uncompress:filename}
Tests if file filename is compressed. If so, uncompresses and includes
in the given context. If not compressed, calls cat to include file in given context.
%undefine macro :取消給定的宏定義
%{warn:message} :打印信息到標準錯誤
3.宏
%define macro_name value
然後可以用%macro_name或者%{macro_name}來調用,也可以擴展到shell,如
%define today %(date) (變量定義宏)
也可以傳遞參數給宏
%define macro_name(option) value
%foo 1 2 3 傳遞1,2,3三個參數給宏foo
在宏擴展的宏參數
%0:宏的名字
%*:傳遞給宏的所有參數
%#:傳遞給宏的參數個數
%1:第一個參數
%2:第二個參數,等等
%{-p}:Holds -p
%{-p*}:Holds the value passed with the -p parameter, if the -p parameter was passed to the macro;otherwise holds nothing
%{-p:text}:Holds text if the -p parameter was passed to the macr;otherwise holds nothing
%{?macro_to_text:expression}:如果macro_to_text存在,expand expression,如國不存在,則輸出為空;也可以逆著用,:%{!?macro_to_text:expression}
%{?macro}:忽略表達式只測試該macro是否存在,如果存在就用該宏的值,如果不存在,就不用,如:./configure %{?_with_ldap}
%if %{old_5x}
%define b5x 1
%undefine b6x
%endif
or
%if %{old_5x}
%define b5x 1
%undefine b6x
%else
%define b6x 1
%undefine b5x
%endif
還可以用!,&&等符號,如:
%if %{old_5x} && %{old_6x}
%{error: you cannot build for .5x and .6x at the same time}
%quit
%endif
%ifarch sparc alpha:判斷處理器的結構
%ifnoarch i386 alpha:跟%ifarch相反
%ifos linux:測試操作系統
%ifnos linux:跟%ifos相反
4.# This is a comment.
以#開頭的一行為註釋,如果在註釋裏加%會產生錯誤,如%prep,應該加上兩個%,即%%prep
5.spec文件的寫法:
Name: myapp #設置rpm包的名字
Version: 1.1.2 #設置rpm包的版本號
Release:1 #設置rpm包的修訂號
Group: System Environment/Shells #設置rpm包的分類,所有組列在文件/usr/share/doc/rpm-version/GROUP
Distribution: Red Hat Linux #列出這個包屬於那個發行版
Icon: file.xpm or file.gif #存儲在rpm包中的icon文件
Vendor: Company #指定這個rpm包所屬的公司或組織
URL: #公司或組織的主頁
Packager: sam shen <email> #rpm包制作者的名字和email
License: LGPL #包的許可證
Copyright: BSD #包的版權
Summary: something descripe the package #rpm包的簡要信息
ExcludeArch: sparc s390 #rpm包不能在該系統結構下創建
ExclusiveArch: i386 ia64 #rpm包只能在給定的系統結構下創建
Excludeos:windows #rpm包不能在該操作系統下創建
Exclusiveos: linux #rpm包只能在給定的操作系統下創建
Buildroot: /tmp/%{name}-%{version}-root #rpm包最終安裝的目錄
Source0: telnet-client.tar.gz
Source1: telnet-xinetd
Source2: telnet-wmconfig #源代碼文件,如果只有一個源碼目錄,可以只寫Source: telnet-client.tar.gz
NoSource:0 #第一個源碼不包含在包中
Patch1:telnet-client-cvs.patch
Patch2:telnetd-0.17.diff
Patch3:telnet-0.17-env.patch #補丁文件
NoPatch:0 #第一個補丁文件不包含在包中
Requires:packagename #該包需要給定的packagename包
Requires:bash>=2.0 #該包需要包bash,且版本至少為2.0,還有很多比較符號如<,>,<=,>=,=
Requires:perl(Carp)>=3.2 #requirement for the Carp add-on module for Perl
PreReq: capability >=version #capability包必須先安裝
Conflicts:bash>=2.0 #該包和所有不小於2.0的bash包有沖突
BuildRequires:
BuildPreReq:
BuildConflicts:
#這三個選項和上述三個類似,只是他們的依賴性關系在構建包時就要滿足,而前三者是在安裝包時要滿足
Autoreq: 0 #禁用自動依賴
Prefix: /usr
#定義一個relocatable的包,當安裝或更新包時,所有在/usr目錄下的包都可以映射到其他目錄,當定義Prefix時,所有%files標誌的文件都要在Prefix定義的目錄下
%triggerin --package < version
#當package包安裝或更新時,或本包安裝更新且package已經安裝時,運行script
...script...
%triggerun --package
#當package包刪除時,或本包刪除且package已經安裝時,運行script
...script...
%triggerpostun --package
#當package刪除時運行script,本包刪除時不運行
...script...
%triggerpostun -p /usr/bin/perl --vixie-cron <3.0.1-56
-p /usr/sh package < version
-n subpackage_name –vixie-cron <3.0.1-56
...script...
in trigger script,$1:the number of instances of your package that will
remain after operation has completed, $2:the number of instances of
the target package that will remain after the operation ,if $2 is 0, the
target package will be removed
%description: something #rpm包的描述
%prep #定義準備編譯的命令
%setup -c #在解壓之前創建子目錄
-q #在安靜模式下且最少輸出
-T #禁用自動化解壓包
-n name #設置子目錄名字為name
-D #在解壓之前禁止刪除目錄
-a number #在改變目錄後,僅解壓給定數字的源碼,如-a 0 for source0
-b number #在改變目錄前,僅解壓給定數字的源碼,如-b 0 for source0
%patch -p0 #remove no slashes
%patch -p1 #remove one slashes
%patch #打補丁0
%patch1 #打補丁1
%patch2 #打補丁2
%patch -P 2 #打補丁2
%build #編譯軟件
./configure --prefix=$RPM_BUILD_ROOT/usr
make
or
%configure #可以用rpm –eval ‘%configure‘命令查看該宏
make
%install #安裝軟件
make install PREFIX=$RPM_BUILD_ROOT/usr
install -m755 myapp $RPM_BUILD_ROOT/usr/bin/myapp
or
%makeinstall
%clean #清除編譯和安裝時生成的臨時文件
rm -rf $RPM_BUILD_ROOT
%post #定義安裝之後執行的腳本
...script...
#rpm命令傳遞一個參數給這些腳本,1是第一次安裝,>=2是升級,0是刪除最新版本,用到的變量為$1,$2,$0
%preun #定義卸載軟件之前執行的腳本
...script...
%postun #定義卸載軟件之後執行的腳本
...script...
%files #rpm包中要安裝的所有文件列表
file1 #文件中也可以包含通配符,如*
file2
directory #所有文件都放在directory目錄下
and so on
%dir /etc/xtoolwait #包含一個空目錄/etc/xtoolwait
%doc /usr/X11R6/man/man1/xtoolwait.* #安裝該文檔
%doc README NEWS #安裝這些文檔到/usr/share/doc/ or /usr/doc
%docdir #定義存放文檔的目錄
%config /etc/yp.conf #標誌該文件是一個配置文件
%config(noreplace) /etc/yp.conf
#該配置文件不會覆蓋已存在文件(被修改)覆蓋已存在文件(沒被修改),創建新的文件加上擴展後綴.rpmnew(被修改)
%config(missingok) /etc/yp.conf #該文件不是必須要的
%ghost /etc/yp.conf #該文件不應該包含在包中
%attr(mode, user, group) filename #控制文件的權限如%attr(0644,root,root) /etc/yp.conf,如果你不想指定值,可以用-
%config %attr(-,root,root) filename #設定文件類型和權限
%defattr(-,root,root) #設置文件的默認權限
%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:認證符號連接
%verifyscript #check for an entry in a system
...script... #configuration file
%changelog
* Wen Sep 24 sam shen <[email protected]
- sam updated to 1.3
%package sub_package_name #定義一個子包,名字為package-subpackage
-n sub_package_name #定義一個子包,名字為sub_package_name
當定義一個子包時,必須至少包含Summary:,Group:,%description選項,任何沒有指定的選項將用父包的選項,如版本等,如:
%package server
Requires: xinetd
Group: System Environment/Daemons
Summary:The server program for the telnet remote login protocol
%description server
Telnet is a popular protocol for logging into remote systems
如果在%package時用-n選項,那麽在%description時也要用,如:
%description -n my-telnet-server
%files server
%defattr(-,root,root)
%{_sbindir}/in.telnetd
如果在%package時用-n選項,那麽在%files時也要用,如:
%files -n my-telnet-server,也可以定義安裝或卸載腳本,像定義%files和%description 一樣
spec文件寫作規範