2.7. 软件包布局
每个 Software Collection 的布局都由 metapackage 组成,它安装其它软件包的子集,以及软件集合命名空间中的多个软件包,它们安装在 Software Collection 命名空间中。
2.7.1. Metapackage
每个 Software Collection 都会包括一个 metapackage,它安装一个 Software Collection 的软件包子集,这是用户使用 Software Collection 执行最常见任务所必需的。例如,基本软件包可以提供 Perl 语言解释器,但不能提供 Perl 扩展模块。metapackage 包含基本的文件系统层次结构,并提供多个 Software Collection 的 scriptlets。
metapackage 的目的是确保软件集合中的所有基本软件包都已正确安装,并可启用 Software Collection。
metapackage 会生成以下软件包,它们也是 Software Collection 的一部分:
- 主软件包: %name
- Software Collection 中的主要软件包包含基本软件包的依赖项,它们包含在 Software Collection 中。主软件包不包含任何文件。当为您的 Software Collection 软件包指定依赖项时,请确保 Software Collection 中没有其它软件包取决于主软件包。主软件包的目的是仅安装那些对用户使用 Software Collection 执行大多数常见任务所需的软件包。通常,主软件包没有指定任何构建时间依赖项(例如,仅构建另一个 Software Collection 软件包依赖项的软件包)。例如,如果 Software Collection 的名称是
myorganization-ruby193
,则主软件包宏被扩展为:myorganization-ruby193
- 运行时子软件包: %name-runtime
- Software Collection 中的 runtime 子软件包拥有 Software Collection 的文件系统,并提供 Software Collection 的 scriptlets。需要安装此软件包,以便用户可以使用 Software Collection。例如,如果 Software Collection 的名称是
myorganization-ruby193
,则 runtime 子宏被扩展为:myorganization-ruby193-runtime
- 构建子软件包: %name-build
- Software Collection 中的 build 子软件包提供 Software Collection 的构建配置。它包含将软件包构建到 Software Collection 所需的 RPM 宏。build 子软件包是可选的,可以在 Software Collection 中排除。例如,如果 Software Collection 的名称是
myorganization-ruby193
,则构建子宏被扩展为:myorganization-ruby193-build
myorganization-ruby193-build
子软件包的内容如下所示:$
cat /etc/rpm/macros.ruby193-config
%scl myorganization-ruby193 - syspaths 子软件包: %name-syspaths
- Software Collection 中的 syspaths 子软件包提供了一种可选的方式,可将方便的 shell 包装程序和符号链接安装到标准路径,从而更改基本系统安装,但在 Software Collection 软件包中使二进制文件更易于使用。例如,如果 Software Collection 的名称是
myorganization-ruby193
,则 syspaths 子宏被扩展为:myorganization-ruby193-syspaths
有关 syspaths 子软件包的详情请参考 第 3.3 节 “提供 syspaths Subpackages”。 - scldevel 子软件包: %name-scldevel
- %name Software Collection 中的 scldevel 子软件包包含开发文件,这些文件在开发依赖于 %name Software Collection 的另一个 Software Collection 的软件包时非常有用。scldevel 子软件包是可选的,可以从 %name Software Collection 中排除。例如,如果 Software Collection 的名称是
myorganization-ruby193
,scldevel 子软件包宏将扩展为:myorganization-ruby193-scldevel
有关 scldevel 子软件包的详情请参考 第 4.1 节 “提供 scldevel 子软件包”。
2.7.2. 创建 Metapackage
在创建新 metapackage 时:
- 在
%scl_package
宏之上定义 metapackage spec 文件顶部的以下宏:scl_name_prefix
指定用作软件集合名称中的前缀的供应商名称,如 myorganization-。这与_scl_prefix
不同,它指定了软件集合的根目录,但也使用供应商的名称。请参阅 第 2.4 节 “Software Collection Prefix” 了解更多信息。scl_name_base
指定 Software Collection 的基本名称,如 ruby。scl_name_version
指定 Software Collection 的版本,例如 193。
- 建议您定义一个 Software Collection 宏
nfsmountable
,它更改配置和状态文件的位置,并使软件集合通过 NFS 提供。如需更多信息,请参阅 第 3.1 节 “通过 NFS 使用 Software Collections”。 - 考虑指定 Software Collection 作为 metapackage 的依赖项,它们对 Software Collection 运行非常重要的所有软件包。这样,您可以确保使用 Software Collection metapackage 安装软件包。
- 建议您在 构建 子软件包中添加
Requires: scl-utils-build
。 - 您不需要在 metapackage 中使用特定于 Software Collection 的宏的条件。
- 在
enable
scriptlet 中包含 Software Collection 中软件包可能需要的任何路径撤销。有关常用路径重新definitions的详情,请参考 第 2.9 节 “常用的路径 Redefinitions”。 - 始终确保 metapackage 在
%prep
部分包含 %setup 宏,否则构建软件集合将失败。如果您不需要在%setup
宏中使用特定选项,请将%setup -c -T
命令添加到%prep
部分。这是因为 %setup 宏定义并创建%buildsubdir
目录,它通常用于在构建时存储临时文件。如果您没有在 Software Collection 软件包中定义 %setup,则%buildsubdir
目录中的文件会被覆盖,从而导致构建失败。 - 将您需要使用的任何宏添加到 构建 子软件包中的
macros.%{scl}-config
文件中。
Metapackage 示例
要了解名为 myorganization-ruby193 的软件集合的典型 metapackage 如下所示,请参阅以下示例:
%global scl_name_prefix myorganization- %global scl_name_base ruby %global scl_name_version 193 %global scl %{scl_name_prefix}%{scl_name_base}%{scl_name_version} # Optional but recommended: define nfsmountable %global nfsmountable 1 %global _scl_prefix /opt/myorganization %scl_package %scl Summary: Package that installs %scl Name: %scl_name Version: 1 Release: 1%{?dist} License: GPLv2+ Requires: %{scl_prefix}less BuildRequires: scl-utils-build %description This is the main package for %scl Software Collection. %package runtime Summary: Package that handles %scl Software Collection. Requires: scl-utils %description runtime Package shipping essential scripts to work with %scl Software Collection. %package build Summary: Package shipping basic build configuration Requires: scl-utils-build %description build Package shipping essential configuration macros to build %scl Software Collection. # This is only needed when you want to provide an optional scldevel subpackage %package scldevel Summary: Package shipping development files for %scl %description scldevel Package shipping development files, especially useful for development of packages depending on %scl Software Collection. %prep %setup -c -T %install %scl_install cat >> %{buildroot}%{_scl_scripts}/enable << EOF export PATH="%{_bindir}:%{_sbindir}\${PATH:+:\${PATH}}" export LD_LIBRARY_PATH="%{_libdir}\${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PATH}}" export MANPATH="%{_mandir}:\${MANPATH:-}" export PKG_CONFIG_PATH="%{_libdir}/pkgconfig\${PKG_CONFIG_PATH:+:\${PKG_CONFIG_PATH}}" EOF # This is only needed when you want to provide an optional scldevel subpackage cat >> %{buildroot}%{_root_sysconfdir}/rpm/macros.%{scl_name_base}-scldevel << EOF %%scl_%{scl_name_base} %{scl} %%scl_prefix_%{scl_name_base} %{scl_prefix} EOF # Install the generated man page mkdir -p %{buildroot}%{_mandir}/man7/ install -p -m 644 %{scl_name}.7 %{buildroot}%{_mandir}/man7/ %files %files runtime -f filelist %scl_files %files build %{_root_sysconfdir}/rpm/macros.%{scl}-config %files scldevel %{_root_sysconfdir}/rpm/macros.%{scl_name_base}-scldevel %changelog * Fri Aug 30 2013 John Doe <jdoe@example.com> 1-1 - Initial package