21、RPM 规范文件语法与特性演变全解析

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: 指令定义所提供文件的绝对路径,此前只能用于列出提供的功能。
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 文件格式。
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 版本环境中的兼容性和稳定性。

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
本系统采用微信小程序作为前端交互界面,结合Spring BootVue.js框架实现后端服务及管理后台的构建,形成一套完整的电子商务解决方案。该系统架构支持单一商户独立运营,亦兼容多商户入驻的平台模式,具备高度的灵活性扩展性。 在技术实现上,后端以Java语言为核心,依托Spring Boot框架提供稳定的业务逻辑处理数据接口服务;管理后台采用Vue.js进行开发,实现了直观高效的操作界面;前端微信小程序则为用户提供了便捷的移动端购物体验。整套系统各模块间紧密协作,功能链路完整闭环,已通过严格测试优化,符合商业应用的标准要求。 系统设计注重业务场景的面覆盖,不仅包含商品展示、交易流程、订单处理等核心电商功能,还集成了会员管理、营销工具、数据统计等辅助模块,能够满足不同规模商户的日常运营需求。其多店铺支持机制允许平台方对入驻商户进行统一管理,同时保障各店铺在品牌展示、商品销售及客户服务方面的独立运作空间。 该解决方案强调代码结构的规范可维护性,遵循企业级开发标准,确保了系统的长期稳定运行后续功能迭代的可行性。整体而言,这是一套技术选型成熟、架构清晰、功能完备且可直接投入商用的电商平台系统。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值