Yum

CentOS 6.3 64 位上的 rpmbuild - 依賴關係中斷

  • February 16, 2013

我正在嘗試在 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

在使用規範文件一段時間後,我注意到如果我%files從規範文件中刪除部分,則不需要任何要求。

我怎樣才能解決這個問題?我究竟做錯了什麼?

為什麼 RPM 會自動添加需求?我能以某種方式控制它嗎?

問題:

在閱讀了 Ignacio Vazquez-Abrams 的回答後,我意識到 rpmbuild 正在生成一個自動需求列表。比,在一兩個 goole 之後,我找到了Automatic Dependencies頁面,上面寫著:

當一個包由 RPM 建構時,如果包的 %files 列表中的任何文件是共享庫,則該庫的 soname 會自動添加到包提供的功能列表中。soname 是用於確定庫的不同版本之間的兼容性的名稱。

RPM 通過在包的 %files 列表中的每個可執行程序上執行 ldd 來做到這一點。由於 ldd 提供了每個程序所需的共享庫列表,因此等式的兩半都是完整的——也就是說,使共享庫可用的包和需要這些共享庫的包都由 RPM 跟踪。然後,RPM 可以在安裝、升級或刪除軟體包時考慮該資訊。

解決方案:

在頁面底部它說:

有時可能不需要 RPM 的自動依賴處理。在這些情況下,可以使用 autoreqprov 標籤來禁用它。此標記採用是/否或 0/1 值。例如,要禁用自動依賴處理,可以使用以下行:

AutoReqProv:沒有

因此,我已將 添加AutoReqProv: no 到我的規範文件(在 之後Provides)部分,並且所有不良依賴關係都消失了!

警告:

正如 Ignacio Vazquez-Abrams 所寫,通常這是一個糟糕的解決方案。通常,您希望擺脫所有 32 位二進製文件而只保留 64 位二進製文件。我的解決方案對我有用,因為我正在基於別人的程式碼建構 RPM,並且我不想開始對他的文件進行排序。另一方面,我確實知道我的 rpm 需要哪些依賴項,我可以自己寫下來。如果您遇到這種情況 - 請使用該AutoReqProv: no標誌。否則 - 接受 Ignacio 非常好的建議並獲得 32 位程式碼的裝備。

您將 32 位二進製文件放入 64 位包中。不要這樣做。--target改為使用of建構i386

引用自:https://serverfault.com/questions/460754