From a617d32ddf8016d3135299416f2b6fe9288cadb5 Mon Sep 17 00:00:00 2001 From: tooomm Date: Fri, 28 Aug 2026 13:31:07 +0200 Subject: [PATCH 1/4] small fixes --- CMakeLists.txt | 2 +- cmake/NSIS.template.in | 4 ++-- cockatrice/CMakeLists.txt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 06d1c4483..18cddf820 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,7 +65,7 @@ if(WIN32 OR USE_VCPKG) # Windows (including 64bit) or USE_VCPKG set ) message( WARNING - "QTDIR variable is missing. Please set this variable to specify path to Qt (e.g. C:/Qt/6.4.2/msvc2019_64)" + "QTDIR variable is missing. Please set this variable to specify path to Qt (e.g. C:/Qt/6.4.2/msvc2019_64)" ) endif() endif() diff --git a/cmake/NSIS.template.in b/cmake/NSIS.template.in index c1dc0302e..197ee363b 100644 --- a/cmake/NSIS.template.in +++ b/cmake/NSIS.template.in @@ -370,6 +370,6 @@ LangString DESC_SecStartMenu ${LANG_ENGLISH} "Create start menu items for Cockat LangString DESC_UnSecApplication ${LANG_ENGLISH} "Cockatrice program files and start menu items" LangString DESC_UnSecConfiguration ${LANG_ENGLISH} "Configurations, decks, card database, pictures" !insertmacro MUI_UNFUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${UnSecApplication} $(DESC_UnSecApplication) - !insertmacro MUI_DESCRIPTION_TEXT ${UnSecConfiguration} $(DESC_UnSecConfiguration) + !insertmacro MUI_DESCRIPTION_TEXT ${UnSecApplication} $(DESC_UnSecApplication) + !insertmacro MUI_DESCRIPTION_TEXT ${UnSecConfiguration} $(DESC_UnSecConfiguration) !insertmacro MUI_UNFUNCTION_DESCRIPTION_END diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 85a95a9bd..062223c93 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -595,7 +595,7 @@ if(APPLE) set(plugin_dest_dir cockatrice.app/Contents/Plugins) set(qtconf_dest_dir cockatrice.app/Contents/Resources) - # Qt plugins: iconengines, imageformats, multimedia (Qt6), platforms, styles, tls (Qt6) + # Qt plugins: iconengines, imageformats, multimedia, platforms, styles, tls install( DIRECTORY "${QT_PLUGINS_DIR}/" DESTINATION ${plugin_dest_dir} @@ -660,7 +660,7 @@ if(WIN32) # Windows (including 64bit) PATTERN "*.ini" ) - # Qt plugins: iconengines, imageformats, multimedia (Qt6) platforms, styles, tls (Qt6) + # Qt plugins: iconengines, imageformats, multimedia, platforms, styles, tls install( DIRECTORY "${QT_PLUGINS_DIR}/" DESTINATION ${plugin_dest_dir} From b2ce234b96e97ad673d587c335926b5b55951ab5 Mon Sep 17 00:00:00 2001 From: tooomm Date: Fri, 28 Aug 2026 16:24:39 +0200 Subject: [PATCH 2/4] simplify legacy qtdir logic --- CMakeLists.txt | 22 +----------------- cmake/FindQtRuntime.cmake | 49 +++++++++++++++++---------------------- 2 files changed, 22 insertions(+), 49 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 18cddf820..35ae849b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,21 +53,6 @@ if(WIN32 OR USE_VCPKG) # Windows (including 64bit) or USE_VCPKG set ${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake CACHE FILEPATH "Vcpkg toolchain file" ) - - # Show warning if QTDIR is NOT defined - if(NOT QTDIR - AND NOT DEFINED ENV{QTDIR} - AND NOT DEFINED ENV{QTDIR64} - ) - set(QTDIR - "" - CACHE PATH "Path to Qt (e.g. C:/Qt/6.4.2/msvc2019_64)" - ) - message( - WARNING - "QTDIR variable is missing. Please set this variable to specify path to Qt (e.g. C:/Qt/6.4.2/msvc2019_64)" - ) - endif() endif() # A project name is needed for CPack @@ -196,16 +181,11 @@ endif() find_package(Threads REQUIRED) -if(DEFINED QTDIR) - list(APPEND CMAKE_PREFIX_PATH "${QTDIR}") -elseif(DEFINED ENV{QTDIR}) - list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR}") -endif() - message(STATUS "Update Translations: ${UPDATE_TRANSLATIONS}") include(FindQtRuntime) +# Qt is located through normal CMake package discovery find_package(Qt6 6.4 REQUIRED) set(CMAKE_AUTOMOC TRUE) diff --git a/cmake/FindQtRuntime.cmake b/cmake/FindQtRuntime.cmake index 1ee1f215f..1f239d6b0 100644 --- a/cmake/FindQtRuntime.cmake +++ b/cmake/FindQtRuntime.cmake @@ -8,49 +8,42 @@ # Output: TEST_QT_MODULES set(REQUIRED_QT_COMPONENTS Core) + if(WITH_SERVER) - set(_SERVATRICE_NEEDED Network Sql WebSockets) + list(APPEND REQUIRED_QT_COMPONENTS Network Sql WebSockets) endif() if(WITH_CLIENT) - set(_COCKATRICE_NEEDED - Concurrent - Gui - Multimedia - Network - PrintSupport - ShaderTools - Svg - WebSockets - Widgets - Xml - Quick - QuickWidgets + list( + APPEND + REQUIRED_QT_COMPONENTS + Concurrent + Gui + Multimedia + Network + PrintSupport + ShaderTools + Svg + WebSockets + Widgets + Xml + Quick + QuickWidgets ) endif() if(WITH_ORACLE) - set(_ORACLE_NEEDED Concurrent Network Svg Widgets) + list(APPEND REQUIRED_QT_COMPONENTS Concurrent Network Svg Widgets) endif() if(TEST) # Union of Qt modules required across all test targets (independent of application targets). - # When adding a new test that needs additional Qt modules, add them here rather than in the test's CMakeLists.txt. - set(_TEST_NEEDED Concurrent Network Svg Widgets) + # When adding a new test that needs additional Qt modules, add them here rather than in the test's CMakeLists.txt + list(APPEND REQUIRED_QT_COMPONENTS Concurrent Network Svg Widgets) endif() -set(REQUIRED_QT_COMPONENTS ${REQUIRED_QT_COMPONENTS} ${_SERVATRICE_NEEDED} ${_COCKATRICE_NEEDED} ${_ORACLE_NEEDED} - ${_TEST_NEEDED} -) list(REMOVE_DUPLICATES REQUIRED_QT_COMPONENTS) # Find Qt and all required components including Linguist -find_package( - Qt6 - COMPONENTS ${REQUIRED_QT_COMPONENTS} Linguist - QUIET HINTS ${Qt6_DIR} -) +find_package(Qt6 REQUIRED COMPONENTS ${REQUIRED_QT_COMPONENTS} Linguist) -if(NOT Qt6_FOUND) - message(FATAL_ERROR "No suitable version of Qt was found") -endif() set(COCKATRICE_QT_VERSION_NAME Qt6) list(FIND Qt6LinguistTools_TARGETS Qt6::lrelease QT6_LRELEASE_INDEX) From d183291753e5bd45690ccf8c1fbe20bc97696ce6 Mon Sep 17 00:00:00 2001 From: tooomm Date: Fri, 28 Aug 2026 16:57:29 +0200 Subject: [PATCH 3/4] QGraphicsItems is not a Qt interface --- cmake/FindQtRuntime.cmake | 5 +++++ cockatrice/src/game_graphics/board/abstract_card_drag_item.h | 1 - cockatrice/src/game_graphics/board/abstract_counter.h | 1 - cockatrice/src/game_graphics/board/arrow_item.h | 1 - cockatrice/src/game_graphics/phases_toolbar.h | 2 -- cockatrice/src/game_graphics/player/player_area.h | 1 - cockatrice/src/game_graphics/zones/view_zone.h | 1 - 7 files changed, 5 insertions(+), 7 deletions(-) diff --git a/cmake/FindQtRuntime.cmake b/cmake/FindQtRuntime.cmake index 1f239d6b0..c0e94df68 100644 --- a/cmake/FindQtRuntime.cmake +++ b/cmake/FindQtRuntime.cmake @@ -43,6 +43,11 @@ list(REMOVE_DUPLICATES REQUIRED_QT_COMPONENTS) # Find Qt and all required components including Linguist find_package(Qt6 REQUIRED COMPONENTS ${REQUIRED_QT_COMPONENTS} Linguist) +message(STATUS "Qt6_VERSION = ${Qt6_VERSION}") +message(STATUS "Qt6_DIR = ${Qt6_DIR}") +message(STATUS "Qt6Core_DIR = ${Qt6Core_DIR}") +message(STATUS "TEST=${TEST}") +message(STATUS "TEST_QT_MODULES=${TEST_QT_MODULES}") set(COCKATRICE_QT_VERSION_NAME Qt6) diff --git a/cockatrice/src/game_graphics/board/abstract_card_drag_item.h b/cockatrice/src/game_graphics/board/abstract_card_drag_item.h index 1cbeb4fe7..ae19c7289 100644 --- a/cockatrice/src/game_graphics/board/abstract_card_drag_item.h +++ b/cockatrice/src/game_graphics/board/abstract_card_drag_item.h @@ -16,7 +16,6 @@ class CardInfo; class AbstractCardDragItem : public QObject, public QGraphicsItem { Q_OBJECT - Q_INTERFACES(QGraphicsItem) protected: AbstractCardItem *item; QPointF hotSpot; diff --git a/cockatrice/src/game_graphics/board/abstract_counter.h b/cockatrice/src/game_graphics/board/abstract_counter.h index 9ddcc6d58..2cec8964d 100644 --- a/cockatrice/src/game_graphics/board/abstract_counter.h +++ b/cockatrice/src/game_graphics/board/abstract_counter.h @@ -23,7 +23,6 @@ class QString; class AbstractCounter : public QObject, public QGraphicsItem, public AbstractPlayerComponent { Q_OBJECT - Q_INTERFACES(QGraphicsItem) protected: PlayerLogic *player; diff --git a/cockatrice/src/game_graphics/board/arrow_item.h b/cockatrice/src/game_graphics/board/arrow_item.h index 76a2d5d6c..67e350f35 100644 --- a/cockatrice/src/game_graphics/board/arrow_item.h +++ b/cockatrice/src/game_graphics/board/arrow_item.h @@ -19,7 +19,6 @@ class PlayerLogic; class ArrowItem : public QObject, public QGraphicsItem, public IAnimatedItem { Q_OBJECT - Q_INTERFACES(QGraphicsItem) signals: void requestDeletion(int creatorId, int id); diff --git a/cockatrice/src/game_graphics/phases_toolbar.h b/cockatrice/src/game_graphics/phases_toolbar.h index 39884ef75..64b7c100c 100644 --- a/cockatrice/src/game_graphics/phases_toolbar.h +++ b/cockatrice/src/game_graphics/phases_toolbar.h @@ -27,7 +27,6 @@ class GameCommand; class PhaseButton : public QObject, public QGraphicsItem { Q_OBJECT - Q_INTERFACES(QGraphicsItem) private: QString name; bool active, highlightable; @@ -65,7 +64,6 @@ protected: class PhasesToolbar : public QObject, public QGraphicsItem { Q_OBJECT - Q_INTERFACES(QGraphicsItem) private: QList buttonList; PhaseButton *nextTurnButton; diff --git a/cockatrice/src/game_graphics/player/player_area.h b/cockatrice/src/game_graphics/player/player_area.h index d73547f81..f453c2ab9 100644 --- a/cockatrice/src/game_graphics/player/player_area.h +++ b/cockatrice/src/game_graphics/player/player_area.h @@ -16,7 +16,6 @@ class PlayerArea : public QObject, public QGraphicsItem { Q_OBJECT - Q_INTERFACES(QGraphicsItem) private: QRectF bRect; int playerZoneId; diff --git a/cockatrice/src/game_graphics/zones/view_zone.h b/cockatrice/src/game_graphics/zones/view_zone.h index 9dfa00ce2..51ec22e8c 100644 --- a/cockatrice/src/game_graphics/zones/view_zone.h +++ b/cockatrice/src/game_graphics/zones/view_zone.h @@ -34,7 +34,6 @@ class QGraphicsSceneWheelEvent; class ZoneViewZone : public SelectZone, public QGraphicsLayoutItem { Q_OBJECT - Q_INTERFACES(QGraphicsLayoutItem) private: static constexpr int HORIZONTAL_PADDING = 12; static constexpr int VERTICAL_PADDING = 5; From 0e0bed8d3215fa42ae2f87d5e125110c52e7350d Mon Sep 17 00:00:00 2001 From: tooomm Date: Fri, 28 Aug 2026 17:55:20 +0200 Subject: [PATCH 4/4] rework finding qt --- CMakeLists.txt | 4 +- cmake/FindQtRuntime.cmake | 183 ++++++++++++++++++++++++++++---------- 2 files changed, 139 insertions(+), 48 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 35ae849b6..40b1bc4bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -183,11 +183,9 @@ find_package(Threads REQUIRED) message(STATUS "Update Translations: ${UPDATE_TRANSLATIONS}") +# Find Qt, min version is defined in that .cmake file include(FindQtRuntime) -# Qt is located through normal CMake package discovery -find_package(Qt6 6.4 REQUIRED) - set(CMAKE_AUTOMOC TRUE) ## Find other needed libraries diff --git a/cmake/FindQtRuntime.cmake b/cmake/FindQtRuntime.cmake index c0e94df68..c549d9c25 100644 --- a/cmake/FindQtRuntime.cmake +++ b/cmake/FindQtRuntime.cmake @@ -1,21 +1,32 @@ +# FindQtRuntime.cmake +# # Find a compatible Qt version -# Inputs: WITH_SERVER, WITH_CLIENT, WITH_ORACLE -# Optional Input: QT6_DIR -- Hint as to where Qt6 lives on the system -# Output: COCKATRICE_QT_VERSION_NAME -- Example values: Qt6 -# Output: SERVATRICE_QT_MODULES -# Output: COCKATRICE_QT_MODULES -# Output: ORACLE_QT_MODULES -# Output: TEST_QT_MODULES +# +# Inputs: +# WITH_SERVER +# WITH_CLIENT +# WITH_ORACLE +# TEST +# +# Outputs: +# COCKATRICE_QT_VERSION_NAME +# QT_CORE_MODULE +# SERVATRICE_QT_MODULES +# COCKATRICE_QT_MODULES +# ORACLE_QT_MODULES +# TEST_QT_MODULES +# QT_LIBRARY_DIR +# QT_PLUGINS_DIR -set(REQUIRED_QT_COMPONENTS Core) +set(COCKATRICE_QT_VERSION_NAME Qt6) -if(WITH_SERVER) - list(APPEND REQUIRED_QT_COMPONENTS Network Sql WebSockets) -endif() -if(WITH_CLIENT) - list( - APPEND - REQUIRED_QT_COMPONENTS +# --------------------------------------------------------------------------- +# Define the Qt components required by each target +# --------------------------------------------------------------------------- + +set(SERVATRICE_QT_COMPONENTS Network Sql WebSockets) + +set(COCKATRICE_QT_COMPONENTS Concurrent Gui Multimedia @@ -28,60 +39,142 @@ if(WITH_CLIENT) Xml Quick QuickWidgets - ) +) + +set(ORACLE_QT_COMPONENTS Concurrent Network Svg Widgets) + +set(TEST_QT_COMPONENTS Concurrent Network Svg Widgets) + +# --------------------------------------------------------------------------- +# Determine which Qt components are required for this build +# --------------------------------------------------------------------------- + +set(REQUIRED_QT_COMPONENTS Core) + +if(WITH_SERVER) + list(APPEND REQUIRED_QT_COMPONENTS ${SERVATRICE_QT_COMPONENTS}) endif() + +if(WITH_CLIENT) + list(APPEND REQUIRED_QT_COMPONENTS ${COCKATRICE_QT_COMPONENTS}) +endif() + if(WITH_ORACLE) - list(APPEND REQUIRED_QT_COMPONENTS Concurrent Network Svg Widgets) + list(APPEND REQUIRED_QT_COMPONENTS ${ORACLE_QT_COMPONENTS}) endif() + if(TEST) - # Union of Qt modules required across all test targets (independent of application targets). - # When adding a new test that needs additional Qt modules, add them here rather than in the test's CMakeLists.txt - list(APPEND REQUIRED_QT_COMPONENTS Concurrent Network Svg Widgets) + list(APPEND REQUIRED_QT_COMPONENTS ${TEST_QT_COMPONENTS}) endif() list(REMOVE_DUPLICATES REQUIRED_QT_COMPONENTS) -# Find Qt and all required components including Linguist -find_package(Qt6 REQUIRED COMPONENTS ${REQUIRED_QT_COMPONENTS} Linguist) -message(STATUS "Qt6_VERSION = ${Qt6_VERSION}") -message(STATUS "Qt6_DIR = ${Qt6_DIR}") -message(STATUS "Qt6Core_DIR = ${Qt6Core_DIR}") -message(STATUS "TEST=${TEST}") -message(STATUS "TEST_QT_MODULES=${TEST_QT_MODULES}") +# --------------------------------------------------------------------------- +# Find Qt and define minimum version centrally +# --------------------------------------------------------------------------- -set(COCKATRICE_QT_VERSION_NAME Qt6) +find_package(Qt6 6.4 REQUIRED COMPONENTS ${REQUIRED_QT_COMPONENTS} Linguist) -list(FIND Qt6LinguistTools_TARGETS Qt6::lrelease QT6_LRELEASE_INDEX) -if(QT6_LRELEASE_INDEX EQUAL -1) +# --------------------------------------------------------------------------- +# Convert a component list such as: +# Network;Sql;WebSockets +# into: +# Qt6::Network;Qt6::Sql;Qt6::WebSockets +# --------------------------------------------------------------------------- + +function(_qt_components_to_targets COMPONENTS OUTPUT_VARIABLE) + set(TARGETS) + + foreach(COMPONENT IN LISTS COMPONENTS) + list(APPEND TARGETS "${COCKATRICE_QT_VERSION_NAME}::${COMPONENT}") + endforeach() + + set(${OUTPUT_VARIABLE} + "${TARGETS}" + PARENT_SCOPE + ) +endfunction() + +# --------------------------------------------------------------------------- +# Export Qt target lists for the individual targets +# --------------------------------------------------------------------------- + +if(WITH_SERVER) + _qt_components_to_targets("${SERVATRICE_QT_COMPONENTS}" SERVATRICE_QT_MODULES) +endif() + +if(WITH_CLIENT) + _qt_components_to_targets("${COCKATRICE_QT_COMPONENTS}" COCKATRICE_QT_MODULES) +endif() + +if(WITH_ORACLE) + _qt_components_to_targets("${ORACLE_QT_COMPONENTS}" ORACLE_QT_MODULES) +endif() + +if(TEST) + _qt_components_to_targets("${TEST_QT_COMPONENTS}" TEST_QT_MODULES) +endif() + +# Core-only export (useful for headless libraries) +set(QT_CORE_MODULE "${COCKATRICE_QT_VERSION_NAME}::Core") + +# --------------------------------------------------------------------------- +# Qt Linguist tools +# --------------------------------------------------------------------------- + +if(TARGET Qt6::lrelease) + set(QT6_LRELEASE_INDEX 0) +else() message(WARNING "Qt6 lrelease not found.") endif() -list(FIND Qt6LinguistTools_TARGETS Qt6::lupdate QT6_LUPDATE_INDEX) -if(QT6_LUPDATE_INDEX EQUAL -1) +if(TARGET Qt6::lupdate) + set(QT6_LUPDATE_INDEX 0) +else() message(WARNING "Qt6 lupdate not found.") endif() +# --------------------------------------------------------------------------- +# Qt runtime/plugin paths +# --------------------------------------------------------------------------- + set(CMAKE_POSITION_INDEPENDENT_CODE ON) -# Establish Qt Plugins directory & Library directories -get_target_property(QT_LIBRARY_DIR ${COCKATRICE_QT_VERSION_NAME}::Core LOCATION) -get_filename_component(QT_LIBRARY_DIR ${QT_LIBRARY_DIR} DIRECTORY) +if(NOT TARGET Qt6::Core) + message(FATAL_ERROR "Qt6::Core target is not available") +endif() + +get_target_property(QT_LIBRARY_DIR Qt6::Core LOCATION) +get_filename_component(QT_LIBRARY_DIR "${QT_LIBRARY_DIR}" DIRECTORY) get_filename_component(QT_PLUGINS_DIR "${Qt6Core_DIR}/../../../${QT6_INSTALL_PLUGINS}" ABSOLUTE) get_filename_component(QT_LIBRARY_DIR "${QT_LIBRARY_DIR}/../../.." ABSOLUTE) + if(UNIX AND APPLE) - # Mac needs a bit more help finding all necessary components + # macOS needs a bit more help finding all necessary components. list(APPEND QT_LIBRARY_DIR "/usr/local/lib") endif() + +# --------------------------------------------------------------------------- +# Debug information +# --------------------------------------------------------------------------- + message(DEBUG "QT_PLUGINS_DIR = ${QT_PLUGINS_DIR}") message(DEBUG "QT_LIBRARY_DIR = ${QT_LIBRARY_DIR}") -# Establish exports -string(REGEX REPLACE "([^;]+)" "${COCKATRICE_QT_VERSION_NAME}::\\1" SERVATRICE_QT_MODULES "${_SERVATRICE_NEEDED}") -string(REGEX REPLACE "([^;]+)" "${COCKATRICE_QT_VERSION_NAME}::\\1" COCKATRICE_QT_MODULES "${_COCKATRICE_NEEDED}") -string(REGEX REPLACE "([^;]+)" "${COCKATRICE_QT_VERSION_NAME}::\\1" ORACLE_QT_MODULES "${_ORACLE_NEEDED}") -string(REGEX REPLACE "([^;]+)" "${COCKATRICE_QT_VERSION_NAME}::\\1" TEST_QT_MODULES "${_TEST_NEEDED}") +message(STATUS "Qt6_VERSION = ${Qt6_VERSION}") +message(STATUS "Qt6_DIR = ${Qt6_DIR}") +message(STATUS "Qt6Core_DIR = ${Qt6Core_DIR}") +message(STATUS "REQUIRED_QT_COMPONENTS = ${REQUIRED_QT_COMPONENTS}") -# Core-only export (useful for headless libs) -set(QT_CORE_MODULE "${COCKATRICE_QT_VERSION_NAME}::Core") - -message(STATUS "Found Qt ${${COCKATRICE_QT_VERSION_NAME}_VERSION} at: ${${COCKATRICE_QT_VERSION_NAME}_DIR}") +if(WITH_CLIENT) + message(STATUS "COCKATRICE_QT_MODULES = ${COCKATRICE_QT_MODULES}") +endif() +if(WITH_ORACLE) + message(STATUS "ORACLE_QT_MODULES = ${ORACLE_QT_MODULES}") +endif() +if(WITH_SERVER) + message(STATUS "SERVATRICE_QT_MODULES = ${SERVATRICE_QT_MODULES}") +endif() +if(TEST) + message(STATUS "TEST_QT_MODULES = ${TEST_QT_MODULES}") +endif()