我真的很难让CPack像我想象的那样行事。下面我有一个小的示例设置,在将它应用到一个更大的项目之前,我一直在尝试得到工作。本质上,我试图使用fixup_bundle收集所有依赖项,并将它们复制到打包目录中,以便合并到安装程序(和zip)中。
main.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)我会对一个比上面更好的解决方案感兴趣,但我可以处理这个问题。
发布于 2016-06-24 07:50:22
使用CPack命令使用安装时定义的使用install(CODE)变量的正确方法:
install(CODE "
include(CPack)
MESSAGE(\"CPACK_PACKAGE_DIRECTORY=\${CPACK_PACKAGE_DIRECTORY}\")
")这里的要点是:
\${...}。否则,当尚未定义变量时,将在配置阶段立即展开变量。include(CPack),以使CPack变量可用。发布于 2021-06-28 21:23:25
对于那些绝望地尝试在互联网上应用所有菜谱的人(像我一样),我还有一个要得到的目录,这个目录对我有用:
install(CODE "MESSAGE(\"DESTDIR=\$ENV{DESTDIR}\")")https://stackoverflow.com/questions/37981374
复制相似问题