RPM 规范文件语法与特性演变全解析
1. RPM 规范文件语法概述
RPM 规范文件主要分为两大部分:包信息标签和构建部分。包信息标签包含了可通过
rpm
命令查询的大部分头部标签,而构建部分则包含了编译软件的命令等。
1.1 包信息标签
包信息标签涵盖了众多关键信息,用于描述和标识软件包。以下是一些重要的标签及其用途:
-
名称 - 纪元 - 版本 - 发布标签(NEVR)
:用于唯一标识软件包,虽然
Epoch
标签可选,但建议包含。示例如下:
Name: name
# Epoch: 1
Version: version_number
Release: package_release_number
- 其他信息标签 :用于定义软件包的供应商、版权信息、分发信息等。
Vendor: name_of_vendor
URL: URL_to_package_home
Copyright: package_copyright_message
Distribution: Linux_or_product_distribution
Packager : John 0. Smith <john.smith@somecompany.yow>
Group : group_for_categorizing_package
Icon : filename.xpm
Summary : one_line_description_of_package
-
描述部分
:使用
%description标记,用于提供软件包的详细描述。
%description
Tcsh is an enhanced but completely compatible version of csh, the C shell. Tcsh is a command language interpreter which can be used both as an interactive login shell and as a shell script command processor. Tcsh includes a command line editor, programmable word completion, spelling correction, a history mechanism, job control and a C language like syntax.
1.2 注释
在规范文件中,可以使用注释来记录信息。以
#
开头的行即为注释,RPM 会忽略这些注释。
#This is a comment.
需要注意的是,避免在注释中使用百分号(%),以免被解释为 RPM 宏。
1.3 构建设置
构建设置标签用于指定软件包的构建相关信息,包括架构、先决条件和构建根目录等。
-
构建架构(BuildArchitectures)
:指定二进制 RPM 可运行的架构,特殊值
noarch
表示不依赖特定架构。
-
构建先决条件(BuildPreReq)
:列出构建所需的先决条件。
BuildPreReq: ncurses-devel
- 构建根目录(Buildroot) :指定构建软件包的临时目录。
Buildroot: %(_tmppath}/%{name}-root
1.4 依赖标签
依赖标签用于定义软件包的所有依赖关系,可指定能力名称、版本号等。
Provides: capability_name
Requires: capability_name > version_number
Requires: capability_name < version_number
Requires: capability_name == version_number
Requires: capability_name = version_number
可以提供多个依赖项,用逗号分隔。对于解释器的附加模块,可使用特定语法定义能力。
Provides: perl(MIME-Base64)
1.5 源文件标签
源文件和补丁标签用于标识构建二进制包所使用的源文件和补丁。如果有多个同类标签,可添加编号。
Source0: ftp://ftp.uk.linux.org/pub/linux/telnet-%{telnet_version}.tar.gz
Source1: telnet-client.tar.gz
Patch1: telnet-client-cvs.patch
1.6 宏
宏可用于控制软件包的构建过程,分为变量定义宏、条件宏和内置宏。
-
变量定义宏(%define)
:用于在规范文件中定义新的宏,方便统一管理目录路径和版本号等。
%define bindir /bin
%define major 2
%define minor 2
%define patchlevel 7
Version: %{major}.%{minor}.%{patchlevel}
-
特殊宏列表 :
| 宏 | 用途 |
| — | — |
|%dump| 打印宏值 |
|%{echo:message}| 将消息打印到 stderr |
|%{!error:message}| 将消息打印到 stderr 并返回 BADSPEC |
|%{expand:expression}| 展开表达式 |
|%{F:file_exp}| 将 file_exp 展开为文件名 |
|%global name value| 定义全局宏 |
|%{P:patch_exp}| 将 patch_exp 展开为补丁文件名 |
|%{S:source_exp}| 将 source_exp 展开为源文件名 |
|%trace| 切换调试信息的打印 |
|%{uncompress:filename}| 测试文件是否压缩,若压缩则解压并包含在上下文中,否则调用 cat 包含文件 |
|%undefine macro| 取消定义给定的宏 |
|%{warn:message}| 将消息打印到 stderr | -
条件宏 :用于测试宏的存在性,可使用特殊语法进行条件判断。
%{?macro_to_test: expression}
%{!?macro_to_test: expression}
%if %{old_5x}
%define b5x 1
%undefine b6x
%else
%define b6x 1
%undefine b5x
%endif
-
内置宏
:RPM 内置的宏可帮助将文件放置在正确的位置。
| 宏 | 默认值 |
| — | — |
|%_prefix|/usr|
|%_exec_prefix|%{_prefix}|
|%_bindir|%{_exec_prefix}/bin|
|%_sbindir|%{_exec_prefix}/sbin|
|%_libexecdir|%{_exec_prefix}/libexec|
|%_datadir|%{_prefix}/share|
|%_sysconfdir|%{_prefix}/etc|
|%_sharedstatedir|%{_prefix}/com|
|%_localstatedir|%{_prefix}/var|
|%_libdir|%{_exec_prefix}/lib|
|%_includedir|%{_prefix}/include|
|%_oldincludedir|/usr/include|
|%_infodir|%{_prefix}/info|
|%_mandir|%{_prefix}/man|
1.7 构建部分
构建部分定义了软件包的构建阶段,包括准备、构建、安装、清理和脚本执行等。
-
构建准备(%prep)
:通常包含
%setup
命令。
%prep
%setup -q
- 构建(%build) :描述如何构建库或应用程序。
%build
%configure
make
- 安装(%install) :包含安装库或应用程序的命令。
%install
rm -rf %{buildroot}
%makeinstall
-
清理(%clean)
:通常调用
make clean命令清理构建文件。
%clean
rm -rf %{buildroot}
-
安装和卸载脚本
:可使用
%pre、%post、%preun和%postun脚本在安装和卸载前后执行操作。
%post
/sbin/chkconfig --add ypbind
%preun
if [ "$1" = 0 ] : then
/sbin/service ypbind stop > /dev/null 2>&1
/sbin/chkconfig --del ypbind
fi
exit 0
%postun
if [ "$1" -ge 1 ]: then
/sbin/service ypbind condrestart > /dev/null 2>&1
fi
exit 0
1.8 文件标签
%files
标签用于列出软件包应安装的文件,可标记配置和文档文件。
%files
%defattr(-,root,root)
/usr/X11R6/bin/xtoolwait
/usr/X11R6/man/man1/xtoolwait.*
%config /etc/rc.d/init.d/*
%config /etc/yp.conf
%dir /var/yp
%dir /var/yp/binding
%doc README NEWS
1.9 可重定位包
通过设置
Prefix
标签可创建可重定位包,安装时可使用
--relocate
选项进行重定位。
Prefix: /usr
Prefix: /etc
# rpm --relocate /etc=/usr/etc file_name.rpm
1.10 变更日志
变更日志通常位于规范文件末尾,记录每个重要变更的消息。
%changelog
* Fri Jun 21 2002 Bob Marley <marley@redhat.com>
- automated rebuild
* Tue May 08 2001 Peter Tosh <tosh@redhat.com> 1.3-1
- updated to 1.3
1.11 构建流程 mermaid 流程图
graph LR
A[准备阶段] --> B[构建阶段]
B --> C[安装阶段]
C --> D[清理阶段]
D --> E[完成]
A -->|设置| B
B -->|编译| C
C -->|安装文件| D
以上就是 RPM 规范文件语法的详细介绍,涵盖了包信息、构建设置、依赖关系、宏使用以及构建流程等方面的内容。通过合理使用这些语法和标签,可以高效地创建和管理 RPM 软件包。
2. RPM 特性演变
2.1 版本概述与兼容性考虑
在制作 RPM 包文件时,需要考虑目标用户所使用的 RPM 版本。因为 RPM 是一个不断发展的程序,不同版本会添加新特性。主要关注的版本有 RPM 2.5、RPM 3.0.5、RPM 4.0.4 和 RPM 4.1 。以下是各版本的大致使用情况:
- RPM 2.5:已不广泛使用,若希望 RPM 包能在所有 RPM 版本上安装,可针对此版本。
- RPM 3.0.5:是 3.x 系列的最终版本,曾随 Red Hat Linux 6.2 及更旧版本发布,仍被其他厂商广泛使用,例如 Cobalt 的 Linux 发行版就基于此版本。
- RPM 4.0.4:用于 Red Hat Linux 7.x 版本。
- RPM 4.1:首次随 Red Hat Linux 8.0 发布。针对 RPM 3.0.5 制作的包通常能在当前大多数 RPM 实现中使用,而针对 RPM 4.0.4 或 RPM 4.1 的包只能在较新的 RPM 实现中使用。
2.2 RPM 各版本特性演变
2.2.1 RPM 2.5 系列
-
基本特性与功能
:此版本具备大部分基本 RPM 功能,如触发器和对
Summary、Description、Group标签的国际化支持,并且首次使用 RPM 版本 3 的文件格式。 -
后续更新特性
:
-
RPM 2.5.3:在 RPM 头中添加了对
Epochs的支持,实现了RPMTAG_EPOCH。 -
RPM 2.5.4:引入
%license和%readme文件类型,可在 RPM 规范文件中用于指定许可证和 README 文件。 -
RPM 2.5.6:支持在 RPM 规范文件中使用
Epoch:关键字,可强制为包设置Epoch,该关键字取代了旧的Serial:关键字。 -
RPM 2.5.7:强制规定在 RPM 规范文件的
Version或Release字段中不得使用-字符。 - RPM 2.90:支持使用 GPG(GNU Privacy Guard)对 RPM 包文件进行签名和验证。
-
RPM 2.91:允许
Provides:指令定义所提供文件的绝对路径,此前只能用于列出提供的功能。
-
RPM 2.5.3:在 RPM 头中添加了对
2.2.2 RPM 3.0 系列
-
RPM 3.0.2
:首次允许使用多行
Provides:指令,无需在规范文件中将所有提供的功能和文件组合在同一行。 - RPM 3.0.3 :增加了对版本化依赖的支持,此前规范文件只能表明包需要另一个包或提供特定功能,无法指定所需包的可接受版本或所提供功能的版本。
-
RPM 3.0.4
:引入
CompressedFileNames支持。此前 RPM 在包文件中打包所有归档文件的绝对路径,支持该特性后,包文件头先存储目录名,再存储该目录内文件的基本名称,可显著节省安装包时的内存。 -
RPM 3.0.5
:
-
为 RPM 增加
PayloadlsBzip2支持,允许使用bzip2而非gzip对 RPM 包文件的数据有效负载进行压缩,但由于安装bzip2压缩的 RPM 包文件需要更多内存和时间,该特性实际使用较少。 - 增加了对操作现有 RPM 版本 4 文件格式包的支持,但此版本生成的包只能是 RPM 版本 3 文件格式。
-
为 RPM 增加
2.2.3 RPM 4.0 系列
-
RPM 4.0
:
- 使用 RPM 版本 4 包文件格式创建包文件。
-
将用于创建和操作 RPM 数据库的数据库程序从 Berkeley db 1.85 切换到 Berkeley db 3.1,并更改了 RPM 包数据库文件名,旧的
db1包数据库文件为/var/lib/rpm/packages.rpm,新的db3包数据库文件为/var/lib/rpm/Packages,方便新旧版本共存,简化从旧版本升级到 RPM 4.0 的过程。 -
引入
PayloadFilesHavePrefix特性,改变了 RPM 包文件中归档文件的命名方式,此前 cpio 归档中的文件名无根前缀,现在所有文件名都有根前缀,如./usr/bin/ar,使 RPM 包文件可包含根目录./。 -
对 RPM 4.0 规范文件解析器增加了额外的完整性检查,不再允许包含
BuildRoot的悬空符号链接,消除了制作 RPM 时常见的一类错误。 -
隐式生成
Provides:指令,读取包头时会自动生成Provides: %{name} =%{epoch} :%{version}-%{release}指令,确保所有包明确将自身作为功能提供,无需在包规范文件中提供自身功能。
- RPM 4.0.2 :引入使用 SHA - 1 消息摘要验证 RPM 头区域。
-
RPM 4.0.3
:
-
增加
%dev(type,major,minor)规范文件指令,允许创建设备节点。 -
%configure规范文件指令现在支持-target和-host,简化使用 RPM 进行交叉编译的过程。 -
扩展
%files指令,添加%exclude子指令,可用于排除文件包含。 - 默认情况下切换回创建 RPM 版本 3 包文件格式的包,但仍支持 RPM 版本 4 包文件格式。
-
增加
-
RPM 4.0.4
:
-
提供
PartialHardlinkSets支持,解决了硬链接集在部分文件有特殊属性(如%doc或%lang)时的安装问题,允许成功创建硬链接集的子集。 -
自动生成 Perl 模块
Requires:指令,find - requires现在会解析所有打包的 Perl 脚本,生成确定的依赖项。 - 为 RPM 提供事务支持。
-
提供
2.2.4 RPM 4.1
增加单独的头 DSA 和 RSA 签名,允许验证 RPM 包头。
2.3 特性使用注意事项
在考虑准备的包所需的 RPM 特性时,要注意有些特性需在包规范文件中手动指定,有些则在 RPM 包文件构建过程中自动添加。例如,在规范文件中使用版本化的
Requires:
指令会使生成的 RPM 包文件只能由 RPM 3.0.3 或更高版本正确安装;使用 RPM 4.0 或更高版本准备的包会自动生成只能由支持
PayloadFilesHavePrefix
特性的 RPM 版本处理的包文件。因此,最佳做法是确定希望支持的最旧 RPM 版本,然后使用该版本构建所有包,并在准备和构建包时牢记其特性集。
2.4 特性演变 mermaid 流程图
graph LR
A[RPM 2.5] --> B[RPM 3.0.5]
B --> C[RPM 4.0.4]
C --> D[RPM 4.1]
A -->|基本功能完善| B
B -->|版本化依赖等| C
C -->|硬链接集支持等| D
2.5 版本特性对比表格
| RPM 版本 | 主要特性 |
|---|---|
| RPM 2.5 |
基本功能、触发器、国际化支持、RPM 版本 3 文件格式;后续添加
Epochs
、
%license
等支持
|
| RPM 3.0.2 |
多行
Provides:
指令
|
| RPM 3.0.3 | 版本化依赖支持 |
| RPM 3.0.4 |
CompressedFileNames
支持
|
| RPM 3.0.5 |
PayloadlsBzip2
支持、操作 RPM 4 格式包支持
|
| RPM 4.0 |
RPM 版本 4 格式、数据库切换、
PayloadFilesHavePrefix
特性、隐式
Provides:
生成等
|
| RPM 4.0.2 | SHA - 1 消息摘要验证 |
| RPM 4.0.3 |
%dev
指令、
%configure
扩展、
%exclude
子指令
|
| RPM 4.0.4 |
PartialHardlinkSets
支持、自动生成 Perl 模块依赖、事务支持
|
| RPM 4.1 | 单独头 DSA 和 RSA 签名 |
通过了解 RPM 规范文件语法和特性演变,开发者能够更好地创建、管理和分发 RPM 软件包,确保软件包在不同 RPM 版本环境中的兼容性和稳定性。
超级会员免费看
59

被折叠的 条评论
为什么被折叠?



