在 RPM 規範文件中,當找不到文件時,如何找出哪個 %files 行有問題?
我正在使用一個非常繁重的 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 answer,
rpmspec -P
將擴展並列印出規範。但是,它並沒有闡明:$ rpmspec -P unified-rpm/postgresql94.spec | grep '/com/' $
因為這裡似乎有一個神秘的文件。
感謝這個 SO answer,
rpmspec -P
將擴展並列印出規範。它在建構機器上看起來不錯 - 然後我發現它實際上是 CentOS 5
mock
沙箱中的一個問題。沒有
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
我認為引用該特定錯誤沒有任何意義,因為它實際上並沒有解釋問題,也沒有給出解決方法。