diff --git a/CMakeLists.txt b/CMakeLists.txt index 06d1c4483..40b1bc4bb 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,18 +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}") +# Find Qt, min version is defined in that .cmake file include(FindQtRuntime) -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 1ee1f215f..c549d9c25 100644 --- a/cmake/FindQtRuntime.cmake +++ b/cmake/FindQtRuntime.cmake @@ -1,89 +1,180 @@ +# 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) -if(WITH_SERVER) - set(_SERVATRICE_NEEDED Network Sql WebSockets) -endif() -if(WITH_CLIENT) - set(_COCKATRICE_NEEDED - Concurrent - Gui - Multimedia - Network - PrintSupport - ShaderTools - Svg - WebSockets - Widgets - Xml - Quick - QuickWidgets - ) -endif() -if(WITH_ORACLE) - set(_ORACLE_NEEDED 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) -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} -) - -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) -if(QT6_LRELEASE_INDEX EQUAL -1) +# --------------------------------------------------------------------------- +# Define the Qt components required by each target +# --------------------------------------------------------------------------- + +set(SERVATRICE_QT_COMPONENTS Network Sql WebSockets) + +set(COCKATRICE_QT_COMPONENTS + Concurrent + Gui + Multimedia + Network + PrintSupport + ShaderTools + Svg + WebSockets + Widgets + 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 ${ORACLE_QT_COMPONENTS}) +endif() + +if(TEST) + list(APPEND REQUIRED_QT_COMPONENTS ${TEST_QT_COMPONENTS}) +endif() + +list(REMOVE_DUPLICATES REQUIRED_QT_COMPONENTS) + +# --------------------------------------------------------------------------- +# Find Qt and define minimum version centrally +# --------------------------------------------------------------------------- + +find_package(Qt6 6.4 REQUIRED COMPONENTS ${REQUIRED_QT_COMPONENTS} Linguist) + +# --------------------------------------------------------------------------- +# 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() 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} 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;