RPM SPEC文件编写通用规范
2008-09-25 14:56
513 查看
The
RPM system assumes five RPM directories
BUILD:rpmbuild编译软件的目录
RPMS:rpmbuild创建的binary
RPM所存放的目录
SOURCES:存放源代码的目录
SPEC:存放spec文件的目录
SRPMS:rpmbuild创建的source
RPM所存放的目录
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}
:打印信息到标准错误
宏
%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%endifor%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相反
#
This is a comment. 以#开头的一行为注释,如果在注释里加%会产生错误,如%prep,应该加上两个%,即%%prep
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:
http://www.somesite.com #公司或组织的主页
Packager:
sam shen <sxc_1985921@126.com> #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
Source3:
ftp://ftp.somesite.you/pub/name.tar.gz #用ftp或http命名源码包
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: #这三个选项和上述三个类似,只是他们的依赖 性关系在构建包时就要
满足,而前三者是在安装包 时要满足
Prefix:
/usr #定义一个relocatable的包,当安装或更新包时, #所有在/usr目录下的包都
可以映射到其他目录,当定义Prefix时,所有%files标志的文件都要在Prefix
定 义的目录下
%triggerin
--package <
version #当package包安装或更新时,或本包安装更新且
...script... package已经安装时,运行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 <sxc_1985921@126.com> -
sam updated to 1.3
%package
sub_package_name #定义一个子包,名字为package-subpackage
-n sub_package_name #定义一个子包,名字为sub_package_name
当定义一个子包时,必须至少包含Summary:,Group:,%description选项,任何没有指定的选项将用父包的选项,如版本等,如:%package
serverRequires:
xinetdGroup:
System Environment/DaemonsSummary:The
server program for the telnet remote login protocol%description
serverTelnet
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
一样
参考文献:http://docs.fedoraproject.org/drafts/rpm-guide-en/index.html
RPM system assumes five RPM directories
BUILD:rpmbuild编译软件的目录
RPMS:rpmbuild创建的binary
RPM所存放的目录
SOURCES:存放源代码的目录
SPEC:存放spec文件的目录
SRPMS:rpmbuild创建的source
RPM所存放的目录
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}
:打印信息到标准错误
宏
%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%endifor%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相反
#
This is a comment. 以#开头的一行为注释,如果在注释里加%会产生错误,如%prep,应该加上两个%,即%%prep
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:
http://www.somesite.com #公司或组织的主页
Packager:
sam shen <sxc_1985921@126.com> #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
Source3:
ftp://ftp.somesite.you/pub/name.tar.gz #用ftp或http命名源码包
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: #这三个选项和上述三个类似,只是他们的依赖 性关系在构建包时就要
满足,而前三者是在安装包 时要满足
Prefix:
/usr #定义一个relocatable的包,当安装或更新包时, #所有在/usr目录下的包都
可以映射到其他目录,当定义Prefix时,所有%files标志的文件都要在Prefix
定 义的目录下
%triggerin
--package <
version #当package包安装或更新时,或本包安装更新且
...script... package已经安装时,运行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 <sxc_1985921@126.com> -
sam updated to 1.3
%package
sub_package_name #定义一个子包,名字为package-subpackage
-n sub_package_name #定义一个子包,名字为sub_package_name
当定义一个子包时,必须至少包含Summary:,Group:,%description选项,任何没有指定的选项将用父包的选项,如版本等,如:%package
serverRequires:
xinetdGroup:
System Environment/DaemonsSummary:The
server program for the telnet remote login protocol%description
serverTelnet
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
一样
参考文献:http://docs.fedoraproject.org/drafts/rpm-guide-en/index.html
相关文章推荐
- ceph存储 Linux下rpm制作中spec文件编写规范
- ceph存储 Centos下建立RPM包中spec文件编写说明书
- Linux: 学习如何制作RPM包, SPEC文件如何编写
- linux-RPM 打包原理 SPEC 编写规范
- linux-RPM 打包原理 SPEC 编写规范
- rpm的制作 spec文件写法
- 海云数据恢复中心编写的批处理病毒破坏文件数据恢复的通用脚本
- RPM安装包-Spec文件參数具体解释与演示样例分析
- 如何为开发项目编写规范的README文件(windows)
- 制作rpm包的spec文件
- Microsoft可移植可执行文件和通用目标文件格式文件规范v8.1修订版
- JAR包中的MANIFEST.MF文件详解以及编写规范
- spec文件中写上一些脚本,使生成的rpm包在安装前删除系统中指定文件的方法
- rpmbuild之spec文件说明
- rpmbuild spec文件的注释问题
- 如何编写一个CocoaPods的spec文件
- 如何为开发项目编写规范的README文件(足球竞猜源码下载),此文详解
- JAR包中的MANIFEST.MF文件详解以及编写规范
- 如何编写一个CocoaPods的spec文件
- RPM打包技术与典型SPEC文件分析