SparkMacrosExtendConfig.cmake 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. # find_plus
  2. # 寻找 INVAl 传入的字符串,如果存在 + 字符将写入位置到 OUTVAL
  3. function(find_plus INVAL OUTVAL)
  4. string(FIND "${INVAL}" "+" plus_index)
  5. set(${OUTVAL} ${plus_index} PARENT_SCOPE)
  6. # if(plus_index LESS 0)
  7. # set(${OUTVAL} -1 PARENT_SCOPE)
  8. # else()
  9. # set(${OUTVAL} ${plus_index} PARENT_SCOPE)
  10. # endif(plus_index LESS 0)
  11. endfunction(find_plus INVAL OUTVAL)
  12. # find_plus("FF" FFFF)
  13. # message("--> FFFF ${FFFF}") # --> FFFF -1
  14. # find_plus("F+F" FFFF)
  15. # message("--> FFFF ${FFFF}") # --> FFFF 1
  16. # find_plus("+F+F" FFFF)
  17. # message("--> FFFF ${FFFF}") # --> FFFF 0
  18. # set(FFF)
  19. # list(APPEND FFFF )
  20. # list(APPEND FFFF "F")
  21. # list(APPEND FFFF "FA")
  22. # message("--> FFFF: ${FFFF}") # --> FFFF: F;FA
  23. # set(FFFFS "")
  24. # list(APPEND FFFFS ${FFFF})
  25. # message("--> FFFFS: ${FFFFS}") # --> FFFFS: F;FA
  26. # set(FFFF "+AA+BB+CC+DD")
  27. # string(REPLACE "+" ";" FFFFL "${FFFF}")
  28. # list(LENGTH FFFFL FFFFLEN)
  29. # message("--> FFFFL: ${FFFFL} --> ${FFFFLEN}") # --> FFFFL: F;
  30. # plus_list
  31. # 将传入的 "+AAA+BBB+CCC" 类型数据变成一个 列表(list)
  32. # 适用于不使用 string 进行替换 + 为 ";" 的情况下使用直接变成 list
  33. function(plus_list INVAL OUTVAL OUTVALLEN)
  34. # set(${OUTVAL} "..." PARENT_SCOPE)
  35. # set(${OUTVALLEN} 0 PARENT_SCOPE)
  36. set(_tmps "") # 设置为空的
  37. # 寻找下一个 + 位置
  38. find_plus(${INVAL} RIGHT_PLUS)
  39. string(LENGTH "${INVAL}" INVALLEN)
  40. spark_debug_message("--> 传入的 INVAL: --> 内容: ${INVAL}")
  41. spark_debug_message("--> 传入的 INVAL: --> 长度: ${INVALLEN}")
  42. spark_debug_message("--> 传入的 INVAL: --> +位置: ${RIGHT_PLUS}")
  43. # 判断是否有右侧 + 号
  44. if(RIGHT_PLUS LESS 0)
  45. spark_debug_message("--> 传入的 INVAL: --> 无需计算新的+位置")
  46. # spark_debug_message("--> 计算新的 + 位置: ${_PLUSINDEX}")
  47. list(APPEND _tmps ${INVAL})
  48. else()
  49. math(EXPR _PLUSINDEX "${RIGHT_PLUS}+1")
  50. spark_debug_message("--> 传入的 INVAL: --> 需计算+位置 --> 右移: ${_PLUSINDEX}")
  51. string(SUBSTRING "${INVAL}" ${_PLUSINDEX} ${INVALLEN} NewVal)
  52. spark_debug_message("--> 传入的 INVAL: --> 需计算+位置 --> 右移: ${_PLUSINDEX} -> 内容: ${NewVal}")
  53. # string(REPLACE "+" ";" _tmps "${NewVal}")
  54. # list(LENGTH FFFFL FFFFLEN)
  55. # spark_debug_message("--> 计算新的 + 位置: ${_PLUSINDEX} --> 后面的 NewVal: ${NewVal}")
  56. # find_plus(${NewVal} _NextPlus)
  57. # if(_NextPlus LESS 0)
  58. # list(APPEND _tmps ${NewVal})
  59. # spark_debug_message("--> 追加新的 + 位置: ${_PLUSINDEX} --> 后面的")
  60. # else()
  61. # spark_debug_message("--> 追加新的 + 位置: ${_PLUSINDEX} --> 后面的")
  62. # # 重新
  63. # # plus_list(${NewVal} NewValS )
  64. # # foreach(item)
  65. # # list(APPEND _tmps ${item})
  66. # # endforeach(item)
  67. # endif(_NextPlus LESS 0)
  68. endif(RIGHT_PLUS LESS 0)
  69. set(${OUTVAL} ${_tmps} PARENT_SCOPE)
  70. list(LENGTH _tmps _tmps_len)
  71. set(${OUTVALLEN} ${_tmps_len} PARENT_SCOPE)
  72. endfunction(plus_list INVAL OUTVAL OUTVALLEN)
  73. # plus_list("+AAA+BBB+CCC+DDD" FFF FFLEN)
  74. # spark_debug_message("--------> ${FFF}: -> ${FFLEN}")
  75. # spark_add_library_realpaths
  76. # 基于传入的项进行构建
  77. # 可接受的值为: 路径列表
  78. # 可接受的值为: 路径列表+依赖库A+依赖库B
  79. macro(spark_add_library_realpaths)
  80. spark_debug_message("---> 基于传入的项进行构建 <---")
  81. # spark_debug_message("--> src/unclassified/ItemDelegates/NdStyledItemDelegate")
  82. # string(FIND <string> <substring> <output_variable> [REVERSE])
  83. # string(SUBSTRING <string> <begin> <length> <output_variable>)
  84. # math(EXPR value "100 * 0xA" OUTPUT_FORMAT DECIMAL) # value is set to "1000"
  85. set(REALPATHS ${ARGN})
  86. foreach(REALPATH IN LISTS REALPATHS)
  87. spark_debug_message("---> 传入路径: ${REALPATH} <--- ")
  88. string(LENGTH "${REALPATH}" REALPATH_LENGTH)
  89. spark_debug_message("---> 计算传入路径长度: --> 长度: ${REALPATH_LENGTH}")
  90. string(FIND "${REALPATH}" "/" LASTINDEX REVERSE)
  91. spark_debug_message("---> 计算传入路径末尾/位置: --> 长度: ${LASTINDEX}")
  92. math(EXPR LASTINDEX "${LASTINDEX}+1")
  93. spark_debug_message("---> 计算传入路径末尾/右移: --> 长度: ${LASTINDEX}")
  94. string(SUBSTRING "${REALPATH}" ${LASTINDEX} ${REALPATH_LENGTH} REALNAME_Dependency)
  95. # 找 + 号下标,这是找+号的函数
  96. find_plus(${REALPATH} RIGHT_PLUS)
  97. # 判断是否有找到 + 号下标,值为 -1 或 正整数
  98. if(RIGHT_PLUS LESS 0) # 小于0: 不存在 + 号
  99. set(REALNAME "${REALNAME_Dependency}")
  100. spark_debug_message("---> 传入路径末尾/右移部分: --> ${REALNAME} <-- 无依赖+")
  101. spark_debug_message("---> 构建 ${REALNAME} -> ${REALNAME} ${REALPATH} ")
  102. spark_add_library_path(${REALNAME} ${REALPATH})
  103. if(SPARK_FIND_QT5)
  104. target_link_qt5(${REALNAME})
  105. endif(SPARK_FIND_QT5)
  106. if(SPARK_FIND_QT6)
  107. target_link_qt6(${REALNAME})
  108. endif(SPARK_FIND_QT6)
  109. else()
  110. spark_debug_message("---> 传入路径末尾/右移部分: --> ${REALNAME_Dependency} <-- 依赖+")
  111. # 存在+号,将截取从 / 到 + 号之间的内容作为目标名称
  112. # 例如 src/unclassified/widgets/DocTypeListView+JsonDeploy
  113. # ^(LASTINDEX) ^(RIGHT_PLUS)
  114. # 将 RIGHT_PLUS - LASTINDEX 计算出 DocTypeListView 字符长度
  115. math(EXPR REALNAME_LENGTH "${RIGHT_PLUS}-${LASTINDEX}")
  116. spark_debug_message("---> 计算传入路径末尾/右移部分: --> 位置: ${RIGHT_PLUS}")
  117. # spark_debug_message("---> 计算传入路径末尾/右移部分: --> 长度: ${REALNAME_Dependency}")
  118. # 目标名称为 DocTypeListView
  119. # 依赖为 JsonDeploy
  120. # set(REALNAME "")
  121. string(SUBSTRING "${REALPATH}" 0 ${RIGHT_PLUS} _REALPATH_DIR)
  122. string(SUBSTRING "${REALPATH}" ${LASTINDEX} ${REALNAME_LENGTH} REALNAME)
  123. spark_debug_message("---> 计算传入路径末尾/右移部分: --> 库名: ${REALNAME}")
  124. string(SUBSTRING "${REALPATH}" ${RIGHT_PLUS} ${REALPATH_LENGTH} Dependency)
  125. spark_debug_message("---> 计算传入路径末尾/右移部分: --> 库名: ${REALNAME} --> +部分: ${Dependency}")
  126. # plus_list(${Dependency} dependencies dependencies_len)
  127. string(REPLACE "+" ";" dependencies "${Dependency}")
  128. spark_debug_message("---> 计算传入路径末尾/右移部分: --> 库名: ${REALNAME} --> +部分: ${Dependency} --> 列表: ${dependencies} <-- ")
  129. spark_debug_message("---> 构建 ${REALNAME} -> ${REALNAME} ${_REALPATH_DIR}")
  130. spark_add_library_path(${REALNAME} ${_REALPATH_DIR})
  131. # target_link_qt5(${REALNAME}) # 使用依赖的依赖或许也不错
  132. target_include_directories(${REALNAME} PUBLIC ${_REALPATH_DIR})
  133. target_link_libraries(${REALNAME} ${dependencies})
  134. endif(RIGHT_PLUS LESS 0)
  135. endforeach(REALPATH IN LISTS REALPATHS)
  136. endmacro(spark_add_library_realpaths)
  137. # spark_aux_source_paths <var> [paths]...
  138. # 将指定路径中的文件变成可用的AUX源文件列表
  139. # 并提供 <var>_PATHS 记录源文件列表来源
  140. macro(spark_aux_source_paths AUX_VAR)
  141. set(${AUX_VAR} "")
  142. set(${AUX_VAR}_PATHS ${ARGN})
  143. foreach(aux_path IN LISTS ${AUX_VAR}_PATHS)
  144. # spark_debug_message("aux_path: ${aux_path}")
  145. aux_source_directory(${aux_path} ${AUX_VAR})
  146. endforeach(aux_path IN LISTS ${AUX_VAR}_PATHS)
  147. endmacro(spark_aux_source_paths AUX_VAR)
  148. # spark_file_glob <var> [regexp]...
  149. # 使用用 file(GLOB) 的匹配规则,并一次可匹配多个规则
  150. # 并提供 <var>_PATHS 记录规则列表
  151. macro(spark_file_glob FGLOB_VAR)
  152. set(${FGLOB_VAR} "")
  153. set(${FGLOB_VAR}_PATHS ${ARGN})
  154. foreach(fglob_path IN LISTS ${FGLOB_VAR}_PATHS)
  155. file(GLOB FGLOB_PATH_SRCS ${fglob_path})
  156. foreach(fglob_path_src IN LISTS FGLOB_PATH_SRCS)
  157. # spark_debug_message(" -> ${item}")
  158. list(APPEND ${FGLOB_VAR} ${fglob_path_src})
  159. endforeach(fglob_path_src IN LISTS FGLOB_PATH_SRCS)
  160. endforeach(fglob_path IN LISTS ${FGLOB_VAR}_PATHS)
  161. endmacro(spark_file_glob FGLOB_VAR)
  162. # spark_add_source_paths <var> [paths]...
  163. # 扩展 spark_aux_source_paths 宏增加可查找 ui 文件
  164. # 并提供 <var>_PATHS 记录源文件列表来源
  165. macro(spark_add_source_paths SOURCE_VAR)
  166. set(${SOURCE_VAR} "")
  167. set(${SOURCE_VAR}_PATHS ${ARGN})
  168. spark_aux_source_paths(${SOURCE_VAR} ${ARGN})
  169. foreach(source_path IN LISTS ${SOURCE_VAR}_PATHS)
  170. # list(APPEND ${SOURCE_VAR}_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_PATH})
  171. # aux_source_directory(${SOURCE_PATH} _SOURCES)
  172. # foreach(item IN LISTS _SOURCES)
  173. # # spark_debug_message(" -> ${item}")
  174. # list(APPEND ${SOURCE_VAR} ${item})
  175. # endforeach(item IN LISTS _SOURCES)
  176. # file(GLOB HEADER_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_PATH}/*.h)
  177. # foreach(item IN LISTS HEADER_LIST)
  178. # # spark_debug_message(" -> ${item}")
  179. # list(APPEND ${SOURCE_VAR} ${item})
  180. # endforeach(item IN LISTS HEADER_LIST)
  181. file(GLOB UI_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${source_path}/*.ui)
  182. foreach(ui_src IN LISTS UI_SRCS)
  183. # spark_debug_message(" -> ${item}")
  184. list(APPEND ${SOURCE_VAR} ${ui_src})
  185. endforeach(ui_src IN LISTS UI_SRCS)
  186. endforeach(source_path IN LISTS ${SOURCE_VAR}_PATHS)
  187. endmacro(spark_add_source_paths SOURCE_VAR)
  188. # spark_add_library_file_glob <var> <STATIC|SHARED|regexp> [regexp]...
  189. # 基于 regexp 所描述的内容进行构建库
  190. # 这是一个比较简单的 macros 扩展宏
  191. macro(spark_add_library_file_glob _lib_name _lib_type)
  192. if(${_lib_type} STREQUAL SHARED OR ${_lib_type} STREQUAL STATIC)
  193. spark_file_glob(${_lib_name}_SOURCES ${ARGN})
  194. spark_add_library(${_lib_name} ${_lib_type} ${${_lib_name}_SOURCES})
  195. else()
  196. spark_file_glob(${_lib_name}_SOURCES ${_lib_type} ${ARGN})
  197. spark_add_library(${_lib_name} ${${_lib_name}_SOURCES})
  198. endif(${_lib_type} STREQUAL SHARED OR ${_lib_type} STREQUAL STATIC)
  199. endmacro(spark_add_library_file_glob _lib_name _lib_type)