From 5e621b58d31f9f54d55905a0983702a01cacfed3 Mon Sep 17 00:00:00 2001 From: zinface Date: Wed, 25 Oct 2023 18:17:48 +0800 Subject: [PATCH] =?UTF-8?q?spark-build:=20=E6=9B=B4=E6=96=B0=20cmake-spark?= =?UTF-8?q?=20=E7=B3=BB=E5=88=97=E6=9E=84=E5=BB=BA=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 4 +- cmake/SparkAppimageConfig.cmake | 120 ++++--- ...nfig.cmake => SparkDebPackageConfig.cmake} | 27 +- cmake/SparkDesktopMacros.cmake | 58 ++- cmake/SparkEnvConfig.cmake | 16 +- cmake/SparkFindQt5Config.cmake | 139 +++++++- cmake/SparkFindQt6Config.cmake | 116 +++++- cmake/SparkMacrosConfig.cmake | 140 ++++++-- cmake/SparkMacrosExtendConfig.cmake | 332 ++++++++++++++++++ ...eb.descript => spark-deb-package.descript} | 6 +- ...esktop.in => spark-desktop.desktop.in.txt} | 4 +- 11 files changed, 833 insertions(+), 129 deletions(-) rename cmake/{DebPackageConfig.cmake => SparkDebPackageConfig.cmake} (90%) create mode 100644 cmake/SparkMacrosExtendConfig.cmake rename cmake/{package-deb.descript => spark-deb-package.descript} (92%) rename cmake/{spark-desktop.desktop.in => spark-desktop.desktop.in.txt} (88%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1961630..c178e45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,8 +30,8 @@ install(DIRECTORY src/sakuraassistant/pkg/usr DESTINATION "/") # deb 构建支持 -find_package(DebPackage PATHS ${CMAKE_SOURCE_DIR}) -add_package_descript(cmake/package-deb.descript) +find_package(SparkDebPackage PATHS ${CMAKE_SOURCE_DIR}) +add_package_descript(cmake/spark-deb-package.descript) # 预留,Appimage 构建支持 diff --git a/cmake/SparkAppimageConfig.cmake b/cmake/SparkAppimageConfig.cmake index 40649f8..9a25121 100644 --- a/cmake/SparkAppimageConfig.cmake +++ b/cmake/SparkAppimageConfig.cmake @@ -24,41 +24,60 @@ # default.desktop 文件与 default.png 文件的生成。 # 这是一个依赖的 copy-desktop-appimage 目标,并先行执行 -# if () -set(APPIMAGE_OUTPUT "${CMAKE_BINARY_DIR}/appimage") -set(APPIMAGE_ICON "${APPIMAGE_OUTPUT}/default.png") -set(APPIMAGE_DESTKOP "${APPIMAGE_OUTPUT}/default.desktop") -# set(LINUXDEPLOYQT) -# set(APPIMAGETOOL) - -function(execute_linuxdeploy _PATH) - execute_process(COMMAND ${LINUXDEPLOYQT} - WORKING_DIRECTORY "${APPIMAGE_OUTPUT}" - ) -endfunction(execute_linuxdeploy _PATH) +# 要求: + # LINUXDEPLOYQT 提供的外部参数,一般指 linuxdeployqt 程序路径 + # APPIMAGETOOL 提供的外部参数,一般指 appimagetool 程序路径 + +option(USE_APPIMAGE_NEW_GLIBC "允许在打包过程中使用较新版本的 glibc 库" ON) + +set(APPIMAGE_OUTPUT "${CMAKE_BINARY_DIR}/appimage") +set(APPIMAGE_OUTPUT_ICON "${APPIMAGE_OUTPUT}/default.png") +set(APPIMAGE_OUTPUT_DESTKOP "${APPIMAGE_OUTPUT}/default.desktop") + +# 1. 添加一个可以用于 Appimage 使用的图标文件 +function(add_appimage_icon _icon) + if(CMAKE_VERSION VERSION_LESS 3.21) + message("> cmake version is less than 3.21") + configure_file(${_icon} ${APPIMAGE_OUTPUT_ICON} COPYONLY) + else() + file(MAKE_DIRECTORY ${APPIMAGE_OUTPUT}) + file(COPY_FILE ${_icon} ${APPIMAGE_OUTPUT_ICON}) + endif(CMAKE_VERSION VERSION_LESS 3.21) +endfunction(add_appimage_icon _icon) + +# 2. 基于 SparkDesktopMacros.cmake 提供的宏来定义 desktop 内容说明 + # 使用与自身的 desktop.in 模板进行生成 +function(add_appimage_desktop) + configure_file(cmake/spark-appimage.desktop.in + ${APPIMAGE_OUTPUT_DESTKOP} @ONLY) +endfunction(add_appimage_desktop) function(target_linuxdeploy) - add_custom_target(linuxdeploy pwd - BYPRODUCTS appimage - COMMAND cp ../${PROJECT_NAME} . - COMMAND "${LINUXDEPLOYQT}" ${PROJECT_NAME} -appimage -unsupported-allow-new-glibc -verbose=3 -no-strip|| true - COMMAND cp ../spark-appimage.desktop default.desktop - COMMAND cp ../spark-appimage.png default.png - WORKING_DIRECTORY "${APPIMAGE_OUTPUT}") + + if(USE_APPIMAGE_NEW_GLIBC) + message("Use New glibc") + add_custom_target(linuxdeploy pwd + BYPRODUCTS appimage + COMMAND "${LINUXDEPLOYQT}" ${PROJECT_NAME} -appimage -unsupported-allow-new-glibc -verbose=3 -no-strip|| true + WORKING_DIRECTORY "${APPIMAGE_OUTPUT}") + else() + message("Un Use New glibc") + add_custom_target(linuxdeploy pwd + BYPRODUCTS appimage + COMMAND "${LINUXDEPLOYQT}" ${PROJECT_NAME} -appimage -verbose=3 -no-strip|| true + WORKING_DIRECTORY "${APPIMAGE_OUTPUT}") + endif(USE_APPIMAGE_NEW_GLIBC) + endfunction(target_linuxdeploy) function(target_appimage) - add_custom_target(copy-desktop-appimage - COMMAND cp ../spark-appimage.desktop default.desktop - COMMAND cp ../spark-appimage.png default.png - WORKING_DIRECTORY "${APPIMAGE_OUTPUT}") add_custom_target(appimage pwd COMMAND ${APPIMAGETOOL} ${APPIMAGE_OUTPUT} - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - DEPENDS copy-desktop-appimage) + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") endfunction(target_appimage) -function(add_appimage) +# 3. 添加对目标的 Appimage 构建,Appimage 在一个项目中只能构建一个目标 +function(add_appimage_target _target) # check linuxdeploy if(NOT DEFINED LINUXDEPLOYQT) message("AppImage> Not Found LINUXDEPLOYQT Variable!") @@ -84,40 +103,46 @@ function(add_appimage) else() file(REAL_PATH ${APPIMAGETOOL} APPIMAGETOOL_REAL_PATH) endif(CMAKE_VERSION VERSION_LESS 3.19 AND NOT EXISTS ${LINUXDEPLOYQT}) - message("AppImage> Found APPIMAGETOOL Variable: ${LINUXDEPLOYQT_REAL_PATH}") + message("AppImage> Found APPIMAGETOOL Variable: ${APPIMAGETOOL}") # do add_custome_target make_directory(${APPIMAGE_OUTPUT}) target_linuxdeploy() target_appimage() -endfunction(add_appimage) -function(add_appimage_desktop) - configure_file(cmake/spark-appimage.desktop.in - ${CMAKE_BINARY_DIR}/spark-appimage.desktop @ONLY) -endfunction(add_appimage_desktop) + # 重设目标输出的目录 + set_target_properties(${PROJECT_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${APPIMAGE_OUTPUT}") -function(add_appimage_icon _ICON_PATH) - if(CMAKE_VERSION VERSION_LESS 3.21) - message("> cmake version is less than 3.21") - configure_file(${_ICON_PATH} ${CMAKE_BINARY_DIR}/spark-appimage.png COPYONLY) - else() - file(COPY_FILE ${_ICON_PATH} ${CMAKE_BINARY_DIR}/spark-appimage.png) - endif(CMAKE_VERSION VERSION_LESS 3.21) -endfunction(add_appimage_icon _ICON_PATH) + # 为解决在不使用 -unsupported-allow-new-glibc 参数时, + # 可能不会生成 AppRun 软链接的问题 + if(NOT USE_APPIMAGE_NEW_GLIBC) + set_target_properties(${PROJECT_NAME} + PROPERTIES + RUNTIME_OUTPUT_NAME "AppRun") + endif(NOT USE_APPIMAGE_NEW_GLIBC) +endfunction(add_appimage_target _target) -# 如果glic>=2.27,你就需要加上参数 -unsupported-allow-new-glibc (意思就是不再低版本发行版使用了) -# 或 -unsupported-bundle-everything(大概的意思是尝试兼容,实际测试,到其他发行版直接用不了了,有可能是发行版的原因,还是建议用前者,虽然放弃了低版本) +# 如果 glic>=2.27, 你就需要加上参数 -unsupported-allow-new-glibc 意思就是不再低版本发行版使用了 +# 或 -unsupported-bundle-everything +# 大概的意思是尝试兼容,实际测试,到其他发行版直接用不了了,有可能是发行版的原因,还是建议用前者,虽然放弃了低版本 # -unsupported-bundle-everything - # 捆绑所有依赖库,包括 ld-linux.so 加载器和 glibc。这将允许构建在较新系统上的应用程序在较旧的目标系统上运行,但不建议这样做,因为它会导致捆绑包超出所需的大小(并且可能到其他发行版无法使用) + # 捆绑所有依赖库,包括 ld-linux.so 加载器和 glibc。 + # 这将允许构建在较新系统上的应用程序在较旧的目标系统上运行, + # 但不建议这样做,因为它会导致捆绑包超出所需的大小(并且可能到其他发行版无法使用) # -unsupported-allow-new-glibc - # 允许 linuxdeployqt 在比仍受支持的最旧 Ubuntu LTS 版本更新的发行版上运行。这将导致 AppImage无法在所有仍受支持的发行版上运行,既不推荐也不测试或支持 + # 允许 linuxdeployqt 在比仍受支持的最旧 Ubuntu LTS 版本更新的发行版上运行。 + # 这将导致 AppImage无法在所有仍受支持的发行版上运行,既不推荐也不测试或支持 -# ./linuxdeployqt-7-x86_64.AppImage 程序目录/程序 -appimage -unsupported-allow-new-glibc -# ./linuxdeployqt-7-x86_64.AppImage 程序目录/程序 -appimage -unsupported-bundle-everything +# 对 linuxdeployqt 的使用 +# ./linuxdeployqt-7-x86_64.AppImage + # 程序目录/程序 -appimage -unsupported-allow-new-glibc +# ./linuxdeployqt-7-x86_64.AppImage + # 程序目录/程序 -appimage -unsupported-bundle-everything @@ -126,7 +151,7 @@ endfunction(add_appimage_icon _ICON_PATH) # include(cmake/SparkAppimageConfig.cmake) # 导入来自 Spark 构建的 Appimage 构建 # add_appimage_icon(assets/spark.png) # 添加到 Appimage 中的默认的图标 # add_appimage_desktop() # 添加到 Appimage 中的默认desktop(使用来自 Spark 构建的 Desktop 构建中配置的信息(必须要求 spark-desktop)) -# add_appimage() # 应用对 Appimage 的构建 +# add_appimage_target(${PROJECT_NAME}) # 添加到 Appimage 中的默认目标,应用对 Appimage 的构建 # 2. 在 Makefile 进行构建目标构建 Appimage 的构建流 -- # 在 Makefile 进行构建目标构建 Appimage (要求提供工具的绝对路径,然后可依次进行linuxdeployqt, genrate-appimage) @@ -150,3 +175,4 @@ endfunction(add_appimage_icon _ICON_PATH) # genrate-appimage: # cd build && cmake .. -DLINUXDEPLOYQT=$(LINUXDEPLOYQT) -DAPPIMAGETOOL=$(APPIMAGETOOL) # cd build && make appimage + diff --git a/cmake/DebPackageConfig.cmake b/cmake/SparkDebPackageConfig.cmake similarity index 90% rename from cmake/DebPackageConfig.cmake rename to cmake/SparkDebPackageConfig.cmake index 59950ec..d881ad3 100644 --- a/cmake/DebPackageConfig.cmake +++ b/cmake/SparkDebPackageConfig.cmake @@ -172,6 +172,12 @@ function(set_package_vars _IN_KEY _IN_VAL) set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "${_IN_VAL}" PARENT_SCOPE) message("--> 软件建议: ${_IN_VAL}") endif(_Recommends EQUAL "0") + + find_str("${_IN_KEY}" "Conflicts" _Conflicts) + if(_Conflicts EQUAL "0") + set(CPACK_DEBIAN_PACKAGE_CONFLICTS "${_IN_VAL}" PARENT_SCOPE) + message("--> 软件冲突: ${_IN_VAL}") + endif(_Conflicts EQUAL "0") endfunction(set_package_vars _IN_KEY _IN_VAL) @@ -238,7 +244,12 @@ function(add_package_descript IN_DES) set(PREV_DES_LINE "") while(NOT PREV_DES_LINE STREQUAL DES_LINE) if(NOT PREV_DES_LINE STREQUAL "") - set(Descrition "${Descrition}\n${DES_LINE}") + if ("${CMAKE_VERSION}" VERSION_LESS "3.15") + set(Descrition "${Descrition}\n${DES_LINE}") + else() + string(STRIP "${DES_LINE}" STRIP_DES_LINE) + set(Descrition "${Descrition}\n${STRIP_DES_LINE}") + endif("${CMAKE_VERSION}" VERSION_LESS "3.15") endif(NOT PREV_DES_LINE STREQUAL "") set(PREV_DES_LINE "${DES_LINE}") sub_next(${DES_CONTENT} NEXT_INDEX DES_LINE DES_CONTENT) @@ -275,6 +286,17 @@ function(add_package_descript IN_DES) ) set(CPACK_DEBIAN_FILE_NAME ${_DebFileName}) + # 标识: spark-deb-package + if(NOT "${PACKAGE_SUFFIX}" STREQUAL "") + # eg: remove '_' of '_Debian' + string(SUBSTRING "${PACKAGE_SUFFIX}" 1 -1 DISTRIBUTION) + if ("${CMAKE_VERSION}" VERSION_LESS "3.15") + set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${Descrition}\n .\n Build for ${DISTRIBUTION} through spark-deb-build.") + else() + set(CPACK_DEBIAN_PACKAGE_DESCRIPTION ${Descrition} "\n.\nBuild for ${DISTRIBUTION} through spark-deb-build.") + endif("${CMAKE_VERSION}" VERSION_LESS "3.15") + + endif(NOT "${PACKAGE_SUFFIX}" STREQUAL "") # set(CPACK_DEBIAN_PACKAGE_NAME "${Package}") # set(CPACK_DEBIAN_PACKAGE_VERSION "${Version}") @@ -307,7 +329,7 @@ endfunction(add_package_descript IN_DES) # CPACK_DEBIAN_FILE_NAME - n # CPACK_DEBIAN_PACKAGE_NAME - y # CPACK_DEBIAN_PACKAGE_VERSION - y -# CPACK_DEBIAN_PACKAGE_ARCHITECTURE - y(auto) +# CPACK_DEBIAN_PACKAGE_ARCHITECTURE - y(auto) -> dpkg --print-architecture # CPACK_DEBIAN_PACKAGE_DEPENDS - y # CPACK_DEBIAN_PACKAGE_PRIORITY - y # CPACK_DEBIAN_PACKAGE_MAINTAINER - y @@ -320,4 +342,5 @@ endfunction(add_package_descript IN_DES) # set(ARCHITECTURE "arm64") # endif() + # string(TIMESTAMP BUILD_TIME "%Y%m%d") diff --git a/cmake/SparkDesktopMacros.cmake b/cmake/SparkDesktopMacros.cmake index 255a205..d88755a 100644 --- a/cmake/SparkDesktopMacros.cmake +++ b/cmake/SparkDesktopMacros.cmake @@ -1,16 +1,19 @@ +# SparkDesktopMacros.cmake -macro(spark_desktop_macros _APP_NAME _APP_NAME_ZH_CN _APP_COMMENT _APP_TYPE _APP_EXECUTE_PATH _APP_EXECUTE_ICON_PATH _APP_CATEGORIES) - set(APP_NAME ${_APP_NAME}) - set(APP_NAME_ZH_CN ${_APP_NAME_ZH_CN}) - set(APP_COMMENT ${_APP_COMMENT}) - set(APP_TYPE ${_APP_TYPE}) - set(APP_EXECUTE_PATH ${_APP_EXECUTE_PATH}) - set(APP_EXECUTE_ICON_PATH ${_APP_EXECUTE_ICON_PATH}) - set(APP_CATEGORIES ${_APP_CATEGORIES}) - configure_file(cmake/spark-desktop.desktop.in - ${CMAKE_BINARY_DIR}/${_APP_NAME}.desktop +macro(spark_desktop_macros) + set(APP_NAME ${ARGV0}) + set(APP_NAME_ZH_CN ${ARGV1}) + set(APP_COMMENT ${ARGV2}) + set(APP_TYPE ${ARGV3}) + set(APP_EXECUTE_PATH ${ARGV4}) + set(APP_EXECUTE_ICON_PATH ${ARGV5}) + set(APP_CATEGORIES ${ARGV6}) + set(APP_MIME_TYPE ${ARGV7}) + configure_file(cmake/spark-desktop.desktop.in.txt + ${CMAKE_BINARY_DIR}/${ARGV0}.desktop ) -endmacro(spark_desktop_macros _APP_NAME _APP_NAME_ZH_CN _APP_COMMENT _APP_TYPE _APP_EXECUTE_PATH _APP_EXECUTE_ICON_PATH _APP_CATEGORIES) + set(SPARK_DESKTOP_FILE ${CMAKE_BINARY_DIR}/${ARGV0}.desktop) +endmacro(spark_desktop_macros) # include(cmake/SparkDesktopMacros.cmake) # 内容默认应用名称: Name= 应与项目名称相同 @@ -22,33 +25,26 @@ endmacro(spark_desktop_macros _APP_NAME _APP_NAME_ZH_CN _APP_COMMENT _APP_TYPE _ # 执行程序: Exec= # 图标路径: Icon= # 应用分类: Category= + # MIME类型: MimeType= # ) +# TODO 安装位置:INSTALL(将自动实现 install 文件,如 /usr/share/applications) + +# install(FILES ${APP_NAME}.desktop +# DESTINATION /usr/share/applications +# ) + # 或者 +# install(FILES ${SPARK_DESKTOP_FILE} +# DESTINATION /usr/share/applications +# ) + +# 基于 configure_file 填充内容配置 # configure_file( # [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS | # FILE_PERMISSIONS ...] # [COPYONLY] [ESCAPE_QUOTES] [@ONLY] # [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ]) -# install(FILES ${APP_NAME}.desktop +# install(FILES ${SPARK_DESKTOP_FILE}.desktop # DESTINATION /usr/share/applications # ) - -################ 提供用于 Appimage 所用的配置 ################################ -# 内容默认应用名称: Name= 应与项目名称相同 -spark_desktop_macros( - # 应用名称: Name= - ${PROJECT_NAME} - # 应用名称: Name[zh_CN]= - 樱花助手 - # 应用说明: Comment= - 樱花助手 - # 应用类型: Type= - Application - # 执行程序: Exec= - "/usr/bin/spark-assistant %F" - # 图标路径: Icon= - "spark-assistant" - # 应用分类: Category= - Application -) \ No newline at end of file diff --git a/cmake/SparkEnvConfig.cmake b/cmake/SparkEnvConfig.cmake index 797faf4..cbc334c 100644 --- a/cmake/SparkEnvConfig.cmake +++ b/cmake/SparkEnvConfig.cmake @@ -5,4 +5,18 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) -# set(CMAKE_BUILD_TYPE "Debug") \ No newline at end of file +# 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}) + +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") + unset(SPARK_ONECE_LOG) + endif(SPARK_DEBUG_MESSAGE) +endmacro(spark_debug_message) + diff --git a/cmake/SparkFindQt5Config.cmake b/cmake/SparkFindQt5Config.cmake index d9f1825..ccd5580 100644 --- a/cmake/SparkFindQt5Config.cmake +++ b/cmake/SparkFindQt5Config.cmake @@ -1,20 +1,22 @@ cmake_minimum_required(VERSION 3.5.1) -find_package(Qt5 COMPONENTS Core Widgets Network) +set(SPARK_FIND_QT5 TRUE) + +find_package(Qt5 COMPONENTS Core Widgets Network REQUIRED) # function(target_link_qt5 NAME) -# target_link_libraries(${NAME} +# target_link_libraries(${NAME} # Qt5::Core # Qt5::Widgets # Qt5::Network) # endfunction(target_link_qt5 NAME) -# 使用 spark_add_link 生成 target_link_qt5 以替代上面内容 +# 使用 spark_add_link 生成 target_link_qt5 以替代上面内容 spark_add_link(qt5 Qt5::Core Qt5::Widgets Qt5::Network) -# spark_add_link_qt5 -# 自定义宏 target_link_qt5 以扩展 target_link_qt5_ 结构 +# spark_add_link_qt5 +# 自定义宏 spark_add_link_qt5 以扩展 target_link_qt5_ 结构 # _IN_NAME: 此宏使用嵌套宏 spark_add_link 时追加 名称 # 同等于 spark_add_link(qt_ ${ARGN}) macro(spark_add_link_qt5 _IN_NAME) @@ -22,3 +24,130 @@ macro(spark_add_link_qt5 _IN_NAME) endmacro(spark_add_link_qt5 _IN_NAME) # 使用 spark_add_link_qt5 生成 target_link_qt5_ 的宏 +# spark_add_link_qt5(Concurrent Qt5::Concurrent) + +# 高级自定义 +# spark_add_links_qt5 +# 自定义宏 spark_add_links_qt5 以扩展 spark_add_link_qt5 宏配置组 + # 特点: 任意长度参数 + # qt5_item: 为进行遍历后的单项,类似于 python3 中的 (for item in items:) + # 例如: qt5_item 为 Core: + # spark_add_link_qt5(${qt5_item} Qt5::${qt5_item}) + # 展开为 spark_add_link_qt5(Core Qt5::Core) + # 展开为 spark_add_link(qt5_Core Qt5::Core) + # 展开为 spark_add_link(qt5_Core Qt5::Core) + # 特性: 增加 qt5_Core 转 qt5_core + # string(TOLOWER ) +macro(spark_add_links_qt5) + set(qt5_items ${ARGN}) + foreach(qt5_item IN LISTS qt5_items) + find_package(Qt5${qt5_item}) + spark_add_link_qt5(${qt5_item} Qt5::${qt5_item}) + + string(TOLOWER "${qt5_item}" qt5_lower_item) + spark_add_link_qt5(${qt5_lower_item} Qt5::${qt5_item}) + spark_debug_message("add_target_link_qt5_${qt5_item} or add_target_link_qt5_${qt5_lower_item}") + endforeach(qt5_item IN LISTS qt5_items) +endmacro(spark_add_links_qt5) + + +# Core 用于其它模块的核心非图形类。 +# GUI 图形用户界面 GUI 组件基类。包括 OpenGL。 +# Multimedia 音频 视频 无线电 摄像头功能类。 +# Multimedia Widgets 用于实现多媒体功能,基于 Widget 的类。 +# Network 使网络编程更容易和更可移植的类。 + +# QML QML 和 JavaScript 语言类。 +# Quick 以自定义用户界面 UI 构建高动态应用程序的声明性框架。 +# Quick Controls 为桌面、嵌入式及移动设备创建高性能用户界面提供轻量 QML 类型。这些类型运用简单样式化体系结构且非常高效。 +# Quick Dialogs 用于从 Qt Quick 应用程序创建系统对话框,并与之交互的类型。 +# Quick Layouts 布局是用于在用户界面中排列基于 Qt Quick 2 项的项。 +# Quick Test 用于 QML 应用程序的单元测试框架,其测试案例被编写成 JavaScript 函数。 + # 注意: 二进制保证不兼容 Qt Quick Test,但源代码仍兼容。 + +# Qt SQL 集成使用 SQL 数据库的类。 +# Qt Test 单元测试 Qt 应用程序和库的类。 + # 注意: 二进制保证不兼容 Qt Test,但源代码仍兼容。 +# Qt Widgets 以 C++ 小部件扩展 Qt GUI 的类。 + + + +# 找出所有 Qt5 模板 +# find /usr/lib/x86_64-linux-gnu/cmake/ -name "*Config.cmake" | sed 's@^.*/Qt5@Qt5@;' | grep ^Qt5 + +# 掐头去尾,洗一次 +# find /usr/lib/x86_64-linux-gnu/cmake/ -name "*Config.cmake" | sed 's@^.*/Qt5@Qt5@;' | grep ^Qt5 | sed 's@^Qt5@@; s@Config.cmake$@@; /^\s*$/d' + +# 排序 +# find /usr/lib/x86_64-linux-gnu/cmake/ -name "*Config.cmake" | sed 's@^.*/Qt5@Qt5@;' | grep ^Qt5 | sed 's@^Qt5@@; s@Config.cmake$@@; /^\s*$/d' | sort | pr -t -3 + +spark_add_links_qt5( + # AccessibilitySupport + # AttributionsScannerTools + # Concurrent + # Core + # DBus + # Designer + # DesignerComponents + # DeviceDiscoverySupport + # DocTools + # EdidSupport + # EglFSDeviceIntegration + # EglFsKmsSupport + # EglSupport + # EventDispatcherSupport + # FbSupport + # FontDatabaseSupport + # GlxSupport + # Gui + # Help + # InputSupport + # KmsSupport + # LinguistTools + # LinuxAccessibilitySupport + # Network + # OpenGL + # OpenGLExtensions + # PacketProtocol + # PlatformCompositorSupport + # Positioning + # PositioningQuick + # PrintSupport + # Qml + # QmlDebug + # QmlDevTools + # QmlImportScanner + # QmlModels + # QmlWorkerScript + # Quick + # QuickCompiler + # QuickControls2 + # QuickParticles + # QuickShapes + # QuickTemplates2 + # QuickTest + # QuickWidgets + # SerialBus + # SerialPort + # ServiceSupport + # Sql + # Svg + # Test + # ThemeSupport + # UiPlugin + # UiTools + # VulkanSupport + # WebChannel + # WebEngine + # WebEngineCore + # WebEngineWidgets + # WebKit + # WebKitWidgets + # WebSockets + # Widgets + # X11Extras + # XcbQpa + # XkbCommonSupport + # Xml + # XmlPatterns +) diff --git a/cmake/SparkFindQt6Config.cmake b/cmake/SparkFindQt6Config.cmake index c69a1ca..2c9d8cc 100644 --- a/cmake/SparkFindQt6Config.cmake +++ b/cmake/SparkFindQt6Config.cmake @@ -1,20 +1,22 @@ cmake_minimum_required(VERSION 3.5.1) -find_package(Qt6 COMPONENTS Core Widgets Network Concurrent) +set(SPARK_FIND_QT6 TRUE) + +find_package(Qt6 COMPONENTS Core Widgets Network REQUIRED) # function(target_link_qt6 NAME) -# target_link_libraries(${NAME} +# target_link_libraries(${NAME} # Qt6::Core # Qt6::Widgets # Qt6::Network) # endfunction(target_link_qt6 NAME) -# 使用 spark_add_link 生成 target_link_qt6 以替代上面内容 +# 使用 spark_add_link 生成 target_link_qt6 以替代上面内容 spark_add_link(qt6 Qt6::Core Qt6::Widgets Qt6::Network) -# spark_add_link_qt6 -# 自定义宏 target_link_qt6 以扩展 target_link_qt6_ 结构 +# spark_add_link_qt6 +# 自定义宏 spark_add_link_qt6 以扩展 target_link_qt6_ 结构 # _IN_NAME: 此宏使用嵌套宏 spark_add_link 时追加 名称 # 同等于 spark_add_link(qt_ ${ARGN}) macro(spark_add_link_qt6 _IN_NAME) @@ -22,3 +24,107 @@ macro(spark_add_link_qt6 _IN_NAME) endmacro(spark_add_link_qt6 _IN_NAME) # 使用 spark_add_link_qt6 生成 target_link_qt6_ 的宏 +# spark_add_link_qt5(Concurrent Qt6::Concurrent) + +# 高级自定义 +# spark_add_links_qt6 +# 自定义宏 spark_add_links_qt6 以扩展 spark_add_link_qt6 宏配置组 + # 特点: 任意长度参数 + # qt6_item: 为进行遍历后的单项,类似于 python3 中的 (for item in items:) + # 例如: qt6_item 为 Core: + # spark_add_link_qt6(${qt6_item} Qt6::${qt6_item}) + # 展开为 spark_add_link_qt6(Core Qt6::Core) + # 展开为 spark_add_link(qt6_Core Qt6::Core) + # 展开为 spark_add_link(qt6_Core Qt6::Core) + # 特性: 增加 qt6_Core 转 qt6_core + # string(TOLOWER ) +macro(spark_add_links_qt6) + set(qt6_items ${ARGN}) + foreach(qt6_item IN LISTS qt6_items) + find_package(Qt6${qt6_item}) + spark_add_link_qt6(${qt6_item} Qt6::${qt6_item}) + + string(TOLOWER "${qt6_item}" qt6_lower_item) + spark_add_link_qt6(${qt6_lower_item} Qt6::${qt6_item}) + spark_debug_message("add_target_link_qt6_${qt6_item} or add_target_link_qt6_${qt6_lower_item}") + endforeach(qt6_item IN LISTS qt6_items) +endmacro(spark_add_links_qt6) + +# 找出所有 Qt6 模板 +# find /usr/lib/x86_64-linux-gnu/cmake/ -name "*Config.cmake" | sed 's@^.*/Qt6@Qt6@;' | grep ^Qt6 + +# 掐头去尾,洗一次 +# find /usr/lib/x86_64-linux-gnu/cmake/ -name "*Config.cmake" | sed 's@^.*/Qt5@Qt5@;' | grep ^Qt5 | sed 's@^Qt5@@; s@Config.cmake$@@; /^\s*$/d' + +# 排序 +# find /usr/lib/x86_64-linux-gnu/cmake/ -name "*Config.cmake" | sed 's@^.*/Qt5@Qt5@;' | grep ^Qt5 | sed 's@^Qt5@@; s@Config.cmake$@@; /^\s*$/d' | sort | pr -t -3 +# find /usr/lib/x86_64-linux-gnu/cmake/ -name "*Config.cmake" | sed 's@^.*/Qt6@Qt6@;' | grep ^Qt6 | sed 's@^Qt6@@; s@Config.cmake$@@; /^\s*$/d' | sort | pr -t -3 + +spark_add_links_qt6( + # BuildInternals + # BuildInternals/StandaloneTests/Qt5CompatTests + # BuildInternals/StandaloneTests/QtBaseTests + # Concurrent + # Core + # Core5Compat + # CoreTools + # DBus + # DBusTools + # DeviceDiscoverySupportPrivate + # EglFSDeviceIntegrationPrivate + # EglFsKmsGbmSupportPrivate + # EglFsKmsSupportPrivate + # FbSupportPrivate + # Gui + # GuiTools + # HostInfo + # InputSupportPrivate + # KmsSupportPrivate + # Network + # OpenGL + # OpenGLWidgets + # PrintSupport + # QComposePlatformInputContextPlugin + # QCupsPrinterSupportPlugin + # QEglFSEmulatorIntegrationPlugin + # QEglFSIntegrationPlugin + # QEglFSKmsEglDeviceIntegrationPlugin + # QEglFSKmsGbmIntegrationPlugin + # QEglFSX11IntegrationPlugin + # QEvdevKeyboardPlugin + # QEvdevMousePlugin + # QEvdevTabletPlugin + # QEvdevTouchScreenPlugin + # QGifPlugin + # QGtk3ThemePlugin + # QIBaseDriverPlugin + # QIbusPlatformInputContextPlugin + # QICOPlugin + # QJpegPlugin + # QLibInputPlugin + # QLinuxFbIntegrationPlugin + # QMinimalEglIntegrationPlugin + # QMinimalIntegrationPlugin + # QMYSQLDriverPlugin + # QNetworkManagerNetworkInformationPlugin + # QODBCDriverPlugin + # QOffscreenIntegrationPlugin + # QPSQLDriverPlugin + # QSQLiteDriverPlugin + # QTlsBackendCertOnlyPlugin + # QTlsBackendOpenSSLPlugin + # QTsLibPlugin + # QTuioTouchPlugin + # QVkKhrDisplayIntegrationPlugin + # QVncIntegrationPlugin + # QXcbEglIntegrationPlugin + # QXcbGlxIntegrationPlugin + # QXcbIntegrationPlugin + # QXdgDesktopPortalThemePlugin + # Sql + # Test + # Widgets + # WidgetsTools + # XcbQpaPrivate + # Xml +) diff --git a/cmake/SparkMacrosConfig.cmake b/cmake/SparkMacrosConfig.cmake index 1f53882..ffb9cab 100644 --- a/cmake/SparkMacrosConfig.cmake +++ b/cmake/SparkMacrosConfig.cmake @@ -2,20 +2,62 @@ cmake_minimum_required(VERSION 3.5.1) # 定义一些 macro 用于自动生成构建结构 +# spark_aux_source_directory outvar invar [skip] +# 获取目录下的所有源代码 +macro(spark_aux_source_directory OUTVAR INVAR) + # iv: internal_variable + 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_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) + + if(iv_arglen EQUAL 1) + list(APPEND ${OUTVAR} ${iv_SOURCE_LIST} ${iv_HEADER_LIST} ${iv_QT_UI_LIST}) + else() + set(${OUTVAR} ${iv_SOURCE_LIST} ${iv_HEADER_LIST} ${iv_QT_UI_LIST}) + endif(iv_arglen EQUAL 1) + + unset(iv_args) + unset(iv_arglen) + unset(iv_SOURCE_LIST) + unset(iv_HEADER_LIST) + unset(iv_QT_UI_LIST) + +endmacro(spark_aux_source_directory OUTVAR INVAR) + +# spark_aux_source_directories outvar invar [...] +# 获取目录列表下的所有源代码 + # spark_aux_source_directory 的扩展,支持多个 invar 与追加参数 +macro(spark_aux_source_directories OUTVAR INVAR) + set(iv_aux_directories ${ARGN}) + + spark_aux_source_directory(${OUTVAR} ${INVAR}) + + foreach(iv_directory IN LISTS iv_aux_directories) + spark_aux_source_directory(${OUTVAR} ${iv_directory} SKIP) + endforeach(iv_directory IN LISTS iv_aux_directories) + + unset(iv_aux_directories) + +endmacro(spark_aux_source_directories OUTVAR INVAR) + + # spark_add_library [files]... # 构建一个库,基于指定的源文件 # 并根据库名生成 target_link_ 函数 macro(spark_add_library _lib_name) - message("================ ${_lib_name} Library ================") + spark_debug_message("================ ${_lib_name} Library ================") add_library(${_lib_name} ${ARGN}) - + set(SRCS ${ARGN}) foreach(item IN LISTS SRCS) - message(" -> ${item}") + spark_debug_message(" -> ${item}") endforeach(item IN LISTS SRCS) - + function(target_link_${_lib_name} TARGET) - message("${_lib_name}") + spark_debug_message("${_lib_name}") target_link_libraries(${TARGET} ${_lib_name}) endfunction(target_link_${_lib_name} TARGET) @@ -26,29 +68,61 @@ endmacro(spark_add_library _lib_name) # 并根据库名生成 target_link_ 函数 # 函数内增加以 头文件搜索路径 macro(spark_add_library_path _lib_name _lib_path) - aux_source_directory(${_lib_path} ${_lib_name}_SOURCES) - message("================ spark_add_library_path: ${_lib_name} ================") - file(GLOB UI_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${_lib_path}/*.ui) - add_library(${_lib_name} ${${_lib_name}_SOURCES} ${UI_LIST}) + set(${_lib_name}_SOURCE_PATH ${_lib_path}) + set(${_lib_name}_TYPE) + if(${${_lib_name}_SOURCE_PATH} STREQUAL SHARED OR ${${_lib_name}_SOURCE_PATH} STREQUAL STATIC) + set(${_lib_name}_SOURCE_PATH ${ARGV2}) + set(${_lib_name}_TYPE ${_lib_path}) + spark_debug_message("_lib_path: ${${_lib_name}_SOURCE_PATH}(${ARGV2})[${${_lib_name}_TYPE}]") + + if(${ARGC} LESS 3) + message(FATAL_ERROR "Missing parameter, library path not specified.") + endif(${ARGC} LESS 3) + endif(${${_lib_name}_SOURCE_PATH} STREQUAL SHARED OR ${${_lib_name}_SOURCE_PATH} STREQUAL STATIC) + + aux_source_directory(${${_lib_name}_SOURCE_PATH} ${_lib_name}_SOURCES) + + # message("================ spark_add_library_path: ${_lib_name} ================") + spark_aux_source_directory(any_list ${${_lib_name}_SOURCE_PATH}) + add_library(${_lib_name} ${${_lib_name}_TYPE} ${${_lib_name}_SOURCES} ${any_list}) + spark_debug_message("${_lib_name}_SOURCES: ${${_lib_name}_SOURCES}, ${${_lib_name}_SOURCE_PATH} ${QT_UI_LIST} ${HEADER_LIST}") foreach(item IN LISTS ${_lib_name}_SOURCES) - message(" -> ${item}") + spark_debug_message(" -> ${item}") endforeach(item IN LISTS ${_lib_name}_SOURCES) - + function(target_link_${_lib_name} TARGET) - # message("target_link_${_lib_name}") - message(" -> (include): ${_lib_path}") - target_include_directories(${TARGET} PUBLIC "${_lib_path}") + # spark_debug_message("target_link_${_lib_name}") + spark_debug_message(" -> (include): ${${_lib_name}_SOURCE_PATH}") + target_include_directories(${TARGET} PUBLIC "${${_lib_name}_SOURCE_PATH}") target_link_libraries(${TARGET} ${_lib_name}) endfunction(target_link_${_lib_name} TARGET) function(target_include_${_lib_name} TARGET) - # message("target_link_${_lib_name}") - message(" -> (include): ${_lib_path}") - target_include_directories(${TARGET} PUBLIC "${_lib_path}") + # spark_debug_message("target_link_${_lib_name}") + spark_debug_message(" -> (include): ${${_lib_name}_SOURCE_PATH}") + target_include_directories(${TARGET} PUBLIC "${${_lib_name}_SOURCE_PATH}") # target_link_libraries(${TARGET} ${_lib_name}) endfunction(target_include_${_lib_name} TARGET) + # file(GLOB HEADER_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${${_lib_name}_SOURCE_PATH}/*.h) + target_include_directories(${_lib_name} PUBLIC "${${_lib_name}_SOURCE_PATH}") + + # 如果想用以下操作手动实现 target_link_include_directories + # 请注意对 LIST 类型使用 "" 进行包围 + # target_link_include_directories 的 PUBLIC 将会填充(追加)目标的 INCLUDE_DIRECTORIES 属性 + # target_link_include_directories 支持 cmake 生成大表达式,更容易操作,手动将无法实现此类能力 + # target_link_include_directories 支持相对路径和绝对路径参数 + # 手动操作将必须使用绝对路径,这是不好的地方 + # get_target_property(_lib_include_directories ${_lib_name} INCLUDE_DIRECTORIES) + # list(APPEND _lib_include_directories "${CMAKE_CURRENT_LIST_DIR}/${${_lib_name}_SOURCE_PATH}") + # spark_debug_message("----> ${CMAKE_CURRENT_LIST_DIR}/${${_lib_name}_SOURCE_PATH}") + # spark_debug_message("----> ${_lib_include_directories}") + # set_target_properties(${_lib_name} PROPERTIES + # INCLUDE_DIRECTORIES "${_lib_include_directories}" + # INTERFACE_INCLUDE_DIRECTORIES "${_lib_include_directories}" + # ) + endmacro(spark_add_library_path _lib_name _lib_path) # spark_add_executable [files]... @@ -56,7 +130,7 @@ endmacro(spark_add_library_path _lib_name _lib_path) # Qt编译时源文件包括很多类型,需要指定 *.h/*.cpp/*.qrc/*.qm/... 等 macro(spark_add_executable _exec_name) - message("================ ${_exec_name} Executable ================") + spark_debug_message("================ ${_exec_name} Executable ================") add_executable(${_exec_name} ${ARGN}) endmacro(spark_add_executable _exec_name) @@ -64,16 +138,16 @@ endmacro(spark_add_executable _exec_name) macro(spark_add_executable_path _exec_name _exec_path) aux_source_directory(${_exec_path} ${_exec_name}_SOURCES) - message("================ ${_exec_name} Executable ================") - file(GLOB UI_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${_exec_path}/*.ui) - add_executable(${_exec_name} ${${_exec_name}_SOURCES} ${ARGN} ${UI_LIST}) + spark_debug_message("================ ${_exec_name} Executable ================") + spark_aux_source_directory(any_list ${_exec_path}) + add_executable(${_exec_name} ${${_exec_name}_SOURCES} ${ARGN} ${any_list}) foreach(item IN LISTS ${_exec_name}_SOURCES) - message(" -> ${item}") + spark_debug_message(" -> ${item}") endforeach(item IN LISTS ${_exec_name}_SOURCES) - + # function(target_link_${_exec_name} TARGET) - # message("target_link_${_lib_name}") - message(" -> (include): ${_exec_path}") + # spark_debug_message("target_link_${_lib_name}") + spark_debug_message(" -> (include): ${_exec_path}") target_include_directories(${_exec_name} PUBLIC "${_exec_path}") # target_link_libraries(${TARGET} ${_lib_name}) # endfunction(target_link_${_exec_name} TARGET) @@ -86,16 +160,16 @@ endmacro(spark_add_executable_path _exec_name _exec_path) # 并根据库名生成一个 target_link_ 函数 macro(spark_find_library _prefix) find_package(PkgConfig REQUIRED) - + # libnotify pkg_check_modules(${_prefix} ${ARGN}) function(target_link_${_prefix} TARGET) - target_include_directories(${TARGET} PUBLIC + target_include_directories(${TARGET} PUBLIC ${${_prefix}_INCLUDE_DIRS}) - target_link_libraries(${TARGET} + target_link_libraries(${TARGET} ${${_prefix}_LIBRARIES}) endfunction(target_link_${_prefix} TARGET) - + endmacro(spark_find_library _prefix) @@ -108,7 +182,7 @@ macro(spark_add_executable_paths _prefix_path) set(PATHS ${ARGN}) foreach(item IN LISTS PATHS) file(GLOB QRCS "${item}/*.qrc") - message(">>> add_executable: " "${_prefix_path}-${item} ${item} + ${QRCS}") + 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}) endforeach(item IN LISTS PATHS) @@ -122,8 +196,8 @@ endmacro(spark_add_executable_paths _prefix_path) # _NAME: 用于此 fucntion 中的要求参数: <_NAME>目标将要连接此库 macro(spark_add_link _IN_NAME) function(target_link_${_IN_NAME} _NAME) - message("LINK ${_NAME} ${ARGN}") - target_link_libraries(${_NAME} + spark_debug_message("LINK ${_NAME} ${ARGN}") + target_link_libraries(${_NAME} ${ARGN}) endfunction(target_link_${_IN_NAME} _NAME) -endmacro(spark_add_link _IN_NAME) \ No newline at end of file +endmacro(spark_add_link _IN_NAME) diff --git a/cmake/SparkMacrosExtendConfig.cmake b/cmake/SparkMacrosExtendConfig.cmake new file mode 100644 index 0000000..dfb2754 --- /dev/null +++ b/cmake/SparkMacrosExtendConfig.cmake @@ -0,0 +1,332 @@ + +# find_plus +# 寻找 INVAl 传入的字符串,如果存在 + 字符将写入位置到 OUTVAL +function(find_plus INVAL OUTVAL) + string(FIND "${INVAL}" "+" plus_index) + set(${OUTVAL} ${plus_index} PARENT_SCOPE) +endfunction(find_plus INVAL OUTVAL) + +function(find_plus_v INVAL OUTVAL) + string(FIND "${${INVAL}}" "+" plus_index) + set(${OUTVAL} ${plus_index} PARENT_SCOPE) +endfunction(find_plus_v INVAL OUTVAL) + +function(find_colon INVAL OUTVAL) + string(FIND "${INVAL}" ":" colon_index) + set(${OUTVAL} ${colon_index} PARENT_SCOPE) +endfunction(find_colon INVAL OUTVAL) + +function(find_colon_v INVAL OUTVAL) + string(FIND "${${INVAL}}" ":" colon_index) + set(${OUTVAL} ${colon_index} PARENT_SCOPE) +endfunction(find_colon_v INVAL OUTVAL) + +function(find_dir INVAL OUTVAL) + string(FIND "${INVAL}" "/" _STR ${ARGN}) + set(${OUTVAL} ${_STR} PARENT_SCOPE) +endfunction(find_dir INVAL OUTVAL) + +function(find_dir_v INVAL OUTVAL) + string(FIND "${${INVAL}}" "/" _STR ${ARGN}) + set(${OUTVAL} ${_STR} PARENT_SCOPE) +endfunction(find_dir_v INVAL OUTVAL) + +# +function(str_left INVAL INDEX OUTVAL) + set(LEFT_INDEX ${INDEX}) + string(SUBSTRING "${INVAL}" 0 ${LEFT_INDEX} _LEFT_V) + set(${OUTVAL} ${_LEFT_V} PARENT_SCOPE) +endfunction(str_left INVAL INDEX OUTVAL) + +function(str_right INVAL INDEX OUTVAL) + math(EXPR RIGHT_INDEX ${INDEX}+1) + string(SUBSTRING "${INVAL}" ${RIGHT_INDEX} -1 _RIGHT_V) + set(${OUTVAL} ${_RIGHT_V} PARENT_SCOPE) +endfunction(str_right INVAL INDEX OUTVAL) + +function(str_left_v INVAL INDEX OUTVAL) + set(LEFT_INDEX ${${INDEX}}) + string(SUBSTRING "${${INVAL}}" 0 ${LEFT_INDEX} _LEFT_V) + set(${OUTVAL} ${_LEFT_V} PARENT_SCOPE) +endfunction(str_left_v INVAL INDEX OUTVAL) + +function(str_right_v INVAL INDEX OUTVAL) + math(EXPR RIGHT_INDEX ${${INDEX}}+1) + string(SUBSTRING "${${INVAL}}" ${RIGHT_INDEX} -1 _RIGHT_V) + set(${OUTVAL} ${_RIGHT_V} PARENT_SCOPE) +endfunction(str_right_v INVAL INDEX OUTVAL) + +# +function(find_colon_plus INVAL OUTVAL) + find_colon(${INVAL} COLON_INDEX) + str_right(${INVAL} ${COLON_INDEX} COLON_RIGHT) + find_plus_v(COLON_RIGHT PLUS_INDEX) + str_left_v(COLON_RIGHT PLUS_INDEX COLON_RIGHT_LEFT_PLUS) + + set(${OUTVAL} ${COLON_RIGHT_LEFT_PLUS} PARENT_SCOPE) +endfunction(find_colon_plus INVAL OUTVAL) + +function(find_colon_plus_v INVAL OUTVAL) + find_colon_v(${INVAL} COLON_INDEX) + str_right_v(${INVAL} COLON_INDEX COLON_RIGHT) + find_plus_v(COLON_RIGHT PLUS_INDEX) + str_left_v(COLON_RIGHT PLUS_INDEX COLON_RIGHT_LEFT_PLUS) + + set(${OUTVAL} ${COLON_RIGHT_LEFT_PLUS} PARENT_SCOPE) +endfunction(find_colon_plus_v INVAL OUTVAL) + +function(find_dir_plus INVAL OUTVAL) + # t:*/*+d + # ^ + find_dir("${INVAL}" SLASH_INDEX REVERSE) + str_right("${INVAL}" ${SLASH_INDEX} SLASH_RIGHT) + find_plus_v(SLASH_RIGHT PLUS_INDEX) + str_left_v(SLASH_RIGHT PLUS_INDEX SLASH_RIGHT_LEFT_PLUS) + + set(${OUTVAL} ${SLASH_RIGHT_LEFT_PLUS} PARENT_SCOPE) +endfunction(find_dir_plus INVAL OUTVAL) + +function(find_dir_plus_v INVAL OUTVAL) + # t:*/*+d + # ^ + find_dir("${${INVAL}}" SLASH_INDEX REVERSE) + str_right("${${INVAL}}" ${SLASH_INDEX} SLASH_RIGHT) + find_plus_v(SLASH_RIGHT PLUS_INDEX) + str_left_v(SLASH_RIGHT PLUS_INDEX SLASH_RIGHT_LEFT_PLUS) + + set(${OUTVAL} ${SLASH_RIGHT_LEFT_PLUS} PARENT_SCOPE) +endfunction(find_dir_plus_v INVAL OUTVAL) + + +# spark_add_library_source ... +# 扩展 一行一可执行目标 的构建的扩展宏 +# 在构建时将会另外加入这些资源 +macro(spark_add_library_source target) + set(${target}_ADD_SOURCE ${ARGN}) +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) +endmacro(_handle_spark_target_link_qt_macro _target) + +# spark_add_library_realpaths +# 基于传入的项进行构建 +# 可接受的值为: 路径列表 +# 可接受的值为: 路径列表+依赖库A+依赖库B +macro(spark_add_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} + ${dir} + ${${target}_ADD_SOURCE} + ) + _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} + ${dir} + ${${target}_ADD_SOURCE} + ) + target_include_directories(${target} PUBLIC ${dir}) + target_link_libraries(${target} ${target_depends}) + endif(PLUS_INDEX LESS 0) + + endforeach(REALPATH IN LISTS REALPATHS) + +endmacro(spark_add_library_realpaths) + + +# spark_aux_source_paths +# 将指定路径中的文件变成可用的AUX源文件列表 +macro(spark_aux_source_paths AUX_VAR) + set(${AUX_VAR} "") + set(${AUX_VAR}_PATHS ${ARGN}) + + foreach(aux_path IN LISTS ${AUX_VAR}_PATHS) + # spark_debug_message("aux_path: ${aux_path}") + aux_source_directory(${aux_path} ${AUX_VAR}) + endforeach(aux_path IN LISTS ${AUX_VAR}_PATHS) + +endmacro(spark_aux_source_paths AUX_VAR) + +# spark_file_glob +# 使用用 file(GLOB) 的匹配规则,并一次可匹配多个规则 +# +macro(spark_file_glob FGLOB_VAR) + set(${FGLOB_VAR} "") + set(${FGLOB_VAR}_PATHS ${ARGN}) + + foreach(fglob_path IN LISTS ${FGLOB_VAR}_PATHS) + + file(GLOB FGLOB_PATH_SRCS ${fglob_path}) + foreach(fglob_path_src IN LISTS FGLOB_PATH_SRCS) + # spark_debug_message(" -> ${item}") + list(APPEND ${FGLOB_VAR} ${fglob_path_src}) + endforeach(fglob_path_src IN LISTS FGLOB_PATH_SRCS) + + endforeach(fglob_path IN LISTS ${FGLOB_VAR}_PATHS) + +endmacro(spark_file_glob FGLOB_VAR) + + +# spark_add_source_paths +# 将指定路径中的文件变成可用的源文件列表 +# +macro(spark_add_source_paths SOURCE_VAR) + set(${SOURCE_VAR} "") + set(${SOURCE_VAR}_PATHS ${ARGN}) + + spark_aux_source_paths(${SOURCE_VAR} ${ARGN}) + foreach(source_path IN LISTS ${SOURCE_VAR}_PATHS) + # list(APPEND ${SOURCE_VAR}_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_PATH}) + # aux_source_directory(${SOURCE_PATH} _SOURCES) + # foreach(item IN LISTS _SOURCES) + # # spark_debug_message(" -> ${item}") + # list(APPEND ${SOURCE_VAR} ${item}) + # endforeach(item IN LISTS _SOURCES) + + # file(GLOB HEADER_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${SOURCE_PATH}/*.h) + # foreach(item IN LISTS HEADER_LIST) + # # spark_debug_message(" -> ${item}") + # list(APPEND ${SOURCE_VAR} ${item}) + # endforeach(item IN LISTS HEADER_LIST) + + file(GLOB UI_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${source_path}/*.ui) + foreach(ui_src IN LISTS UI_SRCS) + # spark_debug_message(" -> ${item}") + list(APPEND ${SOURCE_VAR} ${ui_src}) + endforeach(ui_src IN LISTS UI_SRCS) + endforeach(source_path IN LISTS ${SOURCE_VAR}_PATHS) +endmacro(spark_add_source_paths SOURCE_VAR) + + +# spark_add_library_file_glob + # +macro(spark_add_library_file_glob _lib_name) + spark_file_glob(${_lib_name}_SOURCES ${ARGN}) + spark_add_library(${_lib_name} ${${_lib_name}_SOURCES}) +endmacro(spark_add_library_file_glob _lib_name) + + + +# spark_add_executable_source ... +# 扩展 一行一可执行目标 的构建的扩展宏 +# 在构建时将会另外加入这些资源 +macro(spark_add_executable_source target) + set(${target}_ADD_SOURCE ${ARGN}) +endmacro(spark_add_executable_source target) + +# 冗余的 spark_add_executable_realpaths 的 dir 处理逻辑 +macro(_handle_spark_add_executable_realpaths_if_dir_empty_macro) + if("${dir}" STREQUAL "") + spark_add_executable(${target} + ${${target}_ADD_SOURCE} + ) + else() + spark_add_executable_path(${target} + ${dir} + ${${target}_ADD_SOURCE} + ) + endif("${dir}" STREQUAL "") +endmacro(_handle_spark_add_executable_realpaths_if_dir_empty_macro) + +# spark_add_executable_realpaths +# 基于传入的项进行构建 +# 可接受的值为: 可执行目标:路径列表 +# 可接受的值为: 可执行目标:路径列表+依赖库A+依赖库B +macro(spark_add_executable_realpaths) + + set(REALPATHS ${ARGN}) + foreach(REALPATH IN LISTS REALPATHS) + + # 找 : 号下标,这是找:号的函数 + find_colon(${REALPATH} COLON_INDEX) + + if(COLON_INDEX LESS 0) + # do not anything + else() + # 找到 : 号,将截取 target 名称 + # string(SUBSTRING "${REALPATH}" 0 ${COLON_INDEX} REALTARGET) + find_colon_v(REALPATH COLON_INDEX) + str_left_v(REALPATH COLON_INDEX target) + str_right_v(REALPATH COLON_INDEX COLON_REMAIN) + # message(FATAL_ERROR "构建一个: ${target}") # 已验证 + + endif(COLON_INDEX LESS 0) + + # 找 + 号下标,这是找+号的函数 + find_plus_v(REALPATH PLUS_INDEX) + + if(PLUS_INDEX LESS 0) + # 完全没有 + 的情况下,它就是一个基于目录的构建 + set(dir ${COLON_REMAIN}) + # spark_add_executable_path(${target} + # ${dir} + # ${${target}_ADD_SOURCE} + # ) + _handle_spark_add_executable_realpaths_if_dir_empty_macro() + _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}") + + # 再从主要内容中获取 dir ,以及 + find_colon_plus_v(REALPATH dir) + # spark_add_executable_path(${target} + # ${dir} + # ${${target}_ADD_SOURCE} + # ) + _handle_spark_add_executable_realpaths_if_dir_empty_macro() + target_include_directories(${target} PUBLIC ${dir}) + target_link_libraries(${target} ${target_depends}) + endif(PLUS_INDEX LESS 0) + endforeach(REALPATH IN LISTS REALPATHS) + +endmacro(spark_add_executable_realpaths) + + +# 一行一库概念构建 +# 1.构建一个库,基于指定的目录路径进行构建 +# src/widgets/DocTypeListView +# ^目录将被用于制作的目标名称 +# 目录下的所有文件将被用于制作此库的源代码文件 +# +# 2.构建一个库,基于指定的目录路径进行构建,并依赖其后面所列出的依赖项 +# src/widgets/MaintainerInfoView+DocTypeListView+... +# ^此库将被用于 MaintainerInfoView 库的依赖 +# ^此符号'+'将被视为依赖项列表的分隔符 + +# 一行一可执行目标概念 +# 1.构建一个可执行目标,基于指定的目录路径进行构建(行不通,可执行目标很少为一个目录) +# 2.构建一个可执行目标,基于指定的文件路径进行构建(也许可以) +# 3.构建一个可执行目标,基于指定的文件名称进行构建() +# 4.构建一个可执行目标,基于指定命名规则(target:dir:dir+depend+depend...) diff --git a/cmake/package-deb.descript b/cmake/spark-deb-package.descript similarity index 92% rename from cmake/package-deb.descript rename to cmake/spark-deb-package.descript index 307b829..ea17af8 100644 --- a/cmake/package-deb.descript +++ b/cmake/spark-deb-package.descript @@ -1,6 +1,6 @@ # 注释行(使用方式) -# find_package(DebPackage PATHS ${CMAKE_SOURCE_DIR}) -# add_package_descript(cmake/package-deb.descript) +# find_package(SparkDebPackage PATHS ${CMAKE_SOURCE_DIR}) +# add_package_descript(cmake/spark-deb-package.descript) # 打包后的文件名称 # FileName: 待定 @@ -39,6 +39,8 @@ Maintainer: momen Homepage: https://github.com:vmomenv/SparkAssistant.git # 软件包建议 Recommends: +# 软件冲突 +Conflicts: # 软件包描述信息 Descrition: 樱花助手 本软件主要功能有,系统中软件更新,天气预报,todo清单 diff --git a/cmake/spark-desktop.desktop.in b/cmake/spark-desktop.desktop.in.txt similarity index 88% rename from cmake/spark-desktop.desktop.in rename to cmake/spark-desktop.desktop.in.txt index 0fa070b..75663a2 100644 --- a/cmake/spark-desktop.desktop.in +++ b/cmake/spark-desktop.desktop.in.txt @@ -7,5 +7,7 @@ Type=@APP_TYPE@ Exec=@APP_EXECUTE_PATH@ Icon=@APP_EXECUTE_ICON_PATH@ Categories=@APP_CATEGORIES@ +MimeType=@APP_MIME_TYPE@ + +# Generated from the DesktopGenerater component of the z-Tools toolkit -# Generated from the DesktopGenerater component of the z-Tools toolkit \ No newline at end of file