概述

spec文件是制作rpm包的脚本文件,详细定义rpm包的信息、包含内容和安装位置,如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要包含的文件列表等等。

spec文件有多个段组成,分别定义rpm编译、打包、安装等阶段的工作内容。

示例如下:

Name: myprogram
Version: 1.0
Release: 1
Vendor: Jaun
Summary: My program
License: GPL
URL: http://myprogram.com
Source0: myprogram-1.0.tar.gz
Group: Development/Tools
BuildRequires: gcc
%description
My program is a simple example program.
%prep
%setup -q
%build
  ./configure
  make
%install
	make install DESTDIR=%{buildroot}
%clean
	rm -rf %{buildroot}
%files
	%defattr(-,root,root)
	/sbin/myprogram
%post
	/sbin/ldconfig /sbin/myprogram
%preun
	/sbin/ldconfig /sbin/myprogram
%postun
	/sbin/ldconfig
%changelog

一、软件包描述

spec文件的最前部分通常为包描述内容,可以包含如下信息:

1.1、Name

软件包的名称,之后可以使用%{name}的方式进行引用,最终RPM软件包是用该名字与版本号,释出号及体系号来命名软件包的。

1.2、Version

软件包的版本号,之后可以使用%{version}的方式进行引用,仅当软件包比以前有较大改变时才增加版本号。

1.3、Release

实际发行序列号,表明打包的时间,次数等信息,之后可以使用%{release}的方式进行引用

1.4、Vendor

软件开发者的名字。

1.5、Summary

用一句话概括该软件包尽量多的信息

1.6、License/Copyright

软件包的发行许可证,也就是软件的授权方式,通常是GPL,其他常见的有:GPL(自由软件),BSD,MIT,Public Domain(公共域),Distributable(贡献),commercial(商业),Share(共享)等。

1.7、URL

发布者的网站,博客,邮箱等信息可放在这里

1.8、Source

源代码包,通常使用Source0,Source1…,之后也可以使用%{source0},%{source1}的方式进行引用.

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

1.10、Patch

补丁源码包路径,可使用Patch0,Patch1…,之后也可以使用%{patch0},%{patch1}的方式进行引用

1.11、BuildRoot

安装或编绎时的根目录,在包生成的时候,如果不指定此目录作为虚拟根目录,在安装阶段,就会有系统根目录作为安装根目录

1.12、Requires

当前生成的RPM包,需要依赖的软件包名称,用>=或<=表示大于等于或小于等于指定的版本,符号两边用空格隔开,不同的软件包也用空格隔开

1.13、Packager

打包人信息

1.14、%description

软件的详细说明,可写在多个行上

1.15、BuildArch

指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值。

二、软件包生成阶段脚本

包生成阶段定义安装包制作阶段的详细工作内容,包括准备、编译、打包、清理、检查等。

这个过程的代码在运行在制作阶段,也就是在打包机上运行。当你运行rpmbuild命令时按顺序执行如下阶段阶段。

2.1、%prep

预备编绎阶段,可以使用脚本,将源代码包解压,有补丁的话,也将补丁进行处理,然后生成编绎配置信息(大部分软件会在此阶段执行configure脚本进行编绎检查);除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可以有很多行,如我们常写的tar解包命令。

2.2、%build

编绎阶段,所要执行的命令为生成软件包服务,大部分软件都会在此阶段执行make操作

2.3、%install

安装阶段,大部分软件都会在此阶段执行make install操作

2.4、%clean

清理阶段,安装完成后,将清理上述各个阶段生成的临时文件

2.5、%check rpm

软件包的测试。

三、包的安装阶段脚本

包的安装阶段脚本在执行rpm包安装过程中运行,运行在目标机器上,当你键入rpm命令开始安装时执行。

3.1、%pre

安装执行前脚本,即RPM包被安装前,先执行此部分脚本,如创建指定账号等

3.2、%post

安装执行后脚本,即RPM包被成功安装后,会继续执行此部分脚本,如设置开机启动,启动服务等

3.3、%preun

卸载执行前脚本,即RPM包被卸载前,先执行此部分脚本,如停止服务,取消开机启动等

3.4、%postun

卸载执行后脚本,即RPM包被成功卸载后,会继续执行此部分脚本,如删除指定账号等

四、包配置信息

4.1、%files 打包文件列表,需要被放入RPM包中的文件,在此列出,可为目录

4.2、%changelog 变更日记,可以标明本次打包需要提示的信息

4.3、%doc 表示这是文档文件,因此如果安装时使用–excludedocs将不会安装此类文件。

4.4、%dir 表示将dir目录路径下的内容打进rpm软件包里。

4.5、%config(noreplace) 该配置文件不会覆盖已经存在文件(RPM包中文件会以.rpmnew存在于系统,卸载时系统中的该配置文件会以.rpmsave保存下来,如果没有这个选项,安装时RPM包中文件会以.rpmorig存在于系统)覆盖已经存在文件(没被修改),创建新的文件加上扩展后缀.rpmnew(被修改)。

4.6、%attr 控制文件权限

五、制作和安装命令

制作

rpmbuild -bb xxx.spec

查看详细帮助:

rpmbuild --help

安装

rpm -ivh xxx.rpm

查询包内容

rpm -qlp xxx.rpm

查询已安装的包

rpm -qa