spec文件是整个RPM包建立过程的中心,它的作用就如同编译程序时的Makefile文件。
1.Spec文件參数
spec文件包括建立一个RPM包必需的信息,包括哪些文件是包的一部分以及它们安装在哪个文件夹下。这个文件一般分为例如以下的几节:
(1) Preamle(序言)
序言包括用户请求包的信息时所显示的内容。它能够包括包的功能描写叙述、包的软件版本号、版权信息和所属的包组等。Summary
是一行关于该软件包的描写叙述,Name 是该软件包的基名,Version
是该软件的版本号号,Release 是 RPM 本身的版本号号,假设修复了 spec 文件里的一个错误并公布了该软件同一版本号的新 RPM,就应该添加发行版号。License
应该给出一些许可术语(如:"GPL"、"Commercial"、"Shareware"),Group
标识软件类型。那些试图帮助人们管理 RPM 的程序通常依照组列出 RPM。您能够在usr/share/doc/rpm-4.0.4/GROUPS 文件看到一个 Red Hat 使用的组列表(如果您安装的 RPM 版本号是 4.0.4)。可是您还能够使用那些组名以外的名称。Source0、Source1等等给这些源文件命名(通常为 tar.gz 文件)。%{name}
和 %{version} 是 RPM 宏,它们扩展成为头中定义的 rpm 名称和版本号。
要注意的是,你不要在 Source 语句中包括不论什么路径。缺省情况下,RPM 会在 /usr/src/redhat/SOURCES 中寻找文件,请将您的源文件复制或链接到那里。(要使 spec 文件尽量可移植的话,应当尽量避免嵌入自己开发机器上的假想路径。其它开发者就能够指示 RPM 在别的文件夹下查找源文件,而不用改动您的 spec 文件。)
接下来的部分从 %description 行開始。您应该在这里提供该软件很多其它的描写叙述,这样不论什么人使用 rpm -qi 查询您的软件包时都能够看到它。您能够解释这个软件包做什么,描写叙述不论什么警告或附加的配置指令,等等。
(2) Prep节
Prep 节进行实际的打包准备工作,它是使用节前缀%prep表示的。一般而言,这一节的主要工作是检查标签语法是否正确,删除旧的软件源程序,对包括源程序的 tar文件进行解码。假设包括补丁(patch)文件,将补丁文件应用到解开的源代码中。它一般包括%setup与%patch两个命令。%setup用于将软件源代码包解开,运行%patch可将补丁文件增加解开的源程序中。
%setup
-n newdir---------将压缩的软件源程序在newdir文件夹下解开。
-c ---------------在解开源程序之前先创建文件夹。
-b num------------在包括多个源程序时,将第num个源程序解压缩。
-T----------------不使用缺省的解压缩操作。
比如:
%setup -T -b 0
/*解开第一个源程序文件。*/
%setup -c -n newdir
/*创建文件夹newdir,并在此文件夹之下解开源程序。*/
%patch
%patchN-------这里N是数字,表示使用第N个补丁文件,等价于%patch -P N
-p0-----------指定使用第一个补丁文件,-p1指定使用第二个补丁文件。 -s------------在使用补丁时,不显示不论什么信息。
-b name-------在增加补丁文件之前,将源文件名称上增加name。若为指定此參数,则缺省源文件增加.orig。
-T------------将全部打补丁时产生的输出文件删除。
(3) Build节
这一节主要用于编译源代码,它是使用节前缀%build表示的。这一节一般由多个make命令组成。
(4) Install节
这一节主要用于完毕实际安装软件必须运行的命令,它是使用节前缀%install表示的。这一节通常是由make install指令构成,可是有时也会包括cp、mv、install等指令。
这一节还能指定在用户安装的系统上,包安装时执行的脚本。这种脚本称为安装(卸载)脚本。它能够指定包安装前、包安装后、包除去前、包除去后的系统必须执行的外壳程序段。在用户安装的系统上,为了验证一个包是否已经安装成功的验证脚本也可由这一节指定。
(5) Clean节
这一节所描写叙述的内容表示在完毕包建立的工作之后,自己主动运行此节下的脚本进行附加的清除工作,它是使用节前缀%clean表示的。一般而言,这一节的内容是简单地使用rm -rf $RPM_BUILD_ROOT命令,不须要指定此节的其他内容。
(6) 文件列表
这一节指定构成包的文件的列表,它是使用节前缀%files表示的。此外,它还包括一系列宏控制安装后的文件属性和配置信息。
%files 列出应该捆绑到 RPM 中的文件,并可以可选地设置许可权和其他信息。在 %files 中,您可以使用
%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 下列出一个文件夹名,RPM 会包含该文件夹下的全部文件。通常这不是您想要的,特别对于 /bin 这种文件夹。
(7) 修改日志
这一节主要描写叙述软件的开发记录,它是使用节前缀%changlog表示的。这个段的内容是为了开发者能具体的了解该软件的开发过程,对于包的维护极有优点。
2.Spec文件演示样例与解说
Name: ao_redpacket(CPM名称)
Version: 1(CPM版本号)
Release: 5(RPM 本身的版本号号)
License: Commercial(授权)
Group: commodity(软件类型)
Summary: the main AO module of commodity on basic platform(描写叙述)
Vendor: Tencent(公司)
Packager: timmyye(公布人)
Prefix: /usr/local(前缀路径)
Provides: ao_redpacket(提供)
Requires: platform.framework public_scripts(需求)
Buildroot: /data/htdocs/rpm.paipaioa.com/rpm/data_32/rpm_build/commodity/ao_redpacket_1/build_directory(编译路径) %description(描写叙述)
the main AO module of commodity on basic platform %files(安装后的文件属性和配置信息)
%defattr (-,appadmin,users)(缺省的许可权、全部者和组)
%config /usr/local/c2csvc/svc/ao_redpacket/etc/*
%dir /usr/local/c2csvc/svc/ao_redpacket
%dir /usr/local/c2csvc/svc/ao_redpacket/etc
/usr/local/c2csvc/svc/ao_redpacket/bin
/usr/local/c2csvc/svc/ao_redpacket/no_itil
/usr/local/c2csvc/svc/ao_redpacket/so
/usr/local/c2csvc/so/ao_redpacket.so
/data/applog/ao_redpacket
/usr/local/c2csvc/svc/ao_redpacket/restart_itilid %pre