gpt4 book ai didi

c++ - CPack 空 CPACK_PACKAGE_DIRECTORY

转载 作者:行者123 更新时间:2023-11-30 05:26:02 32 4
gpt4 key购买 nike

我真的很难让 CPack 以我想象的方式运行。我在下面有一个小示例设置,在将它应用到更大的项目之前,我一直在努力工作。本质上,我正在尝试使用 fixup_bundle 来收集所有依赖项并将它们复制到打包目录以组合到安装程序(和 zip)中。

主要.cpp:

int main(unsigned int argc, const char* argv[])
{
return 0;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.1.0)

find_package(Qt5 REQUIRED COMPONENTS Core Gui Multimedia Widgets AxContainer OpenGL)

add_executable(TEST main.cpp)

target_link_libraries(TEST
Qt5::AxContainer
Qt5::Core
Qt5::Multimedia
Qt5::Gui
Qt5::Widgets
Qt5::OpenGL
)

install(
TARGETS TEST
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
COMPONENT Runtime
)

install(CODE "MESSAGE(\"CPACK_PACKAGING_PREFIX=${CPACK_PACKAGING_PREFIX}\")")
install(CODE "MESSAGE(\"CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}\")")
install(CODE "MESSAGE(\"CPACK_INSTALL_PREFIX=${CPACK_INSTALL_PREFIX}\")")
install(CODE "MESSAGE(\"CPACK_INSTALL_DIRECTORY=${CPACK_INSTALL_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_PACKAGE_INSTALL_DIRECTORY=${CPACK_PACKAGE_INSTALL_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_PACKAGING_INSTALL_PREFIX=${CPACK_PACKAGING_INSTALL_PREFIX}\")")
install(CODE "MESSAGE(\"CPACK_PACKAGE_DIRECTORY=${CPACK_PACKAGE_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_TOPLEVEL_DIRECTORY=${CPACK_TOPLEVEL_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_TEMPORARY_DIRECTORY=${CPACK_TEMPORARY_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_OUTPUT_FILE_NAME=${CPACK_OUTPUT_FILE_NAME}\")")
install(CODE "MESSAGE(\"CPACK_OUTPUT_FILE_PATH=${CPACK_OUTPUT_FILE_PATH}\")")
install(CODE "MESSAGE(\"CPACK_TEMPORARY_PACKAGE_FILE_NAME=${CPACK_TEMPORARY_PACKAGE_FILE_NAME}\")")
install(CODE "MESSAGE(\"CPACK_NATIVE_INSTALL_DIRECTORY=${CPACK_NATIVE_INSTALL_DIRECTORY}\")")
install(CODE "MESSAGE(\"CPACK_TEMPORARY_INSTALL_DIRECTORY=${CPACK_TEMPORARY_INSTALL_DIRECTORY}\")")


install(CODE "
include(BundleUtilities)
fixup_bundle(\"${CPACK_PACKAGE_DIRECTORY}/TEST${CMAKE_EXECUTABLE_SUFFIX}\" \"\" \"${DIRS}\")
" COMPONENT Runtime)

set(CPACK_GENERATOR "ZIP" "NSIS")

include(CPack)

输出总是一堆空变量:

CPACK_PACKAGING_PREFIX=
CMAKE_INSTALL_PREFIX=C:/Program Files (x86)/Project
CPACK_INSTALL_PREFIX=
CPACK_INSTALL_DIRECTORY=
CPACK_PACKAGE_INSTALL_DIRECTORY=
CPACK_PACKAGING_INSTALL_PREFIX=
CPACK_PACKAGE_DIRECTORY=
CPACK_TOPLEVEL_DIRECTORY=
CPACK_TEMPORARY_DIRECTORY=
CPACK_OUTPUT_FILE_NAME=
CPACK_OUTPUT_FILE_PATH=
CPACK_TEMPORARY_PACKAGE_FILE_NAME=
CPACK_NATIVE_INSTALL_DIRECTORY=
CPACK_TEMPORARY_INSTALL_DIRECTORY=
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.4/Modules/BundleUtilities.cmake:861 (message):
error: fixup_bundle: not a valid bundle, app: /TEST.exe

显然它不会找到正确的可执行文件。我期望 CPACK_PACKAGE_DIRECTORY 是这样的:

${CMAKE_BINARY_DIR}/_CPack_Packages/${CPACK_SYSTEM_NAME}/${CPACK_GENERATOR}/${CPACK_PACKAGE_FILE_NAME}

更新 2016-06-23

感谢@Tsyvarev 帮助确定问题和解决方案。问题是安装命令中变量的过早扩展。 CMake 将对文本行中的任何 ${} 变量进行第一级扩展。将变量转义为\${} 可避免这种扩展,稍后将由 CPack 正确扩展。

即使使用上述方法,除一个变量外,所有变量仍然为空。幸运的是,它是正确的:

install(CODE "MESSAGE(\"CMAKE_INSTALL_PREFIX=\${CMAKE_INSTALL_PREFIX}\")")

结果:

CMAKE_INSTALL_PREFIX=C:/Users/User/Documents/dev/build-test_deploy-Desktop_Qt_5_5_1_MSVC2012_32bit-Default/_CPack_Packages/win32/ZIP/Project-0.1.1-win32

现在捆绑将这样工作:

install(CODE "
include(BundleUtilities)
fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/bin/TEST${CMAKE_EXECUTABLE_SUFFIX}\" \"\" \"\")
" COMPONENT Runtime)

也许有一个更重要的注意事项,因为 fixup_bundle 使用一组固定字符串,您将必须有一个漂亮的脊安装结构。本质上,以上仅适用于整体安装:

set(CPACK_MONOLITHIC_INSTALL on)

我对比上述更好的解决方案感兴趣,但我可以使用它。

最佳答案

使用 安装时 定义的 CPack 变量的正确方法,使用 install(CODE) 命令:

install(CODE " 
include(CPack)
MESSAGE(\"CPACK_PACKAGE_DIRECTORY=\${CPACK_PACKAGE_DIRECTORY}\")
")

这里的要点:

  1. 变量的扩展应该被转义:\${...}。否则,变量在configure 阶段,当它还没有被定义时,立即展开。

  2. 安装 代码仍然需要include(CPack) 以使 CPack 变量可用。

关于c++ - CPack 空 CPACK_PACKAGE_DIRECTORY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37981374/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com