cpack生成具有与RPM规范冲突的%文件条目的RPM。怎么修?

时间:2014-07-27 16:49:01

标签: cmake rpm cpack

最近,我需要确保我们的软件可以使用cpack打包用于RHEL 7及其免费重建(例如CentOS 7)。尽管如此,我一直存在一个RHEL 6.x及其免费重建并不存在的问题:cpack生成的RPM都在其%files部分系统目录条目中有如下所示:

%dir %attr(0755, root, root) "/"
%dir %attr(0755, root, root) "/usr"
%dir %attr(0755, root, root) "/usr/bin"
%dir %attr(0755, root, root) "/usr/share"
%dir %attr(0755, root, root) "/usr/share/applications"
%dir %attr(0755, root, root) "/usr/share/doc"
%dir %attr(0755, root, root) "/usr/share/icons"
%dir %attr(0755, root, root) "/usr/share/icons/hicolor"
%dir %attr(0755, root, root) "/usr/share/icons/hicolor/scalable"
%dir %attr(0755, root, root) "/usr/share/icons/hicolor/scalable/apps"enter code here

不应该由包声明。

AFAIK,这个要求已经在RPM规范中存在多年,但仅在RPM的最新版本(即比4.8.0更新)中强制实施。由于RHEL 7与RPM 4.11.1捆绑在一起,因此cpack生成的filesystem-3.2-18.el7.x86_64现在与yum install ...冲突,file / from install of tunesviwer-1.4-2.noarch conflicts with file from package filesystem-3.2-18.el7.x86_64 file /usr/bin from install of tunesviewer-1.4-2.noarch conflicts with file from package filesystem-3.2-18.el7.x86_64 [...] 期间出现如下错误:

cmake

我尝试使用由以下内容组成的小型set(CPACK_RPM_SPEC_MORE_DEFINE "%define ignore \#") set(CPACK_RPM_USER_FILELIST "%ignore /" "%ignore /usr" "%ignore /usr/bin" "%ignore /usr/share" "%ignore /usr/share/applications" "%ignore /usr/share/doc" "%ignore/usr/share/icons" "%ignore /usr/share/icons/hicolor" "%ignore /usr/share/icons/hicolor/scalable" "%ignore /usr/share/icons/hicolor/scalable/apps") 模块:

CMakeLists.txt

并将其包含在include(CPack) rpmrebuild之前。但生成的RPM仍包含这些系统目录:(

作为一个临时的复制,我一直在使用File conflict for installing a package with "Filesystem"中给出的提示,即使用%files实用程序删除{{1}}部分中的这些系统目录条目。显然,这根本不是解决方法。

有人找到了更好的方法吗?

1 个答案:

答案 0 :(得分:10)

我等不起。因此,查看最新的cmake 3.0.0版本,新版本支持具有合理默认值的变量CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST

[编辑]在查看2.8.12的文档时,该版本也受旧版本的支持。

由于cmake源附带CMakeLists.txt文件,并且可以生成包OOTB,包括RPM(虽然我需要调整设置以适应RHEL的包命名约定,但这并不难),所以我只是先使用cmake-3.0.0 cmake 2.8.11启动rpmrebuild -pe,以修复生成的cmake 3.0.0 RPM,yum安装它,然后使用它做第二次自举。现在一切都很好。问题解决了。

我的离别思想是kitware应该更好地编写文档。描述很多变量的方式很密集甚至令人困惑 - 缺乏一个例子是一个明显的缺陷。

此外,kitware应该吃自己的dogfood:提供使用cmake构建cmake的说明,而不是使用autotools x - (

相关问题