rpmbuild 可以通过查找包中包含的二进制文件所需的共享库来自动检测依赖关系,虽然这几乎每次都是一个好的想法,但有时它是不可取的,但仅适用于某些特定的库。我指的是某些二进制文件需要的库不是通过其 rpm 包管理提供给系统但由第三方安装程序直接安装的情况。
现在,问题是:有没有办法保持自动检测功能处于活动状态(对于包中的其他二进制文件很方便)但只忽略/删除这些特定的库?
就像是
AutoReqIgnore : library1
AutoReqIgnore : library2
rpmbuild 可以通过查找包中包含的二进制文件所需的共享库来自动检测依赖关系,虽然这几乎每次都是一个好的想法,但有时它是不可取的,但仅适用于某些特定的库。我指的是某些二进制文件需要的库不是通过其 rpm 包管理提供给系统但由第三方安装程序直接安装的情况。
现在,问题是:有没有办法保持自动检测功能处于活动状态(对于包中的其他二进制文件很方便)但只忽略/删除这些特定的库?
就像是
AutoReqIgnore : library1
AutoReqIgnore : library2
从 rpm-4.9 (Fedora 15) 开始,rpm 有一个标准方法可以过滤自动生成的依赖项。
例如,你可以写
%global __requires_exclude ^libthirdpartyplugin.so$
我还没有找到内置的方法,但我写了一个小脚本用作过滤器:
#!/usr/bin/perl -w
use strict;
use IPC::Open2;
# This quick script will run the native find-requires (first parameter)
# and then strip out packages we don't want listed.
open2(\*IN, \*OUT, @ARGV);
print OUT while (<STDIN>);
close(OUT);
my $list = join('', <IN>);
# Apply my filter(s):
$list =~ s/^libqt-mt.so.*?$//mg;
print $list;
您可以放置自己的正则表达式行,在此示例中我删除了libqt-mt.so.*
然后,在.spec
文件中:
# Note: 'global' evaluates NOW, 'define' allows recursion later...
%global _use_internal_dependency_generator 0
%global __find_requires_orig %{__find_requires}
%define __find_requires %{_builddir}/%{?buildsubdir}/build/find-requires %{__find_requires_orig}
如您所见,此脚本位于源代码压缩包中的/build/
.
旧版rpm-4.8
和旧版 (CentOS 6.x) 没有过滤自动检测到的依赖项。但是,有一个解决方法:
在 rpmbuild 之前 Gzip 有问题的库,并在安装后对其进行 gunzip。然后 rpmbuild 的依赖关系检测将忽略该文件。
示例情况:
你的awesome-project-1.2.3-4.i686.rpm
包含
libfoo.so
这取决于libxx.so
libbar.so
这取决于libyy.so
libbah.so
这取决于libextra-3rdparty-stuff.so
不是通过 RPM 运送的您希望在 RPM 的依赖项中有libxx.so
and libyy.so
,而不是libextra-3rdparty-stuff.so
.
现在做 rpm 规范文件的技巧,说awesome-project.spec
:
%prep
gzip "$RPM_BUILD_ROOT/usr/lib/libbah.so"
exit
%post
gunzip -f "$RPM_INSTALL_PREFIX/usr/lib/libbah.so.gz
exit
%preun
gzip "$RPM_INSTALL_PREFIX/usr/lib/libbah.so" # so that `rpm -e` doesn't complain about missing file
exit
你去吧。libextra-3rdparty-stuff.so
安装 RPM 时不再抱怨丢失。