【问题标题】:'CPACK_RPM_PACKAGE_AUTOPROV' doesn't work when pack existing binaries with CPack使用 CPack 打包现有二进制文件时,“CPACK_RPM_PACKAGE_AUTOPROV”不起作用
【发布时间】:2016-03-25 06:33:11
【问题描述】:

在我的项目中,我使用cmake构建构建系统,我需要用ExternalProject_add构建一个外部项目(这里以zeromq为例),然后将编译好的二进制文件打包到一个RPM包中,但我需要生成的RPM 有正确的“提供”信息来告诉它提供了哪些库,如下所示

libzmq.so.5()(64bit)
zeromq = 4.1.2-1.el7
zeromq(x86-64) = 4.1.2-1.el7

但是不知何故,将 CPACK_RPM_PACKAGE_AUTOPROV 设置为 1,构建的 RPM 仍然没有正确的 'PROVIDES' 信息,我将在下面得到 'PROVIDES' 信息,而没有提供的库信息

zeromq = 4.1.2-1
zeromq(x86-64) = 4.1.2-1

CMakeLists.txt(只是一些关键内容)是

cmake_minimum_required (VERSION 3.4.0 FATAL_ERROR)    
set(COMP zeromq)
set(CompVersion 4.1.2)
set(CompURL http://download.zeromq.org/zeromq-${CompVersion}.tar.gz)
set(CompMD5 159c0c56a895472f02668e692d122685)

project(${COMP}  VERSION ${CompVersion})
include(ExternalProject)

ExternalProject_add(${COMP}
  PREFIX            ${COMP}
  URL               ${CompURL}
  URL_MD5           ${CompMD5}
  CONFIGURE_COMMAND <SOURCE_DIR>/configure --without-libsodium --prefix=${CMAKE_INSTALL_PREFIX})

install(FILES ${CMAKE_INSTALL_PREFIX}/lib/libzmq.so.5
              ${CMAKE_INSTALL_PREFIX}/lib/libzmq.so
              ${CMAKE_INSTALL_PREFIX}/lib/libzmq.so.5.0.0
        DESTINATION lib64)

string(REPLACE "." ";" VERSION_LIST ${PROJECT_VERSION})
list(LENGTH VERSION_LIST VERSION_LIST_LENGTH)
list(GET VERSION_LIST 0 CPACK_PACKAGE_VERSION_MAJOR)
list(GET VERSION_LIST 1 CPACK_PACKAGE_VERSION_MINOR)
if(VERSION_LIST_LENGTH GREATER 2)
  list(GET VERSION_LIST 2 CPACK_PACKAGE_VERSION_PATCH)
endif()


set(CPACK_GENERATOR "RPM")
set(CPACK_PACKAGE_VENDOR "Test")
set(CPACK_RPM_PACKAGE_GROUP "3rd-party-software")
set(CPACK_RPM_PACKAGE_AUTOPROV 1)
set(CPACK_RPM_PACKAGE_AUTOREQ 0)

set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION
  /usr/lib
  /usr/lib64)
set(CPACK_RPM_COMPONENT_INSTALL OFF)

include(CPack)

有人知道为什么这个“CPACK_RPM_PACKAGE_AUTOPROV”选项不生效吗?如何让它在 RPM 中自动生成这些“提供”信息?感谢您的宝贵时间,如果您能提供一些提示,我们将不胜感激。

【问题讨论】:

    标签: cmake rpm cpack


    【解决方案1】:

    CPACK_RPM_PACKAGE_AUTOPROV 变量,由其description

    可用于启用(1,是)或禁用(0,否)包提供的共享库的自动列表。

    仅影响由add_library(SHARED) 创建的目标

    CMake 和 CPack 都不会尝试从其扩展名中推断文件的类型,这就是手动安装的文件(通过 install(FILES))不受影响的原因。

    要将给定文件添加到 PROVIDES 列表,请使用变量 CPACK_RPM_PACKAGE_PROVIDES

    可用于设置 RPM 依赖项(提供)。提供的 RPM 文件的包列表可以打印:

    rpm -qp --提供文件.rpm

    【讨论】:

    • 谢谢,但奇怪的是,对于同一个项目,如果启用“CPACK_RPM_PACKAGE_AUTOREQ”,它会起作用并在 RPM 包中生成“REQUIRENAME”信息。据我了解,如果该选项仅适用于“add_library”添加的库,则“CPACK_RPM_PACKAGE_AUTOREQ”选项的行为应该相同,对吧?
    • 我需要添加很多这样的项目,如果手动添加'PROVIDES'信息,它需要很多时间。但仍然感谢:)
    • 选项CPACK_RPM_PACKAGE_AUTOREQ 是否检测库,libzmq.so 依赖于哪个库?或者此选项与该 3d 方库有何关联?
    • 我不知道,但是启用 CPACK_RPM_PACKAGE_AUTOREQ 后,以下信息将添加到 RPM /bin/sh /bin/sh /bin/sh libzmq.so.5()(64bit) 的 REQUIRENAME 中rpmlib(CompressedFileNames)
    • @Tsyvarev 实际上有一个更简单的解决方案来解决这个问题。请参阅下面的答案:)
    【解决方案2】:

    使用install(PROGRAMS 代替install(FILES 在rpm 中为.so 文件生成正确的provides(至少在cmake 3.13 中)。根据the documentation

    PROGRAMS 表单与 FILES 表单相同,只是已安装文件的默认权限还包括 OWNER_EXECUTE、GROUP_EXECUTE 和 WORLD_EXECUTE。此表单旨在安装非目标程序,例如 shell 脚本。

    也许文档可以添加它也适用于共享库。

    如果您想坚持使用CPACK_RPM_PACKAGE_PROVIDES,请注意变量必须是逗号分隔的列表。

    (也许是文档的另一个可能补充)。

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 2020-10-15
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2019-04-25
      • 2015-02-21
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多