utils.cmake 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. # utils.cmake
  2. # 定义一些其它工具函数
  3. # get_current_platform_lib_name <_VAR> <_IS_IS_SHREAD> <_LIB>
  4. # _VAR 用于存储内容的变量
  5. # _IS_IS_SHREAD 是否为共享库
  6. # _LIB 目标名称
  7. function(get_current_platform_lib_name _VAR _IS_SHREAD _LIB)
  8. set(_LIB_NAME "")
  9. if(WIN32)
  10. set(_LIB_NAME ${_LIB}.lib)
  11. elseif(UNIX AND NOT APPLE)
  12. if(${_IS_SHREAD})
  13. set(_LIB_NAME lib${_LIB}.so)
  14. else()
  15. set(_LIB_NAME lib${_LIB}.a)
  16. endif(${_IS_SHREAD})
  17. elseif(APPLE)
  18. if(${_IS_SHREAD})
  19. set(_LIB_NAME lib${_LIB}.dylib)
  20. else()
  21. set(_LIB_NAME lib${_LIB}.a)
  22. endif(${_IS_SHREAD})
  23. else()
  24. message("ERROR: Unknow current platform")
  25. set(_LIB_NAME ${_LIB})
  26. endif()
  27. message("[utils.cmake] get_current_platform_lib_name: ${_LIB}(${_LIB_NAME}) ")
  28. set(${_VAR} ${_LIB_NAME} PARENT_SCOPE)
  29. endfunction(get_current_platform_lib_name _VAR _IS_SHREAD _LIB)
  30. # 获取当前平台的 lib 名称
  31. # 在 Windows 中
  32. # 用于编译的静态库与动态库后缀相同: .lib
  33. # 并且不是 lib 开头
  34. # 在 Linux 中
  35. # 用于编译的静态库与动态库后缀分别是:.a 与 .so
  36. # 文件名称由 lib 开头
  37. # 在 MacOS 中
  38. # 用于编译的静态库与动态库后缀分别是:.a 与 .dylib
  39. # 文件名称由 lib 开头
  40. # qt5_qt6_compatible_check <file> <var>
  41. # Qt5/6 兼容性构建检查方案,如果文件中存在 true 将认为可兼容构建
  42. # _CHECK_FILE Qt5/Qt6 兼容性检查文件
  43. # _VAR 检查结果
  44. function(qt5_qt6_compatible_check _CHECK_FILE _VAR)
  45. set(${_VAR} true PARENT_SCOPE)
  46. file(READ ${_CHECK_FILE} file_content)
  47. string(FIND ${file_content} "true" _index)
  48. if(_index LESS 0)
  49. # -1: It is not checked and passed
  50. set(${_VAR} false PARENT_SCOPE)
  51. endif(_index LESS 0)
  52. endfunction(qt5_qt6_compatible_check _CHECK_FILE _VAR)
  53. # windeployqt_install
  54. # Windows 在 install 目标时进行 windeployqt 的自动化
  55. # 根据
  56. # https://blog.nathanosman.com/2017/11/24/using-windeployqt-with-cpack.html
  57. function(windeployqt_install TARGET)
  58. # string(TOLOWER "${ALIAS}_file" _file)
  59. # string(TOLOWER "${ALIAS}_output" _output)
  60. set(WINDEPLOYQT_EXECUTABLE "${WINDOWS_QT_DIR}/../../../bin/windeployqt")
  61. #
  62. file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/${TARGET}_PATH"
  63. CONTENT "$<TARGET_FILE:${TARGET}>"
  64. )
  65. install(CODE
  66. "
  67. file(READ \"${CMAKE_BINARY_DIR}/${TARGET}_PATH\" _file)
  68. execute_process(
  69. COMMAND \"${WINDEPLOYQT_EXECUTABLE}\"
  70. # 虚假的运行 windeployqt 而不复制任何内容
  71. --dry-run
  72. # 扫描QML-从目录开始导入。
  73. --qmlimport ${WINDOWS_QT_DIR}/../../../qml
  74. # 部署编译器运行时(仅限桌面)。
  75. --compiler-runtime
  76. # 以源 目标的输出形成映射关系,以便用于解析内容
  77. --list mapping
  78. \${_file}
  79. OUTPUT_VARIABLE _output
  80. OUTPUT_STRIP_TRAILING_WHITESPACE
  81. )
  82. # 将内容转为一个列表,使用 WINDOWS_COMMAND 类型的处理方式
  83. separate_arguments(_files WINDOWS_COMMAND \${_output})
  84. while(_files)
  85. list(GET _files 0 _src)
  86. list(GET _files 1 _dest)
  87. execute_process(
  88. COMMAND \"\${CMAKE_COMMAND}\" -E
  89. copy_if_different \${_src} \"\${CMAKE_INSTALL_PREFIX}/bin/\${_dest}\"
  90. )
  91. message(\"COPY \${_src} \${CMAKE_INSTALL_PREFIX}/bin/\${_dest}\")
  92. list(REMOVE_AT _files 0 1)
  93. endwhile(_files)
  94. "
  95. )
  96. endfunction(windeployqt_install TARGET)
  97. #
  98. # [UnTested]macdeployqt_install
  99. # MacOSX 在 install 目标时进行 macdeployqt 的自动化
  100. # 由于
  101. function(macdeployqt_install _target)
  102. set(MACDEPLOYQT_EXECUTABLE "${MACOS_QT_DIR}/../../../bin/macdeployqt")
  103. #
  104. file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/${_target}_PATH"
  105. # CONTENT "$<TARGET_FILE:${_target}>"
  106. CONTENT "${CMAKE_BINARY_DIR}/_CPack_Packages/Darwin/Bundle/${_target}-${PROJECT_VERSION}-Darwin/${_target}.app"
  107. )
  108. install(CODE
  109. "
  110. file(READ \"${CMAKE_BINARY_DIR}/${_target}_PATH\" _file)
  111. execute_process(
  112. COMMAND \"${MACDEPLOYQT_EXECUTABLE}\"
  113. # 虚假的运行 macdeployqt 而不复制任何内容
  114. --dry-run
  115. # 扫描QML-从目录开始导入。
  116. #--qmlimport=${MACOS_QT_DIR}/../../../qml
  117. # 部署编译器运行时(仅限桌面)。
  118. #--compiler-runtime
  119. # 以源 目标的输出形成映射关系,以便用于解析内容
  120. #--list mapping
  121. #-no-plugins
  122. #-timestamp
  123. \${_file}
  124. OUTPUT_VARIABLE _output
  125. OUTPUT_STRIP_TRAILING_WHITESPACE
  126. )
  127. "
  128. )
  129. endfunction(macdeployqt_install _target)