CPack 将系统目录添加到生成的 RPM

Posted

技术标签:

【中文标题】CPack 将系统目录添加到生成的 RPM【英文标题】:CPack adds system directories to generated RPM 【发布时间】:2016-10-17 22:37:47 【问题描述】:

我有一个 CMake 项目,我使用 CPack 为我的 CentOS YUM 存储库生成 RPM。但是,当我尝试安装生成的 RPM 时,出现此错误:

file /usr from install of clstrd-0.1.0-1.x86_64 conflicts with file from package filesystem-3.2-20.el7.x86_64
file /usr/bin from install of clstrd-0.1.0-1.x86_64 conflicts with file from package filesystem-3.2-20.el7.x86_64
file /usr/lib from install of clstrd-0.1.0-1.x86_64 conflicts with file from package filesystem-3.2-20.el7.x86_64

进一步检查 RPM 的内容,我发现它包含以下文件和目录:

$ rpm -qlp clstrd-0.1.0-Linux.rpm
/usr
/usr/bin
/usr/bin/clstrd
/usr/lib
/usr/lib/libclstrd.a

我的问题是:如何强制 CMake 从 RPM 中排除常见目录,如 /usr/usr/bin?这不应该自动完成吗?

我试过CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION,但没有成功。

编辑:以下是我CMakeLists.txt的相关部分

# Targets
add_library(clstrd_lib $SOURCE_FILES)
...
add_executable(clstrd main.cpp)
target_link_libraries(clstrd clstrd_lib)
...
# Installation configuration.
install(TARGETS clstrd_lib clstrd
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin)

# CPack configuration.
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MyAwesomePackage")
set(CPACK_PACKAGE_VENDOR "MyAwesomeVendor")
set(CPACK_PACKAGE_DESCRIPTION_FILE "$CMAKE_CURRENT_SOURCE_DIR/README.md")
set(CPACK_RESOURCE_FILE_LICENSE "$CMAKE_CURRENT_SOURCE_DIR/LICENSE.md")
set(CPACK_PACKAGE_VERSION_MAJOR "0")
set(CPACK_PACKAGE_VERSION_MINOR "1")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake $CMake_VERSION_MAJOR.$CMake_VERSION_MINOR")
set(CPACK_PACKAGE_EXECUTABLES "clstrd", "MyAwesomeExecutable")
set(CPACK_RPM_PACKAGE_AUTOREQPROV " no")
set(CPACK_RPM_PACKAGE_REQUIRES, "libpqxx, gtest, gflags, root,     root-netx, xrootd-client-libs")
set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION, "/usr /usr/bin /usr/lib")
set(CPACK_SOURCE_GENERATOR "RPM")
include(CPack)

【问题讨论】:

你也使用CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST 吗?可以发一下CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION 的用法吗,可能是你用错了 看这里:public.kitware.com/Bug/view.php?id=13609 @nos 不,我编辑了帖子,以便您可以看到我的明确用法。 @ChrisMaes 谢谢,你是对的。最好的一种正确。我使用的是 v2.8.11(EPEL 上的最新 v2),此错误已在即将发布的版本中修复。通过转换到 CMake3 和 CPack3 修复。 @PetrMánek;别客气。我将此添加为答案,以便人们可以看到问题已解决。 【参考方案1】:

你可以试试这个,

列表(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/lib") 列表(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/lib/systemd") 列表(APPEND CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/lib/systemd/system")

使用 cmake 2.8.12.2 在 CentOS7 上测试 OK。

【讨论】:

【参考方案2】:

这似乎是 cmake 2.8.9 中的错误,已在 cmake 2.8.12 中修复:

https://public.kitware.com/Bug/view.php?id=13609

【讨论】:

以上是关于CPack 将系统目录添加到生成的 RPM的主要内容,如果未能解决你的问题,请参考以下文章

更改组件 RPM 的 cpack 生成名称

自定义第三方YUM源

cpack 生成带有 %files 条目的 RPM,这些条目与 RPM 规范冲突。怎么修?

仅在 CPack 中将文件添加到 ARCHIVE 包

戴尔inspiron15 3537 安装linux系统,在哪下linux网卡驱动

CPack 文件列表与文件系统冲突