8.5.4 spec文件简介

从作用上来说,spec文件类似于源码编译时的Makefile文件,是重建rpm包的核心文件。spec文件有一定的模板格式,一般来说分为preamle(序言)、prep(前期准备)、build(编译)、install(安装)、clean(清理)、files(文件列表)、changelog(修改日志)这几个部分。

1.preamle(序言)

基础信息部分,主要包含软件包的功能描述、版本、版权、作者、制作时间等内容,比如说我们可以用rpm命令查询到之前创建的rsh-0.17-40.i386.rpm软件包的相关基础信息。


  1. [root@localhost i386]# rpm -qpi rsh-0.17-40.i386.rpm
  2. Name : rsh Relocations: (not relocatable)
  3. Version : 0.17 Vendor: (none)
  4. Release : 40 Build Date: Tue 26 Feb 2013 08:45:48 AM CST
  5. Install Date: (not installed) Build Host: localhost.localdomain
  6. Group : Applications/Internet Source RPM: rsh-0.17-40.src.rpm
  7. Size : 130504 License: BSD
  8. Signature : (none)
  9. Summary : Clients for remote access commands (rsh, rlogin, rcp).
  10. Description :
  11. The rsh package contains a set of programs which allow users to run
  12. commands on remote machines, login to other machines and copy files
  13. between machines (rsh, rlogin and rcp). All three of these commands
  14. use rhosts style authentication. This package contains the clients
  15. needed for all of these services.
  16. The rsh package should be installed to enable remote access to other
  17. machines.

这些信息都是可以在spec文件中定义的,在spec文件中可使用特定的“关键字”来定义,常用的关键字如下:

·Summary:包的简介。

·Name:包的名称。

·Version:软件版本。

·Release:发布序列号。

·License:软件授权,常见的有GPL、BSD、MIT、Distributable、Commercial、Share等。

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

·BuildRoot:编译使用的目录。

·BuildPrereq:编译前需要满足的包。

·BuildRequires:编译时需要安装的包。

·Source:源码包。

·Patch:补丁文件。

·Description:更详细的描述。

·Requires:安装该包时的依赖包。

2.prep(前期准备)

prep是预处理部分,以%prep开头,用于正式编译前的准备工作,包括删除老的源码、解压源代码(%setup)、对源码应用补丁(%patch)等操作。

%setup部分的写法一般为:


  1. %setup -n %{Name}-%{Version} #
  2. 把源码包解压到新创建的目录中

通常是从/usr/src/redhat/SOURCES里的包解压到/usr/src/redhat/BUILD/%{Name}-%{Version}中。注意其中的%{Name}-%{Version}是在preamle中定义的。

%patch用于对源码包打补丁,通常补丁都会与源码包在一起,一般写法为:


  1. %patch -p1 #
  2. 使用preamle
  3. 中定义的Patch
  4. 补丁,-p1
  5. 是忽略patch
  6. 的第一层目录

3.build(编译)

build是正式开始编译的部分,以%build开头,相当于源码编译时的configure(配置)、make(编译)的工作,所以这部分一般由configure以及多个build命令组成。

4.install(安装)

install用于完成实际的安装过程,以%install开头,相当于源码编译时的make install,其中也会包括一些Shell的文件操作命令,包括make、cp、install、rm、mkdir等,还能定义安装该软件时需要运行的脚本,同时还能控制该脚本运行的时间(安装包之前还是之后,移除包之前还是之后)。

5.clean(清理)

clean主要适用于安装完成后的清理工作,以%clean开头,用于删除编译过程中产生的临时文件等。一般这里只需要简单地使用rm命令即可,如下所示:


  1. rm -rf $RPM_BUILD_ROOT #RPM_BUILD_ROOT
  2. preamle
  3. 中定义的BuildRoot

6.files(文件列表)

files部分用于指定实际安装的文件放置的目录和相关的权限,以%files开头。这里所指定的所有文件都将会被打包到最后生成的rpm包中,这些指定的文件分为三类,分别是说明文件(README或是changelog文件)、配置文件、可执行文件,如果在%files中不列出具体的文件,则默认包含所有文件。

在%files中,还可以使用以下字段:

·%exclude列出不被打包到rpm中的文件。

·%defattr(-,root,root)指定文件的属性,分别是mode、owner、group,-表示默认值,对文本文件是0644,可执行文件是0755。

·%attr(permissions,user,group)覆盖指定文件的权限。

·%doc指明说明文件,rpm在安装时会将这类文件复制到/usr/share/doc/%{Name}-%{Version}中。

·%config指明文件属于配置文件,在使用rpm升级软件时,会避免用rpm打包的默认配置文件覆盖原配置文件。

7.changelog(修改日志)

changelog主要是注明该软件包的开发记录,使用%changelog开头,主要作用是让开发人员了解该软件开发过程以及历经的功能补全和bug修复。