我正在使用一个非常繁重的 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 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 机器,那么您(和其他所有人)就会陷入您已经提出的解决方法中。简单干净的是你建议的第一个:
我认为引用该特定错误没有任何意义,因为它实际上并没有解释问题,也没有给出解决方法。