3.5. Software Collection Library 支持
如果您只分发要在 Software Collection 环境中使用的库,或者除了系统中可用的库外,更新
enable
scriptlet 中的 LD_LIBRARY_PATH
环境变量,如下所示:
export LD_LIBRARY_PATH="%{_libdir}\${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PATH}}"
配置可确保,如果启用了 Software Collection,则 Software Collection 中的库版本优先于系统上可用的库版本。
注意
如果您在 Software Collection 中发布私有共享库,请考虑使用
DT_RUNPATH
属性而不是 LD_LIBRARY_PATH
环境变量,以便在 Software Collection 环境中访问私有共享库。
3.5.1. 使用 Software Collection 之外的库
如果您要在 Software Collection 环境之外分发要使用的库,您可以使用目录
/etc/ld.so.conf.d/
来实现这一目的。
警告
对于系统上已可用的库,不要使用
/etc/ld.so.conf.d/
。只有在系统中不可用的库才建议使用 /etc/ld.so.conf.d/
,否则 Software Collection 中的库版本可能会优先于库的系统版本。这可能会导致应用程序的系统版本不必要的行为,包括意外终止和数据丢失。
过程 3.4. 将 /etc/ld.so.conf.d/ 用于 Software Collection 中的库
- 创建名为
%{?scl_prefix}libs.conf
的文件并相应地调整 spec 文件配置:SOURCE2: %{?scl_prefix}libs.conf
- 在
%{?scl_prefix}libs.conf
文件中,包括一个与 Software Collection 关联的库版本所在的目录列表。例如:/opt/provider/software_collection_1/root/usr/lib64/
在上例中,作为 Software Collection software_collection_1 一部分的/usr/lib64/
目录包含在列表中。 - 编辑 spec 文件的
%install
部分,因此%{?scl_prefix}libs.conf
文件已安装,如下所示:%install install -p -c -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{?scl:%_root_sysconfdir}%{!?scl:%_sysconfdir}/ld.so.conf.d/
3.5.2. 使用 Software Collection Name 为 Library Major soname 前缀
当使用 Software Collection 中包含的库时,请始终记住,具有相同主要 soname 的库可作为基本系统安装的一部分在系统中可用。因此,不要忘记在根据 Software Collection 中包含的库构建应用程序时使用 scl enable 命令。如果不这样做可能会导致应用程序在不正确的环境中执行,并与库的系统版本相关联。
警告
请记住,在不正确的环境中(例如在系统环境中而不是 Software Collection 环境中)中执行应用程序,并将应用程序链接到不正确的库可能会导致应用程序的行为(包括意外终止和数据丢失)。
要确保您的应用程序没有与不正确的库相关联,即使
LD_LIBRARY_PATH
环境变量没有正确设置,请更改 Software Collection 中包含的库的主要 soname。更改主 soname 的建议方法是使用 Software Collection 名称为主 soname 版本号添加前缀。
以下是带有
mysql55-
前缀的 MySQL 客户端库示例:
$
rpm -ql mysql55-mysql-libs | grep 'lib.*so'
/opt/provider/mysql55/root/usr/lib64/mysql/libmysqlclient.so.mysql55-18 /opt/provider/mysql55/root/usr/lib64/mysql/libmysqlclient.so.mysql55-18.0.0
在同一系统中,以下列出了 MySQL 客户端库的系统版本:
$ rpm -ql mysql-libs | grep 'lib.*so'
/usr/lib64/mysql/libmysqlclient.so.18
/usr/lib64/mysql/libmysqlclient.so.18.0.0
rpmbuild 工具为包含版本共享库的软件包生成自动
Provides
标签。如果您没有按照上述描述为 soname 前缀,那么如果 mysql 软件包为 libmysqlclient.so.18()(64bit)
,则为 Provides
的示例。在这个 Provides
中,RPM 可以选择不正确的 RPM 软件包,从而导致应用程序缺少要求。
如果您按照上述描述为 soname 加上前缀,那么如果 mysql 为
Provides
,则生成的 libmysqlclient.so.mysql55-18()(64bit)
示例是。在这个 Provides
中,RPM 选择正确的 RPM 依赖项,并满足应用程序的要求。
通常,除非绝对需要,否则 Software Collection 软件包不应该提供已经由基本系统安装的软件包提供的任何符号。规则的一个例外是在使用基本系统安装的软件包中的符号时。
3.5.3. Red Hat Enterprise Linux 7 中的 Software Collection Library 支持
为 Red Hat Enterprise Linux 7 构建 Software Collection 时,请使用
%__provides_exclude_from
宏以防止扫描某些文件以自动生成 RPM 符号。
例如,为了避免扫描
%{_libdir}
目录中的 .so
文件,请在 Software Collection spec 文件中的 BuildRequires
或 Requires
标签前面添加以下行:
%if %{?scl:1}%{!?scl:0} # Do not scan .so files in %{_libdir} %global __provides_exclude_from ^%{_libdir}/.*.so.*$ %endif
功能是自动
Provides
和 Requires
的 RPM 支持的一部分,如需更多信息,请参阅 第 2.10.5 节 “Software Collection Automatic Provides and Requires and Filtering Support”。