소스 검색

spark: 构建模板更新

zinface 1 년 전
부모
커밋
bac93a1b2b

+ 6 - 4
cmake/SparkEnvConfig.cmake

@@ -8,14 +8,16 @@ set(CMAKE_AUTORCC ON)
 # set(CMAKE_BUILD_TYPE "Debug")
 
 option(SPARK_DEBUG_MESSAGE "CMake Spark Module Debug Message." OFF)
-set(SPAKK_DEBUG_LOGFILE "${CMAKE_BINARY_DIR}/spark_debug.log" CACHE STRING "Spark Build Debug logfile." FORCE)
-file(WRITE ${SPAKK_DEBUG_LOGFILE})
+set(SPARK_DEBUG_LOGFILE "${CMAKE_BINARY_DIR}/spark_debug.log" CACHE STRING "Spark Build Debug logfile." FORCE)
+file(WRITE ${SPARK_DEBUG_LOGFILE})
 
 macro(spark_debug_message)
     if(SPARK_DEBUG_MESSAGE)
         set(SPARK_ONECE_LOG ${ARGN})
-        message("[SPARK_MESSAGE]: " ${SPARK_ONECE_LOG})
-        file(APPEND ${SPAKK_DEBUG_LOGFILE} ${SPARK_ONECE_LOG} "\n")
+        if(NOT "${SPARK_ONECE_LOG}" STREQUAL "")
+            message("[SPARK_MESSAGE]: " ${SPARK_ONECE_LOG})
+        endif(NOT "${SPARK_ONECE_LOG}" STREQUAL "")
+        file(APPEND ${SPARK_DEBUG_LOGFILE} ${SPARK_ONECE_LOG} "\n")
         unset(SPARK_ONECE_LOG)
     endif(SPARK_DEBUG_MESSAGE)
 endmacro(spark_debug_message)

+ 2 - 1
cmake/SparkFindQt5Config.cmake

@@ -21,6 +21,7 @@ spark_add_link(qt5 Qt5::Core Qt5::Widgets Qt5::Network)
     # 同等于 spark_add_link(qt_<name> ${ARGN})
 macro(spark_add_link_qt5 _IN_NAME)
     spark_add_link(qt5_${_IN_NAME} ${ARGN})
+    spark_add_link(qt_${_IN_NAME} ${ARGN})
 endmacro(spark_add_link_qt5 _IN_NAME)
 
 # 使用 spark_add_link_qt5 生成 target_link_qt5_<name> 的宏
@@ -150,4 +151,4 @@ spark_add_links_qt5(
     # XkbCommonSupport
     # Xml
     XmlPatterns
-)
+)

+ 2 - 1
cmake/SparkFindQt6Config.cmake

@@ -21,6 +21,7 @@ spark_add_link(qt6 Qt6::Core Qt6::Widgets Qt6::Network)
     # 同等于 spark_add_link(qt_<name> ${ARGN})
 macro(spark_add_link_qt6 _IN_NAME)
     spark_add_link(qt6_${_IN_NAME} ${ARGN})
+    spark_add_link(qt_${_IN_NAME} ${ARGN})
 endmacro(spark_add_link_qt6 _IN_NAME)
 
 # 使用 spark_add_link_qt6 生成 target_link_qt6_<name> 的宏
@@ -127,4 +128,4 @@ spark_add_links_qt6(
     # WidgetsTools
     # XcbQpaPrivate
     # Xml
-)
+)

+ 61 - 5
cmake/SparkMacrosConfig.cmake

@@ -9,7 +9,7 @@ macro(spark_aux_source_directory OUTVAR INVAR)
     set(iv_args ${ARGN})
     list(LENGTH iv_args iv_arglen)
     
-    file(GLOB iv_SOURCE_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${INVAR}/*.c ${INVAR}/*.cpp)
+    file(GLOB iv_SOURCE_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${INVAR}/*.c ${INVAR}/*.cpp ${INVAR}/*.cc)
     file(GLOB iv_HEADER_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${INVAR}/*.h ${INVAR}/*.hpp)
     file(GLOB iv_QT_UI_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${INVAR}/*.ui ${INVAR}/*.qrc)
 
@@ -142,10 +142,26 @@ macro(spark_add_library_path _lib_name _lib_path)
         endforeach(item_file IN LISTS item_files)
     endforeach(item IN LISTS ${_lib_name}_ARGN_APPEND_PATHS)
 
+    # 3.1 转化 Qt5/6 的 ui 文件
+    set(${_lib_name}_SOURCE_UIS)
+    set(ui_wrap_files)
+    foreach(item IN LISTS ${_lib_name}_ARGN_SOURCES any_files)
+        get_filename_component(ex "${item}" LAST_EXT)
+        if("${ex}" STREQUAL ".ui")
+            list(APPEND ${_lib_name}_SOURCE_UIS ${item})
+        endif("${ex}" STREQUAL ".ui")
+    endforeach(item IN LISTS ${_lib_name}_ARGN_SOURCES any_files)
+    
+    if(SPARK_FIND_QT6)
+        qt_wrap_ui(ui_wrap_files ${${_lib_name}_SOURCE_UIS})
+    elseif(SPARK_FIND_QT5)
+        qt5_wrap_ui(ui_wrap_files ${${_lib_name}_SOURCE_UIS})
+    endif(SPARK_FIND_QT6)
+
     # 4. 构建目标库
     add_library(${_lib_name} ${${_lib_name}_TYPE} 
         ${${_lib_name}_ARGN_SOURCES}
-        ${any_files})
+        ${any_files} ${ui_wrap_files})
 
     # 5. 建立引用点 
         # target_link_<_lib_name> 函数
@@ -205,6 +221,20 @@ macro(spark_add_library_path _lib_name _lib_path)
 
 endmacro(spark_add_library_path _lib_name _lib_path)
 
+# spark_add_shared_library <target> [files ...]
+# 构建一个共享库,基于指定的源代码
+    # 并根据库名生成 target_link_<lib_name> 函数
+macro(spark_add_shared_library _lib_name)
+    spark_add_library(${_lib_name} SHARED ${ARGN})
+endmacro(spark_add_shared_library _lib_name)
+
+# spark_add_shared_library_path <target> [files ... paths]
+# 构建一个共享库,基于指定的路径
+    # 并根据库名生成 target_link_<lib_name> 函数
+macro(spark_add_shared_library_path _lib_name)
+    spark_add_library_path(${_lib_name} SHARED ${ARGN})
+endmacro(spark_add_shared_library_path _lib_name)
+
 # spark_add_executable <exec_name> [files]...
 # 构建一个可执行文件,基于指定的源文件
     # Qt编译时源文件包括很多类型,需要指定 *.h/*.cpp/*.qrc/*.qm/... 等
@@ -282,6 +312,22 @@ macro(spark_add_executable_path _exec_name _exec_path)
             spark_debug_message("       ${item_file}")
         endforeach(item_file IN LISTS item_files)
     endforeach(item IN LISTS ${_exec_name}_ARGN_APPEND_PATHS)
+
+    # 3.1 转化 Qt5/6 的 ui 文件
+    set(${_exec_name}_SOURCE_UIS)
+    set(ui_wrap_files)
+    foreach(item IN LISTS ${_exec_name}_ARGN_SOURCES any_files)
+        get_filename_component(ex "${item}" LAST_EXT)
+        if("${ex}" STREQUAL ".ui")
+            list(APPEND ${_exec_name}_SOURCE_UIS ${item})
+        endif("${ex}" STREQUAL ".ui")
+    endforeach(item IN LISTS ${_exec_name}_ARGN_SOURCES any_files)
+    
+    if(SPARK_FIND_QT6)
+        qt_wrap_ui(ui_wrap_files ${${_exec_name}_SOURCE_UIS})
+    elseif(SPARK_FIND_QT5)
+        qt5_wrap_ui(ui_wrap_files ${${_exec_name}_SOURCE_UIS})
+    endif(SPARK_FIND_QT6)
  
     # 3. 构建可执行目标所需要的文件
     # add_executable(${_exec_name} 
@@ -290,7 +336,7 @@ macro(spark_add_executable_path _exec_name _exec_path)
 
     target_sources(${_exec_name} PRIVATE
         ${${_exec_name}_ARGN_SOURCES}
-        ${any_files})
+        ${any_files} ${ui_wrap_files})
 
      # 4. 建立引用点 
         # target_<_exec_name>_include 函数
@@ -328,6 +374,15 @@ macro(spark_find_library _prefix)
 
 endmacro(spark_find_library _prefix)
 
+macro(target_link_qt)
+    
+    if(SPARK_FIND_QT6)
+        target_link_qt6(${ARGN})
+    elseif(SPARK_FIND_QT5)
+        target_link_qt5(${ARGN})
+    endif(SPARK_FIND_QT6)
+
+endmacro(target_link_qt)
 
 # spark_add_executable_paths
 # 自定义构建宏,基于指定的前缀名称,处理后续参数为子目录
@@ -339,8 +394,9 @@ macro(spark_add_executable_paths _prefix_path)
     foreach(item IN LISTS PATHS)
         file(GLOB QRCS "${item}/*.qrc")
         spark_debug_message(">>> add_executable: " "${_prefix_path}-${item} ${item} + ${QRCS}")
-        spark_add_executable_path(${_prefix_path}-${item} ${item} ${QRCS})
-        target_link_qt5(${_prefix_path}-${item})
+        string(REPLACE "/" "-" new_item "${item}")
+        spark_add_executable_path(${_prefix_path}-${new_item} ${item} ${QRCS})
+        target_link_qt(${_prefix_path}-${item})
     endforeach(item IN LISTS PATHS)
 endmacro(spark_add_executable_paths _prefix_path)
 

+ 107 - 11
cmake/SparkMacrosExtendConfig.cmake

@@ -107,19 +107,13 @@ endmacro(spark_add_library_source target)
 
 # 冗余的 target_link_qt5 或 qt6 的处理逻辑
 macro(_handle_spark_target_link_qt_macro _target)
-    if(SPARK_FIND_QT5)
-        target_link_qt5(${_target})
-    endif(SPARK_FIND_QT5)
-
-    if(SPARK_FIND_QT6)
-        target_link_qt6(${_target})
-    endif(SPARK_FIND_QT6)
+    target_link_qt(${_target})
 endmacro(_handle_spark_target_link_qt_macro _target)
 
-# spark_add_library_realpaths
+# spark_add_library_realpaths [dirs ...]
 # 基于传入的项进行构建
-# 可接受的值为: 路径列表
-# 可接受的值为: 路径列表+依赖库A+依赖库B
+    # 可接受的值为: 路径列表
+    # 可接受的值为: 路径列表+依赖库A+依赖库B
 macro(spark_add_library_realpaths)
 
     set(REALPATHS ${ARGN})
@@ -167,7 +161,57 @@ macro(spark_add_library_realpaths)
 endmacro(spark_add_library_realpaths)
 
 
-# spark_aux_source_paths <var> [paths]...
+# spark_add_shared_library_realpaths [dirs ...]
+# 基于传入的项进行构建
+    # 可接受的值为: 路径列表
+    # 可接受的值为: 路径列表+依赖库A+依赖库B
+macro(spark_add_shared_library_realpaths)
+
+    set(REALPATHS ${ARGN})
+    foreach(REALPATH IN LISTS REALPATHS)
+
+        # # 找 : 号下标,这是找:号的函数
+        # find_colon(${REALPATH} COLON_INDEX)
+        # 找 / 号下标,这是找/号的函数
+        find_dir_v(REALPATH SLASH_INDEX REVERSE)
+        # 找 + 号下标,这是找+号的函数
+        find_plus_v(REALPATH PLUS_INDEX)
+
+        # +
+        if(PLUS_INDEX LESS 0)
+            # 完全没有 + 的情况下,它就是一个基于目录的构建
+            set(dir ${REALPATH})
+            str_right_v(REALPATH SLASH_INDEX target)
+
+            spark_add_library_path(${target} SHARED
+                ${dir}
+                ${${target}_ADD_SOURCE}
+            )
+            # 使用 spark_add_library_realpaths 构建的依赖将允许直接引用库头文件
+            target_include_directories(${target} PUBLIC ${dir})
+            _handle_spark_target_link_qt_macro(${target})
+        else()
+            # 有 + 的情况下,获取 + 号下标右侧所有内容为 target_depends_str 并转为列表
+            str_right_v(REALPATH PLUS_INDEX target_depends_str)
+            string(REPLACE "+" ";" target_depends "${target_depends_str}")
+            
+            find_dir_plus_v(REALPATH target)
+            str_left_v(REALPATH PLUS_INDEX dir)
+
+            spark_add_library_path(${target} SHARED
+                ${dir}
+                ${${target}_ADD_SOURCE}
+            )
+            spark_debug_message("  [INCLUDE_DIRS]: ${dir} ${dir}/.. \n")
+            target_include_directories(${target} PUBLIC ${dir} ${dir}/..)
+            target_link_libraries(${target} ${target_depends})
+        endif(PLUS_INDEX LESS 0)
+
+    endforeach(REALPATH IN LISTS REALPATHS)
+
+endmacro(spark_add_shared_library_realpaths)
+
+# spark_aux_source_paths
 # 将指定路径中的文件变成可用的AUX源文件列表
     # 并提供 <var>_PATHS 记录源文件列表来源
 macro(spark_aux_source_paths AUX_VAR)
@@ -341,3 +385,55 @@ endmacro(spark_add_executable_realpaths)
 # 2.构建一个可执行目标,基于指定的文件路径进行构建(也许可以)
 # 3.构建一个可执行目标,基于指定的文件名称进行构建()
 # 4.构建一个可执行目标,基于指定命名规则(target:dir:dir+depend+depend...)
+
+
+# 一行一目标概念:集成(一行一库 + 一行一可执行目标)
+# 1.构建一个目标,基于指定的目录进行构建(适用于library与executable)
+# 3.构建一个目标,命名规则与集成相同,类型只需要写一个前缀标识
+#   s[hared],d[yamic],t[可执行]
+#     静态库  s:dir+depend+depend...
+#     动态库  d:dir+depend+depend...
+#     可执行  t:<target>:dir+depend+depend...
+#                ^ 可执行目标名称
+
+# 一行一目标
+# spark_add_target_realpaths <tag> [realpaths]
+# realpaths:
+    # s: static (s:src/libs/hello)
+    # d: shared (d:src/libs/say)
+    # t: target (t:<target>:src+hello+say)
+# 参考
+    # spark_add_executable_realpaths 
+    # spark_add_shared_library_realpaths 
+    # spark_add_library_realpaths 
+macro(spark_add_target_realpaths tag)
+    set(${tag}_ARGN ${ARGN})
+
+    foreach(item IN LISTS ${tag}_ARGN)
+        str_left(${item}  1 item_type)
+        str_right(${item} 1 item_val)
+
+        if("${item_type}" STREQUAL "t")
+            set(item_message "可执行文件")
+        elseif("${item_type}" STREQUAL "d")
+            set(item_message "动态库")
+        elseif("${item_type}" STREQUAL "s")
+            set(item_message "静态库")
+        endif("${item_type}" STREQUAL "t")
+
+        spark_debug_message("代号: [${tag}] 构建 ${item_val}, 类型: ${item_message}")
+        spark_debug_message("     * ${item_val}")
+
+        if("${item_type}" STREQUAL "t")
+            spark_add_executable_realpaths(${item_val})
+        elseif("${item_type}" STREQUAL "d")
+            spark_add_shared_library_realpaths(${item_val})
+        elseif("${item_type}" STREQUAL "s")
+            spark_add_library_realpaths(${item_val})
+        endif("${item_type}" STREQUAL "t")
+
+        spark_debug_message("")
+
+    endforeach(item IN LISTS  ${tag}_ARGN)
+
+endmacro(spark_add_target_realpaths tag)

+ 8 - 1
cmake/SparkTranslatorConfig.cmake

@@ -9,12 +9,19 @@ macro(translator_qt5 _qmvar)
     
     set(${_qmvar}_ARNG ${ARGN})
     file(GLOB ${_qmvar}_TS_FILES ${${_qmvar}_ARNG})
+    
     find_package(Qt5LinguistTools)
-
     qt5_add_translation(${_qmvar}
         ${${_qmvar}_TS_FILES})
 
     set(SPARK_QM_TRANSLATIONS ${_qmvar})
+
+    spark_debug_message("> QT Translation: ${_qmvar}")
+    file(WRITE ${CMAKE_BINARY_DIR}/${_qmvar} "")
+    foreach(item IN LISTS ${_qmvar})
+        file(APPEND ${CMAKE_BINARY_DIR}/${_qmvar} "${item}\n")
+        spark_debug_message("      ${item}")
+    endforeach(item IN LISTS ${_qmvar})
     
     # 注意,必须将 SPARK_QM_TRANSLATIONS 或 ${_qmvar} 加入到 add_executable 参数中才能在编译时生成只有原文的ts文件