最近,我需要确保我们的软件可以使用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)
.但生成的RPM仍然包含这些系统目录:(
作为一个临时的复制,我一直在使用文件冲突中给出的提示来安装带有"Filesystem"的包,即使用该rpmrebuild
实用程序删除该%files
部分中的这些系统目录条目.显然,这根本不是解决方法.
有人找到了更好的方法吗?
我等不起了.因此,查看最新的cmake
3.0.0版本,CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST
新版本支持具有合理默认值的变量
[编辑]在查看2.8.12的文档时,该对也受到旧版本的支持.
由于cmake
源自带CMakeLists.txt
文件,并可以生成包开箱即用的,包括RPM(虽然我需要调整,以适应RHEL的包命名规则的设置,但是这并不难做到),所以我只是说干就干第一自举cmake-3.0.0
用cmake 2.8.11
,rpmrebuild -pe
修复所产生的cmake
3.0 .0 RPM,yum
安装它,然后用它来做第二个bootstrap.现在一切都很好.问题解决了.
我的离别思想是kitware应该更好地编写文档.描述很多变量的方式是密集甚至令人困惑的 - 缺乏示例是一个明显的缺陷.
此外,kitware应该吃自己的dogfood:提供使用cmake构建cmake的说明,而不是使用autotools x-(