rpmbuild在CentOS 6.3 64位 – 破坏的依赖关系

我试图在64位CentOS 6.3服务器上使用rpmbuild来构build一个包。

这里是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 

尽pipeRPM构build在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文件一段时间后,我注意到,如果我从spec文件中删除%files部分,比不需要任何要求。

我怎样才能解决这个问题? 我究竟做错了什么?

为什么RPM会自动添加要求? 我可以控制它吗?

您将32位二进制文​​件放在64位软件包中。 不要这样做。 用一个i386代替。

问题:

读完Ignacio Vazquez-Abrams之后,我意识到rpmbuild正在生成一个自动需求列表。 比起一两句话后,我发现了自动相关性页面,它说:

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

RPM通过在程序包的%files列表中的每个可执行程序上运行ldd来执行此操作。 由于ldd提供了每个程序需要的共享库的列表,因此等式的两半都是完整的 – 也就是说,共享库可用的软件包以及需要这些共享库的软件包由RPM进行跟踪。 然后,RPM可以在安装,升级或擦除软件包时考虑到这些信息。

解决scheme:

在页面的底部,它说:

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

AutoReqProv:不

所以我已经将AutoReqProv: no添加到了我的spec文件(在Provides ),并且所有不良依赖都消失了!

警告:

正如Ignacio Vazquez-Abrams写的,通常这是一个不好的解决scheme。 通常情况下,你想摆脱所有的32位二进制文​​件,只留下64位的二进制文件。 我的解决scheme工作,因为我build立一个基于别人的代码的RPM,我不想开始sorting他的文件。 另一方面,我知道我的rpm需要什么依赖,我可以自己写下来。 如果这是你的情况 – 使用AutoReqProv: no标志。 否则 – 采取Ignacio非常好的build议,并获得32位代码的钻井平台。