我想重命名CPack(v2.8.7)生成的安装程序文件,以包含从版本控制系统在构建时获得的版本号.看来这不能通过设置CPACK_*变量来完成,因为这发生在"cmake"时间.
我希望能够做的是运行"(n)make package"并创建安装程序文件,而不需要进一步的命令.我所知道的两种可能的方法是在构建时操作CPack文件名变量并重命名CPack的最终输出.
如果在CMakeLists.txt文件中使用"include(CPack)",那么看起来CPack总是最后运行,并且您不能拥有构建后命令.这个邮件列表消息表明可以编写自定义目标来运行CPack,但是我无法在不创建无限递归的情况下弄清楚如何做到这一点.
如何才能做到这一点?
所以,有很多方法可以复制文件(和目录)在CMake运行时(file(COPY ...),configure_file(...)和add_custom_command()所有的工作*),但我还没有发现如何从源复制到目录中建立文件或目录出现在生成的压缩文件通过CPack.我虽然这个SO答案会修复它,因为它实际上将复制链接到目标,然后将链接到它的安装:
install(TARGET mytarget DESTINATION bin)
Run Code Online (Sandbox Code Playgroud)
而我确实认识到file()和configure_file()命令没有明显的方法被添加到目标.但是,这没有用.因此,给定一个简单的CMakeLists.txt,如下所示,如何使所有文件(包括exmaple目录)出现在存档中?!
cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
enable_language(FORTRAN)
add_executable(mytarget ${PROJECT_SOURCE_DIR}/myprog.for)
install(TARGETS mytarget DESTINATION bin)
add_custom_command(TARGET mytarget PREBUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${PROJECT_SOURCE_DIR}/examplefiles ${PROJECT_BINARY_DIR}/examplefiles)
set(CPACK_GENERATOR "TGZ")
include(CPack)
Run Code Online (Sandbox Code Playgroud)
*我还没有发现这三种方法中哪一种实际上(大多数?)正确 - 所以对此的任何建议都将非常感激
我正在使用 CPack 创建 Linux tgz 自解压安装程序,我希望安装程序在安装所有文件后运行脚本或命令序列。CPack 文档包含以下指南:
CPACK_INSTALL_COMMANDS 安装组件的额外命令。
我在我的 CMakeLists.txt 文件中设置了这个变量,我看到它在生成的 CPackConfig.cmake 文件中设置,但是我嵌入到这个变量中的命令没有出现在最终的 .sh 安装脚本中的任何地方。我错过了什么?
我正在尝试为我的一个项目创建一个 debian 包,但遇到了 boost 版本支持的问题。
我也确实看这个问题。它很相似,但提供的解决方案(Build-Depends)并不真正适用于我,因为我正在制作二进制安装程序。
基本上,我安装的库和可执行文件总是链接到 libboost_(component).so.1.46 而不是符号链接库 libboost_(component).so。让我的 debian 安装程序只能由拥有我的确切 boost 版本的人使用。我正在使用 CPack 制作 debian 包,我的depends 行如下所示:
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-dev (>= 1.46),
libboost-thread-dev (>= 1.46),
libboost-signals-dev (>= 1.46),
libboost-system-dev (>= 1.46),
libboost-filesystem-dev (>= 1.46),
libboost-python-dev (>= 1.46), ..." )
Run Code Online (Sandbox Code Playgroud)
我是否需要为所述平台上的每个平台或该平台的 boost 版本构建单独的安装程序?
我使用 cpack 创建了一个 deb 包,但它没有保留目标计算机上的原始权限。这导致我的应用程序的用户在安装后无法执行它。
概括:
如何使用 CMake/CPack 生成 Wix 安装程序?
细节:
我试图从一个使用 Wix 的项目中生成一个安装程序,但显然,cmake/cpack 坚持使用 nsis,例如,从 repo https://github.com/ngladitz/cmake-wix-testsuite 我选择了第一个示例“基本”文件夹,其中包含 CMakeLists.txt 的以下内容
add_executable(hw hw.cpp)
install(TARGETS hw DESTINATION bin)
install(FILES hw.cpp DESTINATION src)
set(CPACK_WIX_UPGRADE_GUID "F9AAAAE2-D6AF-4EA4-BF46-B3E265400CC7")
include(CPack)
Run Code Online (Sandbox Code Playgroud)
生成 cmake 后:
cd <basic-root-folder>
mkdir MY_BUILD
cd MY_BUILD
cmake ..
Run Code Online (Sandbox Code Playgroud)
我试图运行生成的 package.vcxproj
msbuild package.vcxproj
Run Code Online (Sandbox Code Playgroud)
并得到错误
“C:\src\Samples\CPack\cmake-wix-testsuite-master\basic\MY_BUILD\PACKAGE.vcxproj”(默认目标)(1)->(PostBuildEvent 目标)-> EXEC:CPack 错误:找不到 NSIS 编译器makensis:可能它没有安装,或者不在你的路径中 [C:\src\Samples\CPack\cmake-wix-testsuite-master\ba sic\MY_BUILD\PACKAGE.vcxproj]
所以看起来它坚持使用 NSIS 生成器。
我有一个 cmake 项目,其中一个安装目标是文件集合。此文件根据配置(发布、调试...)而变化。我希望能够像这样安装文件:
install(DIRECTORY $<TARGET_FILE_DIR:tgt>
DESTINATION bin
COMPONENT files)
Run Code Online (Sandbox Code Playgroud)
但是 cmake 不支持。生成器变量不适用于 DIRECTORY。所以我想知道是否有办法将目录保存在某处。缓存或文件,然后将其加载到 cpack 中。
所以我想问题是如何将变量从 cmake 传递给 cpack?
我使用 CMake
add_custom_command(TARGET POST_BUILD COMMAND codesign ...)
Run Code Online (Sandbox Code Playgroud)
用于在构建时签署可执行文件。
它工作正常,但是当 CPack 生成包时,它会在可执行文件上重写 rpath 并在它们上调用 strip 命令。这会更改文件并使签名无效。在 CPack 完成安装之后和实际打包之前,CMake 有没有办法对二进制文件进行签名?
我已经在 OEL7 上使用 CMake 和 CPack 3.13.4 构建 RPM 几个月了,没有出现任何问题。我的 CMake 配置包含以下几行:
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)
Run Code Online (Sandbox Code Playgroud)
这使我能够确保在任何安装的版本之前使用该库的本地构建版本。如果不对这些行进行任何更改,我突然无法再构建 RPM。我现在收到此错误消息:
+ /usr/lib/rpm/check-rpaths
*******************************************************************************
*
* WARNING: 'check-rpaths' detected a broken RPATH and will cause 'rpmbuild'
* to fail. To ignore these errors, you can set the '$QA_RPATHS'
* environment variable which is a bitmask allowing the values
* below. The current value of QA_RPATHS is 0x0000.
*
* 0x0001 ... standard RPATHs (e.g. /usr/lib); such RPATHs are a …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用为我的基础项目cpack创建.ddeb文件(包含调试符号信息),但无法说明为什么我没有在正确生成的文件旁边生成文件。的内容很少且不重要;这是我的文件:cmakeset(CPACK_DEBIAN_DEBUGINFO_PACKAGE ON).ddeb.debmain.cppCMakeLists.txt
cmake_minimum_required(VERSION 3.13)
set(TEST_CPACK_DDEB_VERSION 0.7.6)
set(PROJECT_NAME TestCPackDDEB)
set(TEST_CPACK_DDEB_PROJECT TestCPackDDEBProject)
project(${PROJECT_NAME} VERSION ${TEST_CPACK_DDEB_VERSION} LANGUAGES CXX)
include(GNUInstallDirs)
set(SOURCES main.cpp)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
add_executable(${PROJECT_NAME} ${SOURCES})
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
install(TARGETS ${PROJECT_NAME}
DESTINATION /usr/bin)
export(PACKAGE ${PROJECT_NAME})
set(CPACK_PACKAGE_NAME "testcpackddeb")
set(CPACK_PACKAGE_CONTACT "L User <luser@gmail.com>")
set(CPACK_PACKAGE_DESCRIPTION "Not just another generator")
set(CPACK_DEB_COMPONENT_INSTALL ON)
set(CPACK_DEBIAN_COMPRESSION_TYPE "gzip")
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
set(CPACK_DEBIAN_DEBUGINFO_PACKAGE ON)
set(CPACK_DEBIAN_PACKAGE_DEPENDS "")
include(CPack)
Run Code Online (Sandbox Code Playgroud)
我已经在cmake版本 3.16.3 (ubuntu 20.04) 和 3.19.1 上尝试过此操作,但得到了相同的结果。这是我运行的命令序列:
cmake_minimum_required(VERSION 3.13) …Run Code Online (Sandbox Code Playgroud)