diff --git a/.cmake-format.json b/.cmake-format.json index 0ccd9bf0a..7e5f23697 100644 --- a/.cmake-format.json +++ b/.cmake-format.json @@ -3,7 +3,6 @@ "find_qt": { "flags": [], "kwargs": { - "VERSION": "+", "COMPONENTS": "+", "COMPONENTS_WIN": "+", "COMPONENTS_MACOS": "+", diff --git a/UI/CMakeLists.txt b/UI/CMakeLists.txt index da127fa56..8e25b0d6c 100644 --- a/UI/CMakeLists.txt +++ b/UI/CMakeLists.txt @@ -6,13 +6,6 @@ if(NOT ENABLE_UI) return() endif() -if(NOT QT_VERSION) - set(QT_VERSION - "5" - CACHE STRING "OBS Qt version [5, 6]" FORCE) - set_property(CACHE QT_VERSION PROPERTY STRINGS 5 6) -endif() - project(obs) # Legacy support @@ -78,16 +71,7 @@ find_package(CURL REQUIRED) add_subdirectory(frontend-plugins) add_executable(obs) -set(UI_COMPONENTS_WIN "") -if(QT_VERSION EQUAL 5) - set(UI_COMPONENTS_WIN "WinExtras") -endif() - -find_qt( - VERSION ${QT_VERSION} - COMPONENTS Widgets Network Svg Xml - COMPONENTS_WIN ${UI_COMPONENTS_WIN} - COMPONENTS_LINUX Gui) +find_qt(COMPONENTS Widgets Network Svg Xml COMPONENTS_LINUX Gui) target_link_libraries(obs PRIVATE Qt::Widgets Qt::Svg Qt::Xml Qt::Network) @@ -352,12 +336,13 @@ if(OS_WINDOWS) win-update/win-update-helpers.hpp ${CMAKE_BINARY_DIR}/obs.rc) - if(QT_VERSION EQUAL 5) - target_link_libraries(obs PRIVATE crypt32 OBS::blake2 Qt::WinExtras) - else() - target_link_libraries(obs PRIVATE crypt32 OBS::blake2) + if(_QT_VERSION EQUAL 5) + find_qt(COMPONENTS WinExtras) + target_link_libraries(obs PRIVATE Qt::WinExtras) endif() + target_link_libraries(obs PRIVATE crypt32 OBS::blake2) + target_compile_features(obs PRIVATE cxx_std_17) target_compile_definitions( @@ -441,7 +426,7 @@ elseif(OS_MACOS) elseif(OS_POSIX) target_sources(obs PRIVATE platform-x11.cpp) - target_link_libraries(obs PRIVATE Qt${QT_VERSION}::GuiPrivate) + target_link_libraries(obs PRIVATE Qt::GuiPrivate) if(TARGET obspython) find_package(Python REQUIRED COMPONENTS Interpreter Development) diff --git a/UI/frontend-plugins/aja-output-ui/CMakeLists.txt b/UI/frontend-plugins/aja-output-ui/CMakeLists.txt index 36f1a98b8..605cf424b 100644 --- a/UI/frontend-plugins/aja-output-ui/CMakeLists.txt +++ b/UI/frontend-plugins/aja-output-ui/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(LibAJANTV2 REQUIRED) add_library(aja-output-ui MODULE) add_library(OBS::aja-output-ui ALIAS aja-output-ui) -find_qt(VERSION ${QT_VERSION} COMPONENTS Widgets) +find_qt(COMPONENTS Widgets) set_target_properties( aja-output-ui @@ -78,8 +78,7 @@ elseif(OS_WINDOWS) target_link_options(aja-output-ui PRIVATE "LINKER:/IGNORE:4099") else() find_package(X11 REQUIRED) - target_link_libraries(aja-output-ui PRIVATE X11::X11 - Qt${QT_VERSION}::GuiPrivate) + target_link_libraries(aja-output-ui PRIVATE X11::X11 Qt::GuiPrivate) endif() set_target_properties(aja-output-ui PROPERTIES FOLDER "frontend" PREFIX "") diff --git a/UI/frontend-plugins/decklink-captions/CMakeLists.txt b/UI/frontend-plugins/decklink-captions/CMakeLists.txt index 9f8b5a0e4..1d36b2ed7 100644 --- a/UI/frontend-plugins/decklink-captions/CMakeLists.txt +++ b/UI/frontend-plugins/decklink-captions/CMakeLists.txt @@ -7,7 +7,7 @@ endif() add_library(decklink-captions MODULE) add_library(OBS::decklink-captions ALIAS decklink-captions) -find_qt(VERSION ${QT_VERSION} COMPONENTS Widgets) +find_qt(COMPONENTS Widgets) target_link_libraries(decklink-captions PRIVATE Qt::Widgets) diff --git a/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt b/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt index cfc929bb2..909bf1d98 100644 --- a/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt +++ b/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt @@ -7,10 +7,7 @@ endif() add_library(decklink-output-ui MODULE) add_library(OBS::decklink-output-ui ALIAS decklink-output-ui) -find_qt( - VERSION ${QT_VERSION} - COMPONENTS Widgets - COMPONENTS_LINUX Gui) +find_qt(COMPONENTS Widgets COMPONENTS_LINUX Gui) set_target_properties( decklink-output-ui @@ -63,8 +60,7 @@ elseif(OS_MACOS) elseif(OS_POSIX) find_package(X11 REQUIRED) - target_link_libraries(decklink-output-ui PRIVATE X11::X11 - Qt${QT_VERSION}::GuiPrivate) + target_link_libraries(decklink-output-ui PRIVATE X11::X11 Qt::GuiPrivate) endif() get_target_property(_SOURCES decklink-output-ui SOURCES) diff --git a/UI/frontend-plugins/frontend-tools/CMakeLists.txt b/UI/frontend-plugins/frontend-tools/CMakeLists.txt index e7d78558d..8fd311adb 100644 --- a/UI/frontend-plugins/frontend-tools/CMakeLists.txt +++ b/UI/frontend-plugins/frontend-tools/CMakeLists.txt @@ -3,10 +3,7 @@ project(frontend-tools) add_library(frontend-tools MODULE) add_library(OBS::frontend-tools ALIAS frontend-tools) -find_qt( - VERSION ${QT_VERSION} - COMPONENTS Widgets - COMPONENTS_LINUX Gui) +find_qt(COMPONENTS Widgets COMPONENTS_LINUX Gui) set_target_properties( frontend-tools @@ -49,7 +46,7 @@ target_link_libraries(frontend-tools PRIVATE OBS::frontend-api OBS::libobs Qt::Widgets) if(OS_POSIX AND NOT OS_MACOS) - target_link_libraries(frontend-tools PRIVATE Qt${QT_VERSION}::GuiPrivate) + target_link_libraries(frontend-tools PRIVATE Qt::GuiPrivate) endif() if(ENABLE_SCRIPTING AND TARGET OBS::scripting) diff --git a/cmake/Modules/CopyMSVCBins.cmake b/cmake/Modules/CopyMSVCBins.cmake index fb3f582d3..fe8217be9 100644 --- a/cmake/Modules/CopyMSVCBins.cmake +++ b/cmake/Modules/CopyMSVCBins.cmake @@ -179,7 +179,7 @@ file(GLOB RNNOISE_BIN_FILES "${RNNOISE_INCLUDE_DIR}/../bin${_bin_suffix}/rnnoise*.dll" "${RNNOISE_INCLUDE_DIR}/../bin/rnnoise*.dll") -set(QtCore_DIR "${Qt${QT_VERSION}Core_DIR}") +set(QtCore_DIR "${Qt${_QT_VERSION}Core_DIR}") cmake_path(SET QtCore_DIR_NORM NORMALIZE "${QtCore_DIR}/../../..") set(QtCore_BIN_DIR "${QtCore_DIR_NORM}bin") set(QtCore_PLUGIN_DIR "${QtCore_DIR_NORM}plugins") @@ -189,13 +189,13 @@ obs_status(STATUS "QtCore_PLUGIN_DIR: ${QtCore_PLUGIN_DIR}") file( GLOB QT_DEBUG_BIN_FILES - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Cored.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Guid.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Widgetsd.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}WinExtrasd.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Svgd.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Xmld.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Networkd.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Cored.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Guid.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Widgetsd.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}WinExtrasd.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Svgd.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Xmld.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Networkd.dll" "${QtCore_BIN_DIR}/libGLESv2d.dll" "${QtCore_BIN_DIR}/libEGLd.dll") file(GLOB QT_DEBUG_PLAT_BIN_FILES @@ -214,13 +214,13 @@ file( file( GLOB QT_BIN_FILES - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Core.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Gui.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Widgets.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}WinExtras.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Svg.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Xml.dll" - "${QtCore_BIN_DIR}/Qt${QT_VERSION}Network.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Core.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Gui.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Widgets.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}WinExtras.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Svg.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Xml.dll" + "${QtCore_BIN_DIR}/Qt${_QT_VERSION}Network.dll" "${QtCore_BIN_DIR}/libGLESv2.dll" "${QtCore_BIN_DIR}/libEGL.dll") file(GLOB QT_PLAT_BIN_FILES "${QtCore_PLUGIN_DIR}/platforms/qwindows.dll") diff --git a/cmake/Modules/ObsHelpers.cmake b/cmake/Modules/ObsHelpers.cmake index e367915c4..b799b8f00 100644 --- a/cmake/Modules/ObsHelpers.cmake +++ b/cmake/Modules/ObsHelpers.cmake @@ -337,38 +337,98 @@ function(define_graphic_modules target) endforeach() endfunction() +if(NOT QT_VERSION) + set(QT_VERSION + AUTO + CACHE STRING "OBS Qt version [AUTO, 5, 6]" FORCE) + set_property(CACHE QT_VERSION PROPERTY STRINGS AUTO 5 6) +endif() + macro(find_qt) - set(oneValueArgs VERSION) set(multiValueArgs COMPONENTS COMPONENTS_WIN COMPONENTS_MAC COMPONENTS_LINUX) cmake_parse_arguments(FIND_QT "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + set(QT_NO_CREATE_VERSIONLESS_TARGETS ON) + find_package( + Qt5 + COMPONENTS Core + QUIET) + find_package( + Qt6 + COMPONENTS Core + QUIET) + + if(NOT _QT_VERSION AND QT_VERSION STREQUAL AUTO) + if(TARGET Qt5::Core) + set(_QT_VERSION + 5 + CACHE INTERNAL "") + elseif(TARGET Qt6::Core) + set(_QT_VERSION + 6 + CACHE INTERNAL "") + endif() + elseif(NOT _QT_VERSION) + if(TARGET Qt${QT_VERSION}::Core) + set(_QT_VERSION + ${QT_VERSION} + CACHE INTERNAL "") + else() + if(QT_VERSION EQUAL 6) + set(FALLBACK_QT_VERSION 5) + else() + set(FALLBACK_QT_VERSION 6) + endif() + message( + WARNING + "Qt${QT_VERSION} was not found, falling back to Qt${FALLBACK_QT_VERSION}" + ) + + if(TARGET Qt${FALLBACK_QT_VERSION}::Core) + set(_QT_VERSION + ${FALLBACK_QT_VERSION} + CACHE INTERNAL "") + endif() + endif() + endif() + + set(QT_NO_CREATE_VERSIONLESS_TARGETS OFF) + + if(NOT _QT_VERSION) + message(FATAL_ERROR "Neither Qt5 or Qt6 were found") + endif() if(OS_WINDOWS) find_package( - Qt${FIND_QT_VERSION} + Qt${_QT_VERSION} COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_WIN} REQUIRED) elseif(OS_MACOS) find_package( - Qt${FIND_QT_VERSION} + Qt${_QT_VERSION} COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_MAC} REQUIRED) else() find_package( - Qt${FIND_QT_VERSION} + Qt${_QT_VERSION} COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_LINUX} REQUIRED) endif() + list(APPEND FIND_QT_COMPONENTS "Core") + + if("Gui" IN_LIST FIND_QT_COMPONENTS_LINUX) + list(APPEND FIND_QT_COMPONENTS_LINUX "GuiPrivate") + endif() + foreach(_COMPONENT IN LISTS FIND_QT_COMPONENTS FIND_QT_COMPONENTS_WIN FIND_QT_COMPONENTS_MAC FIND_QT_COMPONENTS_LINUX) - if(NOT TARGET Qt::${_COMPONENT} AND TARGET - Qt${FIND_QT_VERSION}::${_COMPONENT}) + if(NOT TARGET Qt::${_COMPONENT} AND TARGET Qt${_QT_VERSION}::${_COMPONENT}) add_library(Qt::${_COMPONENT} INTERFACE IMPORTED) set_target_properties( Qt::${_COMPONENT} PROPERTIES INTERFACE_LINK_LIBRARIES - "Qt${FIND_QT_VERSION}::${_COMPONENT}") + "Qt${_QT_VERSION}::${_COMPONENT}") endif() endforeach() endmacro()