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