CPACK_RPM_PACKAGE_AUTOPROV не работает, когда упаковываете существующие двоичные файлы в CPack

В моем проекте я использую cmake для построения системы сборки, мне нужно создать внешний проект (здесь я возьму zeromq, например) с ExternalProject_add, затем упаковать скомпилированные двоичные файлы в пакет 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? спасибо за ваше время, и будет очень признателен, если вы можете дать некоторые советы.

1 ответ

С помощью install(PROGRAMS вместо install(FILES генерирует правильный provides в оборотах для .so файлы (по крайней мере, с помощью cmake 3.13). Согласно документации:

Форма PROGRAMS идентична форме FILES, за исключением того, что разрешения по умолчанию для установленного файла также включают OWNER_EXECUTE, GROUP_EXECUTE и WORLD_EXECUTE. Эта форма предназначена для установки программ, которые не являются целями, таких как сценарии оболочки.

Возможно, в документации можно добавить, что она подходит и для общих библиотек.

Если вы хотите придерживаться CPACK_RPM_PACKAGE_PROVIDES, имейте в виду, что переменная должна быть списком через запятую.

(Может быть, еще одно возможное дополнение к документации).

CPACK_RPM_PACKAGE_AUTOPROV переменная, по ее описанию:

Может использоваться для включения (1, да) или отключения (0, нет) автоматического перечисления общих библиотек, предоставляемых пакетом.

влияет только на цели, созданные add_library(SHARED),

Ни CMake, ни CPack не пытаются определить тип файла по их расширению, поэтому файлы устанавливаются вручную (через install(FILES)) не затрагиваются.

Чтобы добавить данные файлы в список PROVIDES, используйте переменную CPACK_RPM_PACKAGE_PROVIDES:

Может использоваться для установки зависимостей RPM (предоставляет). Предоставленный список пакетов файла RPM может быть напечатан с:

rpm -qp - предоставить файл.rpm

Другие вопросы по тегам