【发布时间】:2021-07-06 23:56:01
【问题描述】:
我正在尝试使用 cpack 创建一个 rpm。创建本身没问题,但我无法使安装路径正确。
在我的 CMakeLists.txt 中
cmake_minimum_required(VERSION 3.17)
project(ProjectName VERSION 1.2.3)
include(GNUInstallDirs) # << Here I use GNUInstallDirs for canonical install dir on linux
set(CMAKE_BUILD_TYPE RelWithDebInfo)
# next is just generating dummy code so that this example is standalone
add_custom_command(VERBATIM COMMAND_EXPAND_LISTS
COMMAND echo "int f(void) { return 0\; }" > ${CMAKE_BINARY_DIR}/dummy.cpp
COMMAND echo "dummy config" > ${CMAKE_BINARY_DIR}/config.ini
OUTPUT ${CMAKE_BINARY_DIR}/dummy.cpp ${CMAKE_BINARY_DIR}/config.ini)
add_custom_target(gen
DEPENDS ${CMAKE_BINARY_DIR}/dummy.cpp ${CMAKE_BINARY_DIR}/config.ini
OUTPUT ${CMAKE_BINARY_DIR}/dummy.cpp ${CMAKE_BINARY_DIR}/config.ini)
add_library(dummy SHARED ${CMAKE_BINARY_DIR}/dummy.cpp)
set_target_properties(dummy PROPERTIES
VERSION "4"
SOVERSION "4.1.2")
install(TARGETS dummy EXPORT MyLibraryConfig
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(FILES ${CMAKE_BINARY_DIR}/config.ini DESTINATION ${CMAKE_INSTALL_SYSCONFDIR})
install(EXPORT MyLibraryConfig DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/MyLibrary/cmake)
include(cpack)
正如在代码中强调的那样,我使用 GNUInstallDirs 在 linux 上正确安装了东西,即,当前缀为 / 或 /usr 时,配置内容进入 /etc 和 /usr/lib 中的库,当前缀是任何东西时否则,比如说 /X,他们会进入 /X/etc/ 和 /X/lib/
在进行 make install 时可以正常工作。
但是我真的不知道在调用 cpack 时如何将 CMAKE_INSTALL_PREFIX 设置为 / 或 /usr,当它内部调用 cmake 时,它似乎永远保留在 /usr/local(默认值)命令,尽管我已经完成了测试:
CPACK_INSTALL_PREFIX
CPACK_PACKAGING_PREFIX
CPACK_PACKAGING_INSTALL_PREFIX
CMAKE_INSTALL_PREFIX
CPACK_INSTALL_PREFIX
CPACK_PACKAGE_INSTALL_DIRECTORY
CPACK_PACKAGING_INSTALL_PREFIX
CPACK_NATIVE_INSTALL_DIRECTORY
还搞砸了CPACK_SET_DESTDIR。
我从来没有得到一个包含正确树的 rpm...我有点困惑。
我的命令是:
cmake . # generates the cpack stuff
cpack -G RPM # creates the rpm
rpm -q -l ProjectName-1.2.3-Linux.rpm # to check rpm content
我得到:
/usr/etc
/usr/etc/config.ini
/usr/lib/.build-id
/usr/lib/.build-id/f0
/usr/lib/.build-id/f0/9b19950e7734825f8d307f7835a8cc0e45c050
/usr/usr
/usr/usr/lib64
/usr/usr/lib64/libdummy.so
/usr/usr/lib64/libdummy.so.4
/usr/usr/lib64/libdummy.so.4.1.2
/usr/usr/share
/usr/usr/share/MyLibrary
/usr/usr/share/MyLibrary/cmake
/usr/usr/share/MyLibrary/cmake/MyLibraryConfig-relwithdebinfo.cmake
/usr/usr/share/MyLibrary/cmake/MyLibraryConfig.cmake
您可能会注意到这里的前缀似乎是 usr,但实际上它从未传递给 cmake 调用(我在调试时放了一些打印消息以确保它)
那我做错了什么?我有办法吗?
【问题讨论】: