Rpm

在 RPM 規範文件中,當找不到文件時,如何找出哪個 %files 行有問題?

  • August 13, 2014

我正在使用一個非常繁重的 RPM 規範文件,並且在建構它時產生了一個錯誤,我似乎無法追踪:

File not found: /var/tmp/pkgnamehere/mockbuild/usr/com/pgsql

(我已經用上面的“pkgnamehere”替換了完整的包 buildroot 路徑,但它沒有被編輯)。

%files 中沒有/usr/com/pgsql任何內容,實際上也沒有/com/

想必這是宏觀擴張的結果。問題是……如何找出哪一%files行對應於給定的失去文件?它沒有說“第 554 行的 %files 中的文件未找到:”或類似的有用資訊。

許多實際的%files行看起來像:

%config(noreplace) %{_initrddir}/%{oname}-%{majorversion}

所以簡單的文本搜尋在這裡沒有用。

每行都可以rpm --eval,但是對於超過 300 個文件行並且需要定義所有輸入宏,這非常痛苦。

尖端?

$ rpm --version
RPM version 4.11.2
$ lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-ia32:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-ia32:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-ia32:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: Fedora
Description:    Fedora release 20 (Heisenbug)
Release:        20
Codename:       Heisenbug
$ mock --version
1.1.41

感謝這個 SO answerrpmspec -P將擴展並列印出規範。但是,它並沒有闡明:

$ rpmspec -P unified-rpm/postgresql94.spec | grep '/com/'
$ 

因為這裡似乎有一個神秘的文件。


感謝這個 SO answerrpmspec -P將擴展並列印出規範。

它在建構機器上看起來不錯 - 然後我發現它實際上是 CentOS 5mock沙箱中的一個問題。

沒有rpmspec,所以很難判斷發生了什麼。但是我偶然發現了這個錯誤,這表明這是 RHEL5 上的 RPM 的問題。果然,在沙箱中:

<mock-chroot>[root@ayaki BUILD]# rpm --eval '%_sharedstatedir'
/usr/com

我說….什麼!?

因此,可以解決眼前的問題:

%if 0%{rhel5}
%define _sharedstatedir /var/lib
%endif

也許:

%if "%{_sharedstatedir}" == "/usr/com"
# See https://bugzilla.redhat.com/show_bug.cgi?id=894903
%define _sharedstatedir /var/lib
%endif

…但無論如何,基本問題仍然存在:您如何讓 RPM 告訴您哪一%files行對應於失去的文件?

問題不是 Fedora 20,也不是 Mock。這是 RHEL 5。

RPM 宏在 RHEL 4 和 RHEL 5 中都%{_sharedstatedir}設置為%{prefix}/com。問題是宏從未用於建構這些發行版,因此沒有人關注它的價值。當人們開始從後來使用宏的 Fedora反向移植軟體包時,這才成為一個問題。

當然,因為 RHEL 是一個“穩定的”企業發行版,旨在在其生命週期內不破壞兼容性,所以這永遠不會改變。

該宏在 RHEL 6 和 7 中按預期工作。

如果您仍然需要支持 RHEL 5 機器,那麼您(和其他所有人)就會陷入您已經提出的解決方法中。簡單乾淨的是你建議的第一個:

%if 0%{rhel5}
%define _sharedstatedir /var/lib
%endif

我認為引用該特定錯誤沒有任何意義,因為它實際上並沒有解釋問題,也沒有給出解決方法。

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