可以在rpmbuild上忽略某些特定的自动检测依赖项

时间:2012-08-31 09:37:46

标签: rpm dependency-management rpmbuild rpm-spec

rpmbuild可以通过查找包中包含的二进制文件所需的共享库来自动检测依赖项,虽然这几乎是每次都很好的思考,但是有时候它是不受欢迎的,但仅限于某些特定的库。我指的是某些二进制文件需要通过其rpm包管理未提供给系统但由第三方安装程序直接安装的库的情况。

现在,问题是:有没有办法让自动检测功能保持活动状态(对于包中的其他二进制文件很方便)但忽略/删除这些特定的库?

这样的东西
AutoReqIgnore : library1
AutoReqIgnore : library2

3 个答案:

答案 0 :(得分:3)

我没有找到内置方式,但我wrote a small script that I used as a filter

#!/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/下的源tarball中。

答案 1 :(得分:3)

As of rpm-4.9 (Fedora 15), rpm has a standard method to enable filtering自动生成的依赖项。

例如,你可以写

%global __requires_exclude ^libthirdpartyplugin.so$

答案 2 :(得分:0)

旧版rpm-4.8和更旧的版本(CentOS 6.x)不会过滤自动检测到的依赖项。但是,有一种解决方法:

将有问题的库在rpmbuild之前压缩,然后在安装后用枪压缩。对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.solibyy.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

你去了。安装RPM时,不再抱怨缺少libextra-3rdparty-stuff.so