CPack / CMake:每个 CPACK_GENERATOR 的安装前缀不同
CPack / CMake: Different installation prefixes per CPACK_GENERATOR
如何为不同的 CPACK_GENERATORs 指定不同的安装前缀?
例如:
- DEB 包应该安装到
/opt/project
- TGZ 存档应仅包含
project
目录
从 documentation 我了解到我必须使用 CPACK_PROJECT_CONFIG_FILE
变量。使用它,应该可以实现预期的目标。但是,它对我不起作用。
这是我的 CPack 配置:
set(CPACK_GENERATOR "DEB;TGZ")
set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/cmake/package.linux.txt)
这是我的 ${CMAKE_SOURCE_DIR}/cmake/package.linux.txt
文件:
IF (CPACK_GENERATOR MATCHES "DEB")
set(CPACK_NATIVE_INSTALL_DIRECTORY "/opt")
set(CMAKE_INSTALL_PREFIX "/opt")
set(CPACK_PACKAGING_INSTALL_PREFIX "/opt")
set(CPACK_INSTALL_DIRECTORY "/opt")
ELSEIF(CPACK_GENERATOR MATCHES "TGZ")
set(CPACK_NATIVE_INSTALL_DIRECTORY "")
set(CMAKE_INSTALL_PREFIX "")
set(CPACK_PACKAGING_INSTALL_PREFIX "")
set(CPACK_INSTALL_DIRECTORY "")
ENDIF()
我已确保使用 MESSAGE()
指令解析所有文件,但我的包的前缀始终是 /usr/local
。
终于找到问题所在了。我设置了 CPACK_SET_DESTDIR
flag。这使得 CPACK 将 usr/local 附加到包含编译二进制文件的目录。删除相应的 SET()
指令后,一切都很顺利。
作为记录,我将为您提供我的最小工作示例。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.2)
project(stripped-down C)
add_executable(main main.c)
install(TARGETS main
RUNTIME DESTINATION bin
)
set(CPACK_GENERATOR "DEB;TGZ")
set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/package.txt)
set(CPACK_PACKAGE_CONTACT "Some One <some.one@somewhere.com>")
include(CPack)
${CMAKE_SOURCE_DIR}/package.txt:
IF (CPACK_GENERATOR MATCHES "DEB")
set(CPACK_PACKAGING_INSTALL_PREFIX "/opt")
ELSEIF(CPACK_GENERATOR MATCHES "TGZ")
set(CPACK_PACKAGING_INSTALL_PREFIX "")
ENDIF()
如何为不同的 CPACK_GENERATORs 指定不同的安装前缀?
例如:
- DEB 包应该安装到
/opt/project
- TGZ 存档应仅包含
project
目录
从 documentation 我了解到我必须使用 CPACK_PROJECT_CONFIG_FILE
变量。使用它,应该可以实现预期的目标。但是,它对我不起作用。
这是我的 CPack 配置:
set(CPACK_GENERATOR "DEB;TGZ")
set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/cmake/package.linux.txt)
这是我的 ${CMAKE_SOURCE_DIR}/cmake/package.linux.txt
文件:
IF (CPACK_GENERATOR MATCHES "DEB")
set(CPACK_NATIVE_INSTALL_DIRECTORY "/opt")
set(CMAKE_INSTALL_PREFIX "/opt")
set(CPACK_PACKAGING_INSTALL_PREFIX "/opt")
set(CPACK_INSTALL_DIRECTORY "/opt")
ELSEIF(CPACK_GENERATOR MATCHES "TGZ")
set(CPACK_NATIVE_INSTALL_DIRECTORY "")
set(CMAKE_INSTALL_PREFIX "")
set(CPACK_PACKAGING_INSTALL_PREFIX "")
set(CPACK_INSTALL_DIRECTORY "")
ENDIF()
我已确保使用 MESSAGE()
指令解析所有文件,但我的包的前缀始终是 /usr/local
。
终于找到问题所在了。我设置了 CPACK_SET_DESTDIR
flag。这使得 CPACK 将 usr/local 附加到包含编译二进制文件的目录。删除相应的 SET()
指令后,一切都很顺利。
作为记录,我将为您提供我的最小工作示例。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.2)
project(stripped-down C)
add_executable(main main.c)
install(TARGETS main
RUNTIME DESTINATION bin
)
set(CPACK_GENERATOR "DEB;TGZ")
set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/package.txt)
set(CPACK_PACKAGE_CONTACT "Some One <some.one@somewhere.com>")
include(CPack)
${CMAKE_SOURCE_DIR}/package.txt:
IF (CPACK_GENERATOR MATCHES "DEB")
set(CPACK_PACKAGING_INSTALL_PREFIX "/opt")
ELSEIF(CPACK_GENERATOR MATCHES "TGZ")
set(CPACK_PACKAGING_INSTALL_PREFIX "")
ENDIF()