4.2. 有关宏的更多内容
本节介绍所选内置 RPM Macros。有关此类宏的详细列表,请参阅 RPM 文档。
4.2.1. 定义您自己的宏
下面的部分论述了如何创建自定义宏。
步骤
- 在 RPM SPEC 文件中包括以下行: - %global <name>[(opts)] <body> - %global <name>[(opts)] <body>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
					删除 \ 周围的所有空格。名称可以是字母数字字符,字符 _,长度必须至少为 3 个字符。包含 (opts) 字段是可选的:
				
- 
							Simple宏不包含(opts)字段。在这种情况下,只执行递归宏扩展。
- 
							Parametrized宏包含(opts)字段。在宏调用开始时传递括号之间的opts字符串可得到argc/argv处理的getopt(3)。
						旧的 RPM SPEC 文件使用 %define <name> <body> 宏模式。%define 和 %global 宏之间的差异如下:
					
- 
								%define是本地范围的。它适用于 SPEC 文件的特定部分。%define宏的主体部分在使用时会被扩展。
- 
								%global有全局范围。它适用于整个 SPEC 文件。在定义时扩展%global宏的正文。
						宏会被评估,即使被注释掉或者宏的名称被指定到 SPEC 文件的 %changelog 部分中。要注释掉宏,请使用 %%。例如 %%global.
					
其他资源
有关宏功能的综合信息,请参阅 RPM 文档。
4.2.2. 使用 %setup 宏
					这部分论述了如何使用 %setup 宏的不同变体构建带有源代码 tarball 的软件包。请注意,宏变体可以合并 rpmbuild 输出说明了 %setup 宏的标准行为。在每个阶段开始时,宏输出 Executing (%…),如下例所示。
				
例 4.1. %setup 宏输出示例
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.DhddsG
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.DhddsG
						shell 输出启用了 set -x。要查看 /var/tmp/rpm-tmp.DhddsG 的内容,请使用 --debug 选项,因为 rpmbuild 在成功构建后删除临时文件。这将显示环境变量的设置,后跟:
					
					%setup 宏:
				
- 确保我们在正确的目录中工作。
- 删除之前构建的恢复。
- 解包源 tarball。
- 设置一些默认特权。
4.2.2.1. 使用 %setup -q 宏
						-q 选项限制 %setup 宏的详细程度。仅执行 tar -xof 而不是 tar -xvvof。使用这个选项作为第一个选项。
					
4.2.2.2. 使用 %setup -n 宏
						-n 选项指定已展开 tarball 中的目录名称。
					
						当来自扩展 tarball 的目录与预期内容不同时,会使用这个情况(%{name}-%{version}),这可能会导致 %setup 宏的错误。
					
						例如,如果软件包名称是 cello,但源代码以 hello-1.0.tgz 中存档,且包含 hello/ 目录,则 SPEC 文件内容需要如下:
					
Name: cello
Source0: https://example.com/%{name}/release/hello-%{version}.tar.gz
…
%prep
%setup -n hello
Name: cello
Source0: https://example.com/%{name}/release/hello-%{version}.tar.gz
…
%prep
%setup -n hello4.2.2.3. 使用 %setup -c 宏
						如果源代码 tarball 不包含任何子目录,并在解压缩后的文件会填充当前目录,则使用 -c 选项。
					
						然后,-c 选项会在归档扩展中创建目录和步骤,如下所示:
					
/usr/bin/mkdir -p cello-1.0 cd 'cello-1.0'
/usr/bin/mkdir -p cello-1.0
cd 'cello-1.0'归档扩展后不会更改该目录。
4.2.2.4. 使用 %setup -D 和 %setup -T 宏
						-D 选项会禁用删除源代码目录,在使用 %setup 宏时特别有用。使用 -D 选项时,不会使用以下行:
					
rm -rf 'cello-1.0'
rm -rf 'cello-1.0'
						-T 选项通过从脚本中删除以下行来禁用源代码 tarball 的扩展:
					
/usr/bin/gzip -dc '/builddir/build/SOURCES/cello-1.0.tar.gz' | /usr/bin/tar -xvvof -
/usr/bin/gzip -dc '/builddir/build/SOURCES/cello-1.0.tar.gz' | /usr/bin/tar -xvvof -4.2.2.5. 使用 %setup -a 和 %setup -b 宏
						-a 和 -b 选项可以扩展特定的源:
					
						-b 选项代表之前(before),在进入工作目录前扩展特定源。-a 选项代表 之后,在 输入后会扩展这些源。它们的参数是 SPEC 文件中的源号。
					
						在以下示例中,cello-1.0.tar.gz 存档包含一个空 examples 目录。示例以单独的 example.tar.gz tarball 中提供,它们被扩展到同一名称的目录中。在这种情况下,如果在输入工作目录后扩展 Source1,请使用 -a 1。
					
Source0: https://example.com/%{name}/release/%{name}-%{version}.tar.gz
Source1: examples.tar.gz
…
%prep
%setup -a 1
Source0: https://example.com/%{name}/release/%{name}-%{version}.tar.gz
Source1: examples.tar.gz
…
%prep
%setup -a 1
						在以下示例中,在单独的 cello-1.0-examples.tar.gz tarball 中提供了示例,它扩展至 cello-1.0/examples。在这种情况下,使用 -b 1,在进入工作目录前扩展 Source1 :
					
Source0: https://example.com/%{name}/release/%{name}-%{version}.tar.gz
Source1: %{name}-%{version}-examples.tar.gz
…
%prep
%setup -b 1
Source0: https://example.com/%{name}/release/%{name}-%{version}.tar.gz
Source1: %{name}-%{version}-examples.tar.gz
…
%prep
%setup -b 14.2.3. %files 部分中的常见 RPM 宏
					这部分列出了 SPEC 文件的 %files 部分中所需的高级 RPM Macros。
				
| Macro | 定义 | 
|---|---|
| %license | 
									宏识别列为 LICENSE 文件的文件,该文件将被 RPM 安装和标记(例如)。示例:  | 
| %doc | 
									宏识别列出为文档的文件,还将安装并标记 RPM。宏用于有关打包软件的文档,以及用于代码示例和各种附带项的文档。在包括事件代码示例时,应谨慎地从文件中删除可执行模式。示例:  | 
| %dir | 
									宏可确保路径是此 RPM 拥有的目录。这一点很重要,因此 RPM 文件清单准确知道在卸载时要清理哪些目录。示例:  | 
| %config(noreplace) | 
									宏可确保以下文件是一个配置文件,因此如果从原始安装校验和中修改了该文件,则不应在软件包安装或更新包时覆盖(或替换)。如果有更改,则会在升级或安装时使用  | 
4.2.4. 显示内置宏
提供多个内置 RPM 宏。
流程
- 要显示所有内置 RPM 宏,请运行: - rpm --showrc - rpm --showrc- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 注意- 输出很长。要缩小结果范围,请在 - grep命令中使用上述命令。
- 要查找有关您系统 RPM 版本 RPM 宏的信息,请运行: - rpm -ql rpm - rpm -ql rpm- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 注意- RPM 宏是在输出目录结构中标题为 - macros的文件。
4.2.5. RPM 发布宏
不同的发行版根据被打包的软件语言或发布的具体准则,提供不同的推荐 RPM 宏集合。
					推荐的 RPM 宏集合通常作为 RPM 软件包提供,可以使用 yum 软件包管理器进行安装。
				
					安装后,宏文件可在 /usr/lib/rpm/macros.d/ 目录中找到。
				
要显示原始 RPM 宏定义,请运行:
rpm --showrc
rpm --showrc以上输出显示原始 RPM 宏定义。
					要确定宏的作用以及在打包 RPM 时如何有帮助,使用宏名称作为其参数运行 rpm --eval 命令:
				
rpm --eval %{_MACRO}
rpm --eval %{_MACRO}
					详情请查看 rpm man page。
				
4.2.5.1. 创建自定义宏
						您可以使用自定义宏覆盖 ~/.rpmmacros 文件中的发布宏。您所做的任何更改都会影响您计算机上的每个构建。
					
							不建议在 ~/.rpmmacros 文件中定义任何新宏。其他机器上不会包括此类宏,因为用户可能想要重新构建您的软件包。
						
要覆盖宏,请运行 :
%_topdir /opt/some/working/directory/rpmbuild
%_topdir /opt/some/working/directory/rpmbuild
						您可以从上面示例中创建 目录,包括通过 rpmdev-setuptree 实用程序的所有子目录。此宏的值默认为 ~/rpmbuild。
					
%_smp_mflags -l3
%_smp_mflags -l3
						以上宏通常用于传递 Makefile,如 make %{?_smp_mflags},并在构建阶段设置多个并发进程。默认情况下,它被设置为 -jX,其中 X 是内核数。如果您更改了内核数量,您可以加快或减慢软件包构建速度或减慢速度。