Я пытаюсь провести довольно простой эксперимент с использованием cpack. Цель состоит в том, чтобы создать установщик RPM (используя cpack) с тривиальным исполняемым файлом, который использует внешнюю стороннюю разделяемую библиотеку (называемую libSomeSharedLib.so ).
Структура, которую я хотел бы RPM для установки:
opt
|_cmakeFindPackageTest
|_bin
|_cmakeFindPackageTest (an executable)
|_lib
|_libSomeSharedLib.so (the shared library)
Я хочу, чтобы RPATH исполняемого файла был /opt/cmakeFindPackageTest/lib
(чтобы убедиться, что он использует установленную общую библиотеку).
Полный CMakeLists.txt вставляется внизу , но обратите внимание, что следующие свойства: SET
15 SET(CMAKE_INSTALL_PREFIX "/opt/cmakeFindPackageTest")
16 SET( INSTALL_DIR_BIN ${CMAKE_INSTALL_PREFIX}/bin )
17 SET( INSTALL_DIR_LIB ${CMAKE_INSTALL_PREFIX}/lib )
18
19 SET(CMAKE_INSTALL_RPATH "\${INSTALL_DIR_LIB}")
20 SET(CMAKE_SKIP_BUILD_RPATH TRUE)
21 SET(CMAKE_SKIP_INSTALL_RPATH FALSE)
Насколько я понимаю, строки 17,19,20 должны заставить cpack установить RPATH исполняемого файла равным /opt/cmakeFindPackageTest/lib
HOWEVER ...
когда я собираю проект (из чистого) и запускаю cpack для генерации RPM, я вижу это в выводе
bash-4.2$ cpack -V -G RPM
CPack: Enable Verbose
... irrelevant looking output ommitted ...
CPack Verbose: Set runtime path of "/local/bfarnham/workspace/OPC-UA/CMake_examples/cmakeFindPackageTest/build/_CPack_Packages/Linux/RPM/cmakeFindPackageTest-0.0.0-Linux/opt/cmakeFindPackageTest/bin/cmakeFindPackageTest" to ""
RPATH устанавливается пустым! Э? Проверено с помощью readelf - достаточно точно
bash-4.2$ readelf -d ./_CPack_Packages/Linux/RPM/cmakeFindPackageTest-0.0.0-Linux/opt/cmakeFindPackageTest/bin/cmakeFindPackageTest | grep --context=1 -i RPATH
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: []
0x000000000000000c (INIT) 0x400848
Итак, наконец, вопрос: как мне получить cpack для установки RPATH этого исполняемого файла в RPM?
================ полный CMakeLists.txt =============== *
1 cmake_minimum_required( VERSION 3.0 )
2 project( cmakeFindPackageTest CXX )
3 set (CMAKE_CXX_STANDARD 11)
4
5 list( INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake )
6 message( STATUS "CMAKE_MODULE_PATH [${CMAKE_MODULE_PATH}]" )
7 find_package( SomeSharedLib 1.0 REQUIRED MODULE )
8 message( STATUS "SomeSharedLib_INCLUDE_DIR [${SomeSharedLib_INCLUDE_DIR}] SomeSharedLib_LIBRARY [${SomeSharedLib_LIBRARY}]" )
9
10 add_executable( cmakeFindPackageTest src/main.cpp )
11 target_link_libraries( cmakeFindPackageTest SomeSharedLib::SomeSharedLib )
12
13 # =============================== INSTALL DETAILS BELOW THIS POINT ==========================
14
15 SET(CMAKE_INSTALL_PREFIX "/opt/cmakeFindPackageTest")
16 SET( INSTALL_DIR_BIN ${CMAKE_INSTALL_PREFIX}/bin )
17 SET( INSTALL_DIR_LIB ${CMAKE_INSTALL_PREFIX}/lib )
18
19 SET(CMAKE_INSTALL_RPATH "\${INSTALL_DIR_LIB}")
20 SET(CMAKE_SKIP_BUILD_RPATH TRUE)
21 SET(CMAKE_SKIP_INSTALL_RPATH FALSE)
22 SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
23
24 SET(CPACK_PACKAGE_NAME cmakeFindPackageTest )
25 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "test")
26 SET(CPACK_PACKAGE_VENDOR "TEST_VENDOR")
27 SET(CPACK_PACKAGE_RELOCATABLE FALSE)
28 SET(CPACK_PACKAGE_VERSION_MAJOR "0")
29 SET(CPACK_PACKAGE_VERSION_MINOR "0")
30 SET(CPACK_PACKAGE_VERSION_PATCH "0")
31
32 install( TARGETS
33 cmakeFindPackageTest
34 RUNTIME DESTINATION ${INSTALL_DIR_BIN} )
35
36 install( FILES
37 ${SomeSharedLib_LIBRARY}
38 DESTINATION ${INSTALL_DIR_LIB} )
39
40 include( CPack )