我正在处理一个非常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
我没有看到任何指向特定错误的意思,因为它实际上并没有解释问题,也没有提供解决方法。