CentOS 6.3 64 位上的 rpmbuild - 依赖关系损坏

CentOS 6.3 64 位上的 rpmbuild - 依赖关系损坏

我正在尝试在 64 位 CentOS 6.3 服务器上使用 rpmbuild 构建一个包。

文件如下spec

Name:           test-fms
Version:        1.0
Release:        1%{?dist}
Summary:        my FMS Package
Group:          Applications/Internet
License:        Nobody.
URL:            http://www.bla.com


Provides: test-fms = %{version}-%{release}

%description
test FMS server.

%prep

%build

%install
mkdir -p $RPM_BUILD_ROOT
cp -r /workspace/%{name}/* $RPM_BUILD_ROOT/

%post

%clean
\rm -rf %{buildroot}

%files
%defattr(-,root,root,-)
/opt/adobe/fms

当尝试在另一台 64 位 CentOS 6.3 服务器上安装该包时,我收到以下错误:

--> Finished Dependency Resolution
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: /usr/local/bin/perl
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: librt.so.1
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libc.so.6
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libc.so.6(GLIBC_2.0)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libc.so.6(GLIBC_2.4)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libstdc++.so.6(GLIBCXX_3.4)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libpthread.so.0(GLIBC_2.1)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libpthread.so.0(GLIBC_2.0)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libgcc_s.so.1(GCC_3.0)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libgcc_s.so.1
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libc.so.6(GLIBC_2.1)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libcurl.so.3
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libstdc++.so.6
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libstdc++.so.6(CXXABI_1.3)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libdl.so.2
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libpthread.so.0(GLIBC_2.3.2)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libpthread.so.0
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libc.so.6(GLIBC_2.1.3)
Error: Package: test-fms-1.0-1.el6.x86_64 (myrepo)
           Requires: libm.so.6
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

尽管 RPM 是基于 64 位构建的,但它需要 32 位软件包,例如,对于软件包glibc,我安装了 64 位软件包,但 RPM 依赖项需要libc.so.6

[root@test ~]# yum provides libc.so.6
Loaded plugins: downloadonly, fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.spd.co.il
 * extras: centos.spd.co.il
 * updates: centos.spd.co.il
updates/primary_db     | 4.6 MB     00:04     
glibc-2.12-1.80.el6.i686 : The GNU libc libraries
Repo        : base
Matched from:
Other       : libc.so.6

在对 spec 文件进行一段时间的操作后,我注意到如果我%files从 spec 文件中删除该部分,那么就不需要任何要求了。

我该如何修复这个问题?我做错了什么?

为什么 RPM 会自动添加要求?我能以某种方式控制它吗?

答案1

您正在将 32 位二进制文​​件放入 64 位软件包中。请勿这样做。请改用--targetof进行构建i386

答案2

问题:

在阅读 Ignacio Vazquez-Abrams 的回答后,我意识到 rpmbuild 正在生成一个自动需求列表。然后,在谷歌上搜索了一两个之后,我找到了自动依赖项页面上显示:

当 RPM 构建软件包时,如果软件包的 %files 列表中的任何文件是共享库,则该库的 soname 会自动添加到软件包提供的功能列表中。soname 是用于确定库的不同版本之间兼容性的名称。

...

RPM 通过对软件包 %files 列表中的每个可执行程序运行 ldd 来实现这一点。由于 ldd 提供了每个程序所需的共享库列表,因此等式的两半都是完整的 — 也就是说,RPM 跟踪了提供共享库的软件包和需要这些共享库的软件包。然后,RPM 可以在安装、升级或删除软件包时考虑这些信息。

解决方案:

页面底部写着:

有时可能不需要 RPM 的自动依赖性处理。在这些情况下,可以使用 autoreqprov 标记来禁用它。此标记采用 yes/no 或 0/1 值。例如,要禁用自动依赖性处理,可以使用以下行:

AutoReqProv:否

所以我将其添加AutoReqProv: no 到我的 spec 文件中(之后Provides)部分,所有不好的依赖关系都消失了!

警告:

正如 Ignacio Vazquez-Abrams 所写,通常这是一个糟糕的解决方案。通常,您希望删除所有 32 位二进制文​​件,只留下 64 位二进制文​​件。我的解决方案对我来说是可行的,因为我正在基于其他人的代码构建 RPM,并且我不想开始对他的文件进行排序。另一方面,我确实知道我的 rpm 需要哪些依赖项,我可以自己写下来。如果您的情况如此 - 请使用标志AutoReqProv: no。否则 - 听从 Ignacio 的非常好的建议并获取 32 位代码。

相关内容