From 04253ad9813d509cc39175abbfe6cfc1eb49560b Mon Sep 17 00:00:00 2001 From: scottXchoo Date: Wed, 31 Jul 2024 22:45:39 +0900 Subject: [PATCH] chore : update CMake configuration --- CMakeLists.txt | 4 ++++ example/CMakeLists.txt | 41 +++++++++++++++++++++++++++++---------- lib_source/CMakeLists.txt | 35 +++++++++++++++++++++++++++++---- 3 files changed, 66 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a9bb079..07db428 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,12 +2,16 @@ cmake_minimum_required(VERSION 3.21) project(RibbonUI_Project VERSION 1.1.0 LANGUAGES CXX) +# Find Qt Package find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) + +# Set Qt SDK Directory set(QT_SDK_DIR ${Qt${QT_VERSION_MAJOR}_DIR}/../../..) cmake_path(SET QT_SDK_DIR NORMALIZE ${QT_SDK_DIR}) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/.cmake/ ${CMAKE_CURRENT_LIST_DIR}/3rdparty/Qt5QMLPlugin) +# Set RibbonUI QML Plugin Directory option(RIBBONUI_BUILD_EXAMPLES "Build RibbonUI APP." ON) option(RIBBONUI_BUILD_QWINDOWKIT "Build QWindowKit." ON) option(RIBBONUI_BUILD_STATIC_LIB "Build RibbonUI static library." OFF) diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index c92c0b9..4a96338 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -4,57 +4,69 @@ project(RibbonUIAPP VERSION ${PROJECT_VERSION} LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) +# Qt version check to set up standard project settings if(QT_VERSION VERSION_GREATER_EQUAL "6.3") qt_standard_project_setup() else() + # Automatic Qt moc, rcc, and uic processing for older Qt versions set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) endif() +# Project metadata string(TIMESTAMP TIME_YEAR %Y) set(PROJECT_COMPANY "Mentalflow's Lab") set(PROJECT_COPYRIGHT "Copyright (c) ${TIME_YEAR} Mentalflow's Lab. All rights reserved.") set(PROJECT_DOMAIN "dev.ourdocs.cn.ribbonuiapp") set(PROJECT_BUNDLE_NAME RibbonUI-APP) set(version_str "${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},${PROJECT_VERSION_PATCH}") + +# Output directory based on build type if(CMAKE_BUILD_TYPE STREQUAL "Debug") -set(output_dir ${CMAKE_BINARY_DIR}/app/debug) + set(output_dir ${CMAKE_BINARY_DIR}/app/debug) else() -set(output_dir ${CMAKE_BINARY_DIR}/app/release) + set(output_dir ${CMAKE_BINARY_DIR}/app/release) endif() +# Find Qt package find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Quick REQUIRED) +# Source and QML files set(sources_files example.cpp) -set(qml_files example.qml about.qml components/RibbonMessageListViewExample.qml - pages/SettingsMenuPage.qml components/TabBar.qml) +set(qml_files example.qml about.qml components/RibbonMessageListViewExample.qml pages/SettingsMenuPage.qml components/TabBar.qml) set(qml_prefix "qml/Qt${QT_VERSION_MAJOR}/") list(TRANSFORM qml_files PREPEND ${qml_prefix}) + +# Set properties for QML files foreach(qmlfile ${qml_files}) string(REPLACE "${qml_prefix}" "" fixedfile ${qmlfile}) set_source_files_properties(${qmlfile} PROPERTIES QT_RESOURCE_ALIAS ${fixedfile}) endforeach(qmlfile) +# Configure version header set(__example_project_version "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") string(TOUPPER ${PROJECT_NAME} __example_project_version) string(TOLOWER ${PROJECT_NAME} __example_project_version_lower) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/..//.cmake/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/${__example_project_version_lower}_version.h) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../.cmake/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/${__example_project_version_lower}_version.h) list(APPEND source_files ${CMAKE_CURRENT_BINARY_DIR}/${__example_project_version_lower}_version.h) +# Define the executable qt_add_executable(${PROJECT_NAME} ${sources_files}) +# Windows-specific settings if (WIN32) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/..//.cmake/win_app.rc.in ${CMAKE_BINARY_DIR}/win_app.rc) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../.cmake/win_app.rc.in ${CMAKE_BINARY_DIR}/win_app.rc) set(app_icon_resource_windows ${CMAKE_BINARY_DIR}/win_app.rc) target_sources(${PROJECT_NAME} PRIVATE ${app_icon_resource_windows}) + file(TO_CMAKE_PATH "/" PATH_SEPARATOR) if(MSVC) - set(DLLPATH ${CMAKE_CURRENT_SOURCE_DIR}/..//3rdparty/msvc/*.dll) + set(DLLPATH ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/msvc/*.dll) else() - set(DLLPATH ${CMAKE_CURRENT_SOURCE_DIR}/..//3rdparty/mingw/*.dll) + set(DLLPATH ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/mingw/*.dll) endif() string(REPLACE "/" ${PATH_SEPARATOR} DLLPATH "${DLLPATH}") file(GLOB DLL_FILES ${DLLPATH}) @@ -63,6 +75,8 @@ if (WIN32) ${DLL_FILES} ${output_dir} ) + + # macOS-specific settings elseif(APPLE) set(MACOSX_BUNDLE_GUI_IDENTIFIER ${PROJECT_DOMAIN}) set(MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}) @@ -73,15 +87,19 @@ elseif(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING "Minimum OS X deployment version" FORCE) set(MACOSX_BUNDLE_EXECUTABLE_NAME ${PROJECT_BUNDLE_NAME}) set(MACOSX_BUNDLE_ICON_FILE AppIcon) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/..//.cmake/MacOSXBundleInfo.plist.in ${CMAKE_BINARY_DIR}/Info.plist) + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../.cmake/MacOSXBundleInfo.plist.in ${CMAKE_BINARY_DIR}/Info.plist) set(App_ICON "${PROJECT_SOURCE_DIR}/resources/imgs/AppIcon.icns") set_source_files_properties(${App_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") target_sources(${PROJECT_NAME} PRIVATE ${App_ICON}) endif() + +# Include Qt5 QML plugin for Qt versions less than 6 if (${QT_VERSION_MAJOR} LESS 6) include(Qt5QMLPlugin) endif() +# Define the QML module qt_add_qml_module(${PROJECT_NAME} URI ${PROJECT_NAME} VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} @@ -89,6 +107,8 @@ qt_add_qml_module(${PROJECT_NAME} QML_FILES ${qml_files} RESOURCES resources/imgs/heart.png resources/imgs/search.png ) + +# Set target properties set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_BINARY_DIR}/Info.plist MACOSX_BUNDLE TRUE @@ -99,6 +119,7 @@ set_target_properties(${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${output_dir} ) +# Link RibbonUI library based on build type if(RIBBONUI_BUILD_STATIC_LIB) if (${QT_VERSION_MAJOR} GREATER_EQUAL 6) target_link_libraries(${PROJECT_NAME} PRIVATE @@ -125,6 +146,7 @@ else() endif() endif() +# Link required libraries target_link_libraries(${PROJECT_NAME} PRIVATE Qt::Quick RibbonUI @@ -132,4 +154,3 @@ target_link_libraries(${PROJECT_NAME} PRIVATE target_compile_definitions(${PROJECT_NAME} PRIVATE $<$,$>:QT_QML_DEBUG>) target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}) - diff --git a/lib_source/CMakeLists.txt b/lib_source/CMakeLists.txt index 1a8ec8e..a83ed18 100644 --- a/lib_source/CMakeLists.txt +++ b/lib_source/CMakeLists.txt @@ -6,17 +6,21 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) include(GNUInstallDirs) +# Qt version check to set up standard project settings if(QT_VERSION VERSION_GREATER_EQUAL "6.3") qt_standard_project_setup() else() + # Automatic Qt moc, rcc, and uic processing for older Qt versions set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) endif() +# Find Qt package find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Quick Qml REQUIRED) +# Determine library type and plugin target name based on build type if (RIBBONUI_BUILD_STATIC_LIB) set(LIB_TYPE "STATIC") set(PLUGIN_TARGET_NAME "") @@ -26,7 +30,9 @@ else() set(PLUGIN_TARGET_NAME ${PROJECT_NAME}) endif() -set(qml_files RibbonTabBar.qml RibbonTabButton.qml RibbonView.qml +# List of QML files to be included in the project +set(qml_files + RibbonTabBar.qml RibbonTabButton.qml RibbonView.qml RibbonTabPage.qml RibbonTabGroup.qml RibbonButton.qml RibbonBottomBar.qml RibbonIcon.qml RibbonToolTip.qml RibbonTitleBar.qml RibbonSlider.qml RibbonSwitchButton.qml @@ -43,33 +49,45 @@ set(qml_files RibbonTabBar.qml RibbonTabButton.qml RibbonView.qml RibbonObject.qml RibbonProgressBar.qml RibbonProgressRing.qml RibbonBusyBar.qml RibbonBusyRing.qml RibbonPageIndicator.qml) +# Set the QML prefix path set(qml_prefix "qml/Qt${QT_VERSION_MAJOR}/") +# Add prefix to all QML files list(TRANSFORM qml_files PREPEND ${qml_prefix}) -set (source_files ribbonui.cpp ribbonui.h definitions.h ribbontheme.h ribbontheme.cpp +# List of source files to be included in the project +set (source_files + ribbonui.cpp ribbonui.h definitions.h ribbontheme.h ribbontheme.cpp platformsupport.h) +# Configure version header set(__ribbonui_project_version "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") string(TOUPPER ${PROJECT_NAME} __ribbonui_project_name) string(TOLOWER ${PROJECT_NAME} __ribbonui_project_name_lower) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/..//.cmake/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/${__ribbonui_project_name_lower}_version.h) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../.cmake/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/${__ribbonui_project_name_lower}_version.h) list(APPEND source_files ${CMAKE_CURRENT_BINARY_DIR}/${__ribbonui_project_name_lower}_version.h) +# Add platform-specific source files for Apple if(APPLE) list(APPEND source_files platformsupport.mm) endif() +# Set properties for QML files foreach(qmlfile ${qml_files}) string(REPLACE "${qml_prefix}" "" fixedfile ${qmlfile}) set_source_files_properties(${qmlfile} PROPERTIES QT_RESOURCE_ALIAS ${fixedfile}) endforeach(qmlfile) +# Include Qt5 QML plugin for Qt versions less than 6.0 if(QT_VERSION VERSION_LESS 6.0) include(Qt5QMLPlugin) set(__qml_plugin_depend_module "QWindowKit") endif() + +# Define the RibbonUI library qt_add_library(${PROJECT_NAME} ${LIB_TYPE}) + +# Define the QML module for the library qt_add_qml_module(${PROJECT_NAME} PLUGIN_TARGET ${PLUGIN_TARGET_NAME} OUTPUT_DIRECTORY ${RIBBONUI_QML_PLUGIN_DIRECTORY} @@ -81,6 +99,7 @@ qt_add_qml_module(${PROJECT_NAME} RESOURCE_PREFIX "/qt/qml/" ) +# Set properties for MinGW and MSVC compilers if (MINGW) set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") endif() @@ -89,25 +108,33 @@ if (MSVC) set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d") endif() +# Set target compile definitions target_compile_definitions(${PROJECT_NAME} PRIVATE $<$,$>:QT_QML_DEBUG> RIBBONUI_LIBRARY ) + +# Link required libraries target_link_libraries(${PROJECT_NAME} PRIVATE Qt::Quick Qt::CorePrivate Qt::QuickPrivate Qt::QmlPrivate ) + target_link_libraries(${PROJECT_NAME} PUBLIC QWindowKit::Quick ) + +# Include directories target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/3rdparty/qwindowkit/include ) + target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR} ) -install(DIRECTORY ${RIBBONUI_QML_PLUGIN_DIRECTORY} DESTINATION ${CMAKE_INSTALL_PREFIX}/imports) +# Install QML plugin directory +install(DIRECTORY ${RIBBONUI_QML_PLUGIN_DIRECTORY} DESTINATION ${CMAKE_INSTALL_PREFIX}/imports)