Improve Qt version detection.

- Set the default to "AUTO".

- For "AUTO", check for Qt6 first, then Qt5.

- Instead of linking to ${QT_NS}::WinMain, which doesn't exist on Qt6,
  just don't set QtX_NO_LINK_QTMAIN. (This works for Qt5, too.)
  - NOTE: Qt6 has QtEntryPoint instead.
This commit is contained in:
David Korth 2025-05-21 18:22:59 -04:00
parent 7f7f903d02
commit 71c41db758
3 changed files with 73 additions and 62 deletions

View File

@ -42,8 +42,8 @@ IF(INSTALL_DEBUG AND NOT SPLIT_DEBUG)
ENDIF(INSTALL_DEBUG AND NOT SPLIT_DEBUG)
# Qt version
SET(QT_VERSION 5 CACHE STRING "Qt version to use. (default is 5)")
SET_PROPERTY(CACHE QT_VERSION PROPERTY STRINGS 5 6)
SET(QT_VERSION AUTO CACHE STRING "Qt version to use (default is 'AUTO' to auto-detect Qt6 or Qt5)")
SET_PROPERTY(CACHE QT_VERSION PROPERTY STRINGS AUTO 6 5)
# Translations
OPTION(ENABLE_NLS "Enable NLS using Qt's built-in localization system." ON)

View File

@ -2,40 +2,49 @@
PROJECT(locale)
# rvthtool translations subproject.
SET(FOUND_LinguistTools NO)
IF(QT_VERSION EQUAL 5)
FIND_PACKAGE(Qt5 COMPONENTS Core LinguistTools)
IF(Qt5_FOUND AND Qt5Core_FOUND AND Qt5LinguistTools_FOUND)
# Found Qt5.
ELSE()
# Did not find Qt5.
MESSAGE(WARNING "Qt5 not found. Not building localization files.")
SET(ENABLE_NLS OFF)
ENDIF()
IF(QT_VERSION STREQUAL AUTO)
SET(FIND_QT_QUIET QUIET)
ENDIF(QT_VERSION STREQUAL AUTO)
# Qt 5.15/6 has qt_add_translation
# We can't depend on having Qt 5.15, though.
IF(NOT COMMAND QT_ADD_TRANSLATION)
FUNCTION(QT_ADD_TRANSLATION _qm_files)
QT5_ADD_TRANSLATION("${_qm_files}" ${ARGN})
SET("${_qm_files}" "${${_qm_files}}" PARENT_SCOPE)
ENDFUNCTION(QT_ADD_TRANSLATION)
ENDIF(NOT COMMAND QT_ADD_TRANSLATION)
ELSEIF(QT_VERSION EQUAL 6)
FIND_PACKAGE(Qt6 COMPONENTS Core LinguistTools)
IF(QT_VERSION STREQUAL AUTO OR QT_VERSION EQUAL 6)
FIND_PACKAGE(Qt6 ${FIND_QT_QUIET} COMPONENTS Core LinguistTools)
IF(Qt6_FOUND AND Qt6Core_FOUND AND Qt6LinguistTools_FOUND)
# Found Qt6.
ELSE()
# Did not find Qt6.
MESSAGE(WARNING "Qt6 not found. Not building localization files.")
SET(ENABLE_NLS OFF)
SET(FOUND_LinguistTools YES)
ENDIF()
ELSE()
MESSAGE(FATAL_ERROR "Unsupported Qt version: ${QT_VERSION}")
ENDIF()
ENDIF(QT_VERSION STREQUAL AUTO OR QT_VERSION EQUAL 6)
IF(NOT FOUND_LinguistTools AND (QT_VERSION STREQUAL AUTO OR QT_VERSION EQUAL 5))
FIND_PACKAGE(Qt5 ${FIND_QT_QUIET} COMPONENTS Core LinguistTools)
IF(Qt5_FOUND AND Qt5Core_FOUND AND Qt5LinguistTools_FOUND)
# Found Qt5.
SET(FOUND_LinguistTools YES)
ENDIF()
ENDIF(NOT FOUND_LinguistTools AND (QT_VERSION STREQUAL AUTO OR QT_VERSION EQUAL 5))
IF(NOT FOUND_LinguistTools)
IF(QT_VERSION STREQUAL AUTO)
MESSAGE(WARNING "A supported version of Qt (5, 6) was not found.\nNot building localizations.")
ELSE()
# TODO: FATAL_ERROR because a Qt version was explicitly specified?
MESSAGE(WARNING "Qt${QT_VERSION} was not found.\nNot building localizations")
ENDIF()
SET(ENABLE_NLS OFF)
ENDIF(NOT FOUND_LinguistTools)
IF(ENABLE_NLS)
# Qt 5.15/6 has qt_add_translation
# We can't depend on having Qt 5.15, though.
IF(NOT COMMAND QT_ADD_TRANSLATION)
FUNCTION(QT_ADD_TRANSLATION _qm_files)
QT5_ADD_TRANSLATION("${_qm_files}" ${ARGN})
SET("${_qm_files}" "${${_qm_files}}" PARENT_SCOPE)
ENDFUNCTION(QT_ADD_TRANSLATION)
ENDIF(NOT COMMAND QT_ADD_TRANSLATION)
# Compile the translations.
SET(TRANSLATION_FILES
rvthtool_de.ts

View File

@ -4,12 +4,36 @@ PROJECT(qrvthtool LANGUAGES CXX)
# Main binary directory. Needed for git_version.h
INCLUDE_DIRECTORIES("${CMAKE_BINARY_DIR}")
IF(QT_VERSION EQUAL 5)
IF(QT_VERSION STREQUAL AUTO)
SET(FIND_QT_QUIET QUIET)
ENDIF(QT_VERSION STREQUAL AUTO)
IF(QT_VERSION STREQUAL AUTO OR QT_VERSION EQUAL 6)
# Find Qt6.
FIND_PACKAGE(Qt6 6.0.0 ${FIND_QT_QUIET} COMPONENTS Core Gui Widgets)
IF(Qt6_FOUND AND Qt6Core_FOUND AND Qt6Gui_FOUND AND Qt6Widgets_FOUND)
# Found Qt6.
SET(BUILD_QT ON)
SET(OUR_QT_VERSION 6)
SET(QT_NS Qt6)
SET(KF_NS KF6)
IF(ENABLE_DBUS)
# QtDBus is used for DockManager.
FIND_PACKAGE(Qt6DBus)
SET(HAVE_QtDBus ${Qt6DBus_FOUND})
ENDIF(ENABLE_DBUS)
ENDIF()
# Minimum ECM version for KF6.
SET(KF_MIN 5.248.0)
SET(ECM_MINIMUM_VERSION ${KF_MIN})
ENDIF(QT_VERSION STREQUAL AUTO OR QT_VERSION EQUAL 6)
IF(NOT BUILD_QT AND (QT_VERSION STREQUAL AUTO OR QT_VERSION EQUAL 5))
# Find Qt5.
# FIXME: Figure out a minimum Qt5 version.
# QtWin::fromHICON was added in Qt 5.2.
SET(Qt5_NO_LINK_QTMAIN 1)
FIND_PACKAGE(Qt5 5.2.0 COMPONENTS Core Gui Widgets)
FIND_PACKAGE(Qt5 5.2.0 ${FIND_QT_QUIET} COMPONENTS Core Gui Widgets)
IF(Qt5_FOUND AND Qt5Core_FOUND AND Qt5Gui_FOUND AND Qt5Widgets_FOUND)
# Found Qt5.
SET(BUILD_QT ON)
@ -20,9 +44,6 @@ IF(QT_VERSION EQUAL 5)
FIND_PACKAGE(Qt5DBus)
SET(HAVE_QtDBus ${Qt5DBus_FOUND})
ENDIF(ENABLE_DBUS)
ELSE()
# Did not find Qt5.
MESSAGE(WARNING "Qt5 not found. Not building qrvthtool.")
ENDIF()
# Qt 5.15/6 has qt_wrap_cpp.
@ -49,31 +70,16 @@ IF(QT_VERSION EQUAL 5)
# Minimum ECM version for KF5.
UNSET(KF_MIN)
SET(ECM_MINIMUM_VERSION 0.0.11)
ELSEIF(QT_VERSION EQUAL 6)
# Find Qt6.
SET(Qt6_NO_LINK_QTMAIN 1)
FIND_PACKAGE(Qt6 6.0.0 COMPONENTS Core Gui Widgets)
IF(Qt6_FOUND AND Qt6Core_FOUND AND Qt6Gui_FOUND AND Qt6Widgets_FOUND)
# Found Qt6.
SET(BUILD_QT ON)
SET(QT_NS Qt6)
SET(KF_NS KF6)
IF(ENABLE_DBUS)
# QtDBus is used for DockManager.
FIND_PACKAGE(Qt6DBus)
SET(HAVE_QtDBus ${Qt6DBus_FOUND})
ENDIF(ENABLE_DBUS)
ELSE()
# Did not find Qt6.
MESSAGE(WARNING "Qt6 not found. Not building qrvthtool.")
ENDIF()
ENDIF(NOT BUILD_QT AND (QT_VERSION STREQUAL AUTO OR QT_VERSION EQUAL 5))
# Minimum ECM version for KF6.
SET(KF_MIN 5.248.0)
SET(ECM_MINIMUM_VERSION ${KF_MIN})
ELSE()
MESSAGE(FATAL_ERROR "Unsupported Qt version: ${QT_VERSION}")
ENDIF()
IF(NOT BUILD_QT)
IF(QT_VERSION STREQUAL AUTO)
MESSAGE(WARNING "A supported version of Qt (5, 6) was not found.\nNot building qrvthtool.")
ELSE()
# TODO: FATAL_ERROR because a Qt version was explicitly specified?
MESSAGE(WARNING "Qt${QT_VERSION} was not found.\nNot building qrvthtool.")
ENDIF()
ENDIF(NOT BUILD_QT)
IF(BUILD_QT)
@ -301,10 +307,6 @@ TARGET_LINK_LIBRARIES(qrvthtool PRIVATE ${QT_NS}::Widgets ${QT_NS}::Gui ${QT_NS}
IF(ENABLE_DBUS AND HAVE_QtDBus)
TARGET_LINK_LIBRARIES(qrvthtool PRIVATE ${QT_NS}::DBus)
ENDIF(ENABLE_DBUS AND HAVE_QtDBus)
# FIXME: Not available on Qt6; not needed on Qt5 either?
IF(WIN32 AND QT_VERSION EQUAL 5)
TARGET_LINK_LIBRARIES(qrvthtool PRIVATE ${QT_NS}::WinMain)
ENDIF(WIN32 AND QT_VERSION EQUAL 5)
IF(CMAKE_THREAD_LIBS_INIT)
TARGET_LINK_LIBRARIES(qrvthtool PRIVATE ${CMAKE_THREAD_LIBS_INIT})