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
在使用規範文件一段時間後,我注意到如果我
%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
。