1
0
Эх сурвалжийг харах

cmake,UI: Refactor find_qt macro

If QT_VERSION is not defined, it gets define with the AUTO value. And
its definition is moved to the helper file.

find_qt now:
- Check quietly for Qt5 and Qt6
- If QT_VERSION is set to AUTO. It checks firstly if Qt5 was found it
  will use it. If not it do the same for Qt6
- If QT_VERSION is set to 5 or 6, it checks if the choice was found and
  use it. And if not, it falls back to the other if found.
- If neither Qt5 or Qt6 are found, a fatal error is emitted.
- The macro saved the _QT_VERSION in the cache to replace QT_VERSION,
  so the process is not repeated each time that find_qt is used.
- When Qt::Gui is in the Linux component list, Qt::GuiPrivate is added.
  So using the versioned one is no longer required.
tytan652 3 жил өмнө
parent
commit
9c85ff8673

+ 0 - 1
.cmake-format.json

@@ -3,7 +3,6 @@
       "find_qt": {
         "flags": [],
         "kwargs": {
-          "VERSION": "+",
           "COMPONENTS": "+",
           "COMPONENTS_WIN": "+",
           "COMPONENTS_MACOS": "+",

+ 7 - 22
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)

+ 2 - 3
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 "")

+ 1 - 1
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)
 

+ 2 - 6
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)

+ 2 - 5
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)

+ 15 - 15
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")

+ 67 - 7
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()