rpmbuild 不包括符号链接共享对象作为提供
rpmbuild not including symlink shared object as a Provides
我正在构建一个 RPM,它本质上只是打包一组供应商提供的 .so 二进制文件,以便它们可用于我们的内部应用程序,该应用程序也是通过 RPM 安装的。
其中一个库带有多个版本 - libexample_base.so 和 libexample_debug.so(以及其他)。我目前正在尝试打包这些,以便它们都包含在 RPM 中(以便开发人员可以在需要时在它们之间切换),但是通过在 %install 期间创建符号链接来选择 libexample_base.so 作为默认版本,然后获取打包为 RPM 中的文件。
%install
[... Copy the files from the tarball to the buildroot ...]
pushd %{buildroot}%{_libdir}
ln -sf libexample_base.so libexample.so
popd
这很好用...除了一个问题。它使用自动依赖生成,虽然它提供了所有具有实际文件的共享对象,但它没有提供 libexample.so,尽管符号链接在 %files 中并且安装正确。不幸的是,供应商库不提供 SONAME 条目,并且由于它们是二进制 blob,我无法轻松添加它们,因此 RPM 取决于实际文件名。所有下游 RPM 都需要 libexample.so,并且由于此 RPM 未将其列为要求,因此它们由于缺少依赖项而拒绝安装,即使确实有效(ldconfig 可以找到 libexample.so 而没有问题)。
关于如何提示 rpmbuild 解析符号链接的任何想法?
经过一些进一步的研究,我确定我正在尝试做的事情是不可能的,以及为什么。核心问题归结为 rpmbuild 的行为,该行为旨在处理正确生成的带有 SONAME 条目的共享对象。它明确不会将 symlinks 列出到以 .so 结尾的共享对象,因为在正常行为下,它们指向版本化共享对象 (.so.#.#),并且您的应用程序应该依赖于在那些版本化的对象上 - symlink 旨在包含在 devel 包中,只是为了让您的 linker 找到最新版本的方法。
我正在 运行 进入第二种情况,当事情没有正确完成时用作备份 - 对于 RPM 和 GCC,当不存在 SONAME 时,它使用文件名.当我 运行 GCC 时,文件名是 libexample.so(真正的 symlink),并且它没有 SONAME,所以它只是将自己配置为 link 而不是 libexample.so; rpmbuild 看到这一点并将其设置为应用程序 RPM 的要求。然而,由于 rpmbuild 明确地从库 rpm 中排除了那个名称,因为它看起来像一个 devel link,所以没有办法协调这两个 rpm。
解决办法?现在,我正在使用我的解决方法,只是制作文件的副本 - 当存在具有该名称的物理文件时,它就可以工作。正确的方法是修复共享对象,尽管我需要去找上游供应商来完成。
我正在构建一个 RPM,它本质上只是打包一组供应商提供的 .so 二进制文件,以便它们可用于我们的内部应用程序,该应用程序也是通过 RPM 安装的。
其中一个库带有多个版本 - libexample_base.so 和 libexample_debug.so(以及其他)。我目前正在尝试打包这些,以便它们都包含在 RPM 中(以便开发人员可以在需要时在它们之间切换),但是通过在 %install 期间创建符号链接来选择 libexample_base.so 作为默认版本,然后获取打包为 RPM 中的文件。
%install
[... Copy the files from the tarball to the buildroot ...]
pushd %{buildroot}%{_libdir}
ln -sf libexample_base.so libexample.so
popd
这很好用...除了一个问题。它使用自动依赖生成,虽然它提供了所有具有实际文件的共享对象,但它没有提供 libexample.so,尽管符号链接在 %files 中并且安装正确。不幸的是,供应商库不提供 SONAME 条目,并且由于它们是二进制 blob,我无法轻松添加它们,因此 RPM 取决于实际文件名。所有下游 RPM 都需要 libexample.so,并且由于此 RPM 未将其列为要求,因此它们由于缺少依赖项而拒绝安装,即使确实有效(ldconfig 可以找到 libexample.so 而没有问题)。
关于如何提示 rpmbuild 解析符号链接的任何想法?
经过一些进一步的研究,我确定我正在尝试做的事情是不可能的,以及为什么。核心问题归结为 rpmbuild 的行为,该行为旨在处理正确生成的带有 SONAME 条目的共享对象。它明确不会将 symlinks 列出到以 .so 结尾的共享对象,因为在正常行为下,它们指向版本化共享对象 (.so.#.#),并且您的应用程序应该依赖于在那些版本化的对象上 - symlink 旨在包含在 devel 包中,只是为了让您的 linker 找到最新版本的方法。
我正在 运行 进入第二种情况,当事情没有正确完成时用作备份 - 对于 RPM 和 GCC,当不存在 SONAME 时,它使用文件名.当我 运行 GCC 时,文件名是 libexample.so(真正的 symlink),并且它没有 SONAME,所以它只是将自己配置为 link 而不是 libexample.so; rpmbuild 看到这一点并将其设置为应用程序 RPM 的要求。然而,由于 rpmbuild 明确地从库 rpm 中排除了那个名称,因为它看起来像一个 devel link,所以没有办法协调这两个 rpm。
解决办法?现在,我正在使用我的解决方法,只是制作文件的副本 - 当存在具有该名称的物理文件时,它就可以工作。正确的方法是修复共享对象,尽管我需要去找上游供应商来完成。