diff --git a/CMakeLists.txt b/CMakeLists.txt index 40b1bc4bb..06d1c4483 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,21 @@ 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 @@ -181,11 +196,18 @@ 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 c549d9c25..1ee1f215f 100644 --- a/cmake/FindQtRuntime.cmake +++ b/cmake/FindQtRuntime.cmake @@ -1,180 +1,89 @@ -# FindQtRuntime.cmake -# # Find a compatible Qt version -# -# 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(COCKATRICE_QT_VERSION_NAME Qt6) - -# --------------------------------------------------------------------------- -# 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 -# --------------------------------------------------------------------------- +# 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 set(REQUIRED_QT_COMPONENTS Core) - if(WITH_SERVER) - list(APPEND REQUIRED_QT_COMPONENTS ${SERVATRICE_QT_COMPONENTS}) + set(_SERVATRICE_NEEDED Network Sql WebSockets) endif() - if(WITH_CLIENT) - list(APPEND REQUIRED_QT_COMPONENTS ${COCKATRICE_QT_COMPONENTS}) + set(_COCKATRICE_NEEDED + Concurrent + Gui + Multimedia + Network + PrintSupport + ShaderTools + Svg + WebSockets + Widgets + Xml + Quick + QuickWidgets + ) endif() - if(WITH_ORACLE) - list(APPEND REQUIRED_QT_COMPONENTS ${ORACLE_QT_COMPONENTS}) + set(_ORACLE_NEEDED Concurrent Network Svg Widgets) endif() - if(TEST) - list(APPEND REQUIRED_QT_COMPONENTS ${TEST_QT_COMPONENTS}) + # 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 define minimum version centrally -# --------------------------------------------------------------------------- +# Find Qt and all required components including Linguist +find_package( + Qt6 + COMPONENTS ${REQUIRED_QT_COMPONENTS} Linguist + QUIET HINTS ${Qt6_DIR} +) -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) +if(NOT Qt6_FOUND) + message(FATAL_ERROR "No suitable version of Qt was found") endif() +set(COCKATRICE_QT_VERSION_NAME Qt6) -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() +list(FIND Qt6LinguistTools_TARGETS Qt6::lrelease QT6_LRELEASE_INDEX) +if(QT6_LRELEASE_INDEX EQUAL -1) message(WARNING "Qt6 lrelease not found.") endif() -if(TARGET Qt6::lupdate) - set(QT6_LUPDATE_INDEX 0) -else() +list(FIND Qt6LinguistTools_TARGETS Qt6::lupdate QT6_LUPDATE_INDEX) +if(QT6_LUPDATE_INDEX EQUAL -1) message(WARNING "Qt6 lupdate not found.") endif() -# --------------------------------------------------------------------------- -# Qt runtime/plugin paths -# --------------------------------------------------------------------------- - set(CMAKE_POSITION_INDEPENDENT_CODE ON) -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) +# 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) 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) - # macOS needs a bit more help finding all necessary components. + # Mac 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}") -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}") +# 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}") -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() +# 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}") diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 062223c93..85a95a9bd 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, platforms, styles, tls + # Qt plugins: iconengines, imageformats, multimedia (Qt6), platforms, styles, tls (Qt6) 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, platforms, styles, tls + # Qt plugins: iconengines, imageformats, multimedia (Qt6) platforms, styles, tls (Qt6) 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 ae19c7289..1cbeb4fe7 100644 --- a/cockatrice/src/game_graphics/board/abstract_card_drag_item.h +++ b/cockatrice/src/game_graphics/board/abstract_card_drag_item.h @@ -16,6 +16,7 @@ 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 2cec8964d..9ddcc6d58 100644 --- a/cockatrice/src/game_graphics/board/abstract_counter.h +++ b/cockatrice/src/game_graphics/board/abstract_counter.h @@ -23,6 +23,7 @@ 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 67e350f35..76a2d5d6c 100644 --- a/cockatrice/src/game_graphics/board/arrow_item.h +++ b/cockatrice/src/game_graphics/board/arrow_item.h @@ -19,6 +19,7 @@ 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 64b7c100c..39884ef75 100644 --- a/cockatrice/src/game_graphics/phases_toolbar.h +++ b/cockatrice/src/game_graphics/phases_toolbar.h @@ -27,6 +27,7 @@ class GameCommand; class PhaseButton : public QObject, public QGraphicsItem { Q_OBJECT + Q_INTERFACES(QGraphicsItem) private: QString name; bool active, highlightable; @@ -64,6 +65,7 @@ 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 f453c2ab9..d73547f81 100644 --- a/cockatrice/src/game_graphics/player/player_area.h +++ b/cockatrice/src/game_graphics/player/player_area.h @@ -16,6 +16,7 @@ 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 51ec22e8c..9dfa00ce2 100644 --- a/cockatrice/src/game_graphics/zones/view_zone.h +++ b/cockatrice/src/game_graphics/zones/view_zone.h @@ -34,6 +34,7 @@ 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;