在RPM规范文件中,找不到文件时,如何找出哪个%文件行出错?

我正在处理一个非常macros大的RPM规格文件,当它构build它产生一个错误,我似乎无法追查:

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

(我已经用上面的“pkgnamehere”replace了完整的包buildrootpath,但是未经编辑)。

在%文件中没有/usr/com/pgsql ,实际上也没有/com/

据推测这是macros观扩张的结果。 麻烦是…如何找出哪个%files行对应于一个给定的丢失文件? 它不会说“从第554行的%文件找不到文件”或其他任何有用的东西。

许多实际的%files行看起来像:

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

所以简单的文本search在这里没有用。

rpm --eval可以rpm --eval ,但是对于超过300个文件行以及需要定义所有inputmacros来说,这是非常痛苦的。

提示?

 $ 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 

由于这个答案 , rpmspec -P将扩展并打印出一个规范。 但是,它并没有说明什么:

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

在这里似乎有一个神秘的文件。


由于这个答案 , rpmspec -P将扩展并打印出一个规范。

在构build机器上看起来很好 – 然后我发现它实际上是CentOS 5 mock沙盒中的一个问题。

那里没有rpmspec ,所以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行对应于缺less的文件?

问题不是Fedora 20,也不是模拟。 这是RHEL 5。

在RHEL 4和RHEL 5中,RPMmacros%{_sharedstatedir}被设置为%{prefix}/com 。问题在于macros从未用于构build这些分布,因此没有人注意到它的值。 只有当人们开始使用这个macros后来从后来的Fedora 套装软件包时才成为一个问题。

而且,当然,由于RHEL是一个“稳定的”企业分布,旨在不破坏其生命周期中的兼容性,所以这绝不会改变。

macros在RHEL 6和7中按照您的预期工作。

如果您仍然需要支持RHEL 5盒,您(以及其他人)都会遇到像您已经提出的解决方法。 简单而干净的是你build议的第一个:

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

我没有看到任何指向特定错误的意思,因为它实际上并没有解释问题,也没有提供解决方法。