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.
master
tytan652 2022-07-21 20:15:49 +02:00
parent 64701a1cea
commit 9c85ff8673
8 changed files with 96 additions and 60 deletions

View File

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

View File

@ -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)

View File

@ -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 "")

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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")

View File

@ -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()