' CPACK_RPM_PACKAGE_AUTOPROV'使用CPack打包现有二进制文件时不起作用

时间:2016-03-25 06:33:12

标签: cmake rpm cpack

在我的项目中,我使用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)

有人知道为什么这&#34; CPACK_RPM_PACKAGE_AUTOPROV&#34;选项没有生效?如何让它自动生成这些&#39; PROVIDES&#39; RPM中的信息?感谢您的时间,如果您能提供一些提示,我们将非常感激。

2 个答案:

答案 0 :(得分:0)

CPACK_RPM_PACKAGE_AUTOPROV变量,其description

  

可用于启用(1,yes)或禁用(0,no)自动列出程序包提供的共享库。

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

CMake和CPack都没有尝试从其扩展程序中推断出文件的类型,这就是为什么手动安装的文件(通过install(FILES))不会受到影响。

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

  

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

     
    

rpm -qp - 提供file.rpm

  

答案 1 :(得分:0)

使用install(PROGRAMS代替install(FILES会为provides文件的rpm生成正确的.so(至少使用cmake 3.13)。根据{{​​3}}:

  

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

也许文档可以补充说它也适用于共享库。

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

(也许是文档的另一种可能)。