rework finding qt

This commit is contained in:
tooomm 2026-08-28 17:55:20 +02:00
parent d183291753
commit 0e0bed8d32
2 changed files with 139 additions and 48 deletions

View file

@ -183,11 +183,9 @@ find_package(Threads REQUIRED)
message(STATUS "Update Translations: ${UPDATE_TRANSLATIONS}") message(STATUS "Update Translations: ${UPDATE_TRANSLATIONS}")
# Find Qt, min version is defined in that .cmake file
include(FindQtRuntime) include(FindQtRuntime)
# Qt is located through normal CMake package discovery
find_package(Qt6 6.4 REQUIRED)
set(CMAKE_AUTOMOC TRUE) set(CMAKE_AUTOMOC TRUE)
## Find other needed libraries ## Find other needed libraries

View file

@ -1,21 +1,32 @@
# FindQtRuntime.cmake
#
# Find a compatible Qt version # 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 # Inputs:
# Output: COCKATRICE_QT_VERSION_NAME -- Example values: Qt6 # WITH_SERVER
# Output: SERVATRICE_QT_MODULES # WITH_CLIENT
# Output: COCKATRICE_QT_MODULES # WITH_ORACLE
# Output: ORACLE_QT_MODULES # TEST
# Output: TEST_QT_MODULES #
# 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) # Define the Qt components required by each target
endif() # ---------------------------------------------------------------------------
if(WITH_CLIENT)
list( set(SERVATRICE_QT_COMPONENTS Network Sql WebSockets)
APPEND
REQUIRED_QT_COMPONENTS set(COCKATRICE_QT_COMPONENTS
Concurrent Concurrent
Gui Gui
Multimedia Multimedia
@ -28,60 +39,142 @@ if(WITH_CLIENT)
Xml Xml
Quick Quick
QuickWidgets 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() endif()
if(WITH_CLIENT)
list(APPEND REQUIRED_QT_COMPONENTS ${COCKATRICE_QT_COMPONENTS})
endif()
if(WITH_ORACLE) if(WITH_ORACLE)
list(APPEND REQUIRED_QT_COMPONENTS Concurrent Network Svg Widgets) list(APPEND REQUIRED_QT_COMPONENTS ${ORACLE_QT_COMPONENTS})
endif() endif()
if(TEST) if(TEST)
# Union of Qt modules required across all test targets (independent of application targets). list(APPEND REQUIRED_QT_COMPONENTS ${TEST_QT_COMPONENTS})
# 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() endif()
list(REMOVE_DUPLICATES REQUIRED_QT_COMPONENTS) list(REMOVE_DUPLICATES REQUIRED_QT_COMPONENTS)
# Find Qt and all required components including Linguist # ---------------------------------------------------------------------------
find_package(Qt6 REQUIRED COMPONENTS ${REQUIRED_QT_COMPONENTS} Linguist) # Find Qt and define minimum version centrally
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) 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.") message(WARNING "Qt6 lrelease not found.")
endif() endif()
list(FIND Qt6LinguistTools_TARGETS Qt6::lupdate QT6_LUPDATE_INDEX) if(TARGET Qt6::lupdate)
if(QT6_LUPDATE_INDEX EQUAL -1) set(QT6_LUPDATE_INDEX 0)
else()
message(WARNING "Qt6 lupdate not found.") message(WARNING "Qt6 lupdate not found.")
endif() endif()
# ---------------------------------------------------------------------------
# Qt runtime/plugin paths
# ---------------------------------------------------------------------------
set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Establish Qt Plugins directory & Library directories if(NOT TARGET Qt6::Core)
get_target_property(QT_LIBRARY_DIR ${COCKATRICE_QT_VERSION_NAME}::Core LOCATION) message(FATAL_ERROR "Qt6::Core target is not available")
get_filename_component(QT_LIBRARY_DIR ${QT_LIBRARY_DIR} DIRECTORY) 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_PLUGINS_DIR "${Qt6Core_DIR}/../../../${QT6_INSTALL_PLUGINS}" ABSOLUTE)
get_filename_component(QT_LIBRARY_DIR "${QT_LIBRARY_DIR}/../../.." ABSOLUTE) get_filename_component(QT_LIBRARY_DIR "${QT_LIBRARY_DIR}/../../.." ABSOLUTE)
if(UNIX AND APPLE) 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") list(APPEND QT_LIBRARY_DIR "/usr/local/lib")
endif() endif()
# ---------------------------------------------------------------------------
# Debug information
# ---------------------------------------------------------------------------
message(DEBUG "QT_PLUGINS_DIR = ${QT_PLUGINS_DIR}") message(DEBUG "QT_PLUGINS_DIR = ${QT_PLUGINS_DIR}")
message(DEBUG "QT_LIBRARY_DIR = ${QT_LIBRARY_DIR}") message(DEBUG "QT_LIBRARY_DIR = ${QT_LIBRARY_DIR}")
# Establish exports message(STATUS "Qt6_VERSION = ${Qt6_VERSION}")
string(REGEX REPLACE "([^;]+)" "${COCKATRICE_QT_VERSION_NAME}::\\1" SERVATRICE_QT_MODULES "${_SERVATRICE_NEEDED}") message(STATUS "Qt6_DIR = ${Qt6_DIR}")
string(REGEX REPLACE "([^;]+)" "${COCKATRICE_QT_VERSION_NAME}::\\1" COCKATRICE_QT_MODULES "${_COCKATRICE_NEEDED}") message(STATUS "Qt6Core_DIR = ${Qt6Core_DIR}")
string(REGEX REPLACE "([^;]+)" "${COCKATRICE_QT_VERSION_NAME}::\\1" ORACLE_QT_MODULES "${_ORACLE_NEEDED}") message(STATUS "REQUIRED_QT_COMPONENTS = ${REQUIRED_QT_COMPONENTS}")
string(REGEX REPLACE "([^;]+)" "${COCKATRICE_QT_VERSION_NAME}::\\1" TEST_QT_MODULES "${_TEST_NEEDED}")
# Core-only export (useful for headless libs) if(WITH_CLIENT)
set(QT_CORE_MODULE "${COCKATRICE_QT_VERSION_NAME}::Core") message(STATUS "COCKATRICE_QT_MODULES = ${COCKATRICE_QT_MODULES}")
endif()
message(STATUS "Found Qt ${${COCKATRICE_QT_VERSION_NAME}_VERSION} at: ${${COCKATRICE_QT_VERSION_NAME}_DIR}") 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()