windows-deployqt.cmake 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. # windows-deployqt.cmake
  2. # Windows 平台 windeployqt 自动化模块
  3. # 在对项目进行构建时,是否需要配置 deployqt 来为项目进行构建部署设计
  4. # 1. 如果需要进行 windeployqt,需要提供此 WINDOWS_DEPLOY_QT 开关
  5. # 2. 默认应用构建的内容将随附在此处
  6. # 3. 预先设置一个默认的 Windows Qt 目录变量
  7. set(WINDOWS_QT_DIR "")
  8. option(WINDOWS_DEPLOY_QT "为 Windows 中构建的应用进行 windeployqt" OFF)
  9. option(WINDOWS_DEPLOY_QT5 "为 Windows 中构建的 QT5 应用进行 windeployqt" OFF)
  10. option(WINDOWS_DEPLOY_QT6 "为 Windows 中构建的 QT6 应用进行 windeployqt" OFF)
  11. if(WINDOWS_DEPLOY_QT)
  12. if(WINDOWS_DEPLOY_QT5)
  13. # 当使用 WINDOWS_DEPLOY_QT5 配方时,将使用来源于 Qt5 中提供的路径
  14. set(WINDOWS_QT_DIR "${Qt5_DIR}")
  15. elseif(WINDOWS_DEPLOY_QT6)
  16. # 当使用 WINDOWS_DEPLOY_QT6 配方时,将使用来源于 Qt6 中提供的路径
  17. set(WINDOWS_QT_DIR "${Qt6_DIR}")
  18. endif()
  19. if (WINDOWS_DEPLOY_QT5 OR WINDOWS_DEPLOY_QT6)
  20. if(USE_QT6)
  21. set(WINDOWS_QT_DIR "${Qt6_DIR}")
  22. endif(USE_QT6)
  23. message("[windows-deployqt.cmake]: find windployqt tool")
  24. message(" ${WINDOWS_QT_DIR}/../../../bin/windeployqt")
  25. # install(TARGETS ${PROJECT_NAME}
  26. # DESTINATION ${CMAKE_BINARY_DIR}/windows-deployqt)
  27. # 配置一个自动运行 windeployqt 配方的位置
  28. # 当使用 Windows Deploy Qt 时,可执行程序与即将部署的应用运行时将在此处出现
  29. set(WINDOWS_APPLICATION_DEPLOY_PATH
  30. ${CMAKE_BINARY_DIR}/windows-deployqt/${PROJECT_NAME}.app/bin)
  31. # 在开启支持 windeployqt 配方后,这部分将会改变默认构建的目标的一些行为
  32. # 这是 windeployqt,所以,它应该是一个 WIN32 程序
  33. # 它的输出目录将定义为
  34. set_target_properties(${PROJECT_NAME}
  35. PROPERTIES
  36. # 这是一个 WIN32 程序,即可执行文件不再出现黑窗口,转而使用 WinMain(某种 Windows 内部特性)
  37. WIN32_EXECUTABLE $<$<CONFIG:Debug>:FALSE>$<$<CONFIG:Release>:TRUE>
  38. # 静态库生成目录
  39. # ARCHIVE_OUTPUT_DIRECTORY ""
  40. # 动态库生成目录
  41. # LIBRARY_OUTPUT_DIRECTORY ""
  42. # 可执行文件生成目录
  43. RUNTIME_OUTPUT_DIRECTORY ${WINDOWS_APPLICATION_DEPLOY_PATH})
  44. # 自动化构建 Windows Deploy Qt Application
  45. # 参考: windeployqt --qmldir <path-to-app-qml-files> <path-to-app-binary>
  46. add_custom_command(TARGET ${PROJECT_NAME}
  47. # 在构建之后计划进行执行以下命令
  48. POST_BUILD
  49. # 即将在构建目录中
  50. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  51. # 执行以下命令进行 windeployqt
  52. COMMAND ${WINDOWS_QT_DIR}/../../../bin/windeployqt
  53. #
  54. ${WINDOWS_APPLICATION_DEPLOY_PATH}/${PROJECT_NAME}.exe
  55. # 扫描QML-从目录开始导入。
  56. --qmlimport ${WINDOWS_QT_DIR}/../../../qml
  57. # 部署编译器运行时(仅限桌面)。
  58. --compiler-runtime
  59. # 详细级别(0-2)
  60. --verbose 2
  61. # 部署运行时使用指定的目录
  62. --dir ${WINDOWS_APPLICATION_DEPLOY_PATH}
  63. )
  64. # 此部分为创建一个 windows-deployqt 的虚拟目标,用于对执行安装后的应用进行 windeployqt
  65. # 手动化构建 Windows Deploy Qt Application
  66. # 参考: windeployqt --qmldir <path-to-app-qml-files> <path-to-app-binary>
  67. # add_custom_target(windows-deployqt
  68. # COMMAND ${WINDOWS_QT_DIR}/../../../bin/windeployqt
  69. # #
  70. # ${WINDOWS_APPLICATION_DEPLOY_PATH}/${PROJECT_NAME}.exe
  71. # # 扫描QML-从目录开始导入。
  72. # --qmlimport ${WINDOWS_QT_DIR}/../../../qml
  73. # # 部署编译器运行时(仅限桌面)。
  74. # --compiler-runtime
  75. # # 详细级别(0-2)
  76. # --verbose 2
  77. # # 部署运行时使用指定的目录
  78. # --dir ${CMAKE_INSTALL_PREFIX}/bin
  79. # )
  80. # 以上为被废除的内容,不再定义 windows-deployqt 为安装后的目标进行配置 windeployqt
  81. # 并转为以下部分处理
  82. # ---------- Windeployqt With Install Target ---------- #
  83. include(cmake/platforms/utils.cmake)
  84. windeployqt_install(${PROJECT_NAME})
  85. # ---------------------------------- QSci ---------------------------------- #
  86. # 当 QSci 需要构建为动态库时,就已经开始导致了关联性错误,这个与原始分支上的预期的方案不符
  87. # 1. 需要处理运行时生成位置,将运行时与 Notepad-- 保持在一个目录下
  88. # 2. 处理此动态库的依赖问题,将依赖进行导出,由于 windeployqt 未解析出 Notepad-- 间接的动态库依赖
  89. # 需要以 QSci 为主体进行部署生成缺失的部分
  90. # 3. 在安装时,依然需要将动态库生成部署生成,这是一个非常让构建者烦恼的问题
  91. if(NOTEPAD_BUILD_BY_SHARED)
  92. # 如果 QSci 构建为动态库,那么它生成的位置也应该是与 Notepad-- 输出到同一个位置
  93. # 用于支撑 Notepad-- 的 Debug 运行时, 以及安装的续接操作
  94. set_target_properties(QSci
  95. PROPERTIES
  96. RUNTIME_OUTPUT_DIRECTORY ${WINDOWS_APPLICATION_DEPLOY_PATH})
  97. add_custom_command(TARGET QSci
  98. # 在构建之后计划进行执行以下命令
  99. POST_BUILD
  100. # 即将在构建目录中
  101. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  102. # 执行以下命令进行 windeployqt
  103. COMMAND ${WINDOWS_QT_DIR}/../../../bin/windeployqt
  104. #
  105. ${WINDOWS_APPLICATION_DEPLOY_PATH}/$<TARGET_FILE_NAME:QSci>
  106. # 扫描QML-从目录开始导入。
  107. --qmlimport ${WINDOWS_QT_DIR}/../../../qml
  108. # 部署编译器运行时(仅限桌面)。
  109. --compiler-runtime
  110. # 详细级别(0-2)
  111. --verbose 2
  112. # 部署运行时使用指定的目录
  113. --dir ${WINDOWS_APPLICATION_DEPLOY_PATH}
  114. )
  115. # ---------- Windeployqt With Install Target ---------- #
  116. windeployqt_install(QSci)
  117. endif(NOTEPAD_BUILD_BY_SHARED)
  118. endif (WINDOWS_DEPLOY_QT5 OR WINDOWS_DEPLOY_QT6)
  119. endif(WINDOWS_DEPLOY_QT)