From f88ad0e9d04aac2ef66367e1f661d15644cbf8a4 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Mon, 23 Sep 2019 17:58:34 +0200 Subject: [PATCH] CMake Build: Allow building with Qt5 and Qt6 Emulate Qt5's functions/targets with Qt6 equivalents. Change-Id: I6bfc5c8a649f0ddc5f1117bc5b2d0f41cb72c821 Reviewed-by: Alessandro Portale --- CMakeLists.txt | 12 ++-- cmake/FindQt5.cmake | 68 +++++++++++++++++++ cmake/QtCreatorAPI.cmake | 8 +-- .../components/navigator/navigatorview.cpp | 3 +- .../fileformat/qmlprojectitem.cpp | 2 +- src/shared/qtcreator_pch.h | 11 +++ 6 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 cmake/FindQt5.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index c047ca59d5a..c7e86cd6d8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,13 +30,17 @@ set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) if (WITH_TESTS) - set(_TEST_QT_COMPONENT Test) - set(_TEST_DEPENDS Qt5::Test) + set(QT_TEST_COMPONENT Test) + set(IMPLICIT_DEPENDS Qt5::Test) +endif() + +if (BUILD_WITH_PCH) + list(APPEND IMPLICIT_DEPENDS Qt5::Core) endif() find_package(Qt5 - COMPONENTS Concurrent Core LinguistTools Network PrintSupport Qml Quick - QuickWidgets Sql Widgets ${_TEST_QT_COMPONENT} + COMPONENTS Concurrent Core Gui LinguistTools Network PrintSupport Qml Quick + QuickWidgets Sql Widgets Xml ${QT_TEST_COMPONENT} REQUIRED ) diff --git a/cmake/FindQt5.cmake b/cmake/FindQt5.cmake new file mode 100644 index 00000000000..762ec8810c8 --- /dev/null +++ b/cmake/FindQt5.cmake @@ -0,0 +1,68 @@ +#.rst: +# FindQt5 +# ------- +# +# Qt5 wrapper around Qt6 CMake code. +# + +unset(__arguments) +if (Qt5_FIND_QUIETLY) + list(APPEND __arguments QUIET) +endif() +if (Qt5_FIND_REQUIRED) + list(APPEND __arguments REQUIRED) +endif() + +if (Qt5_FIND_COMPONENTS) + # for some reason QUIET doesn't really work when passed to the arguments list + if (Qt5_FIND_QUIETLY) + list(APPEND __arguments OPTIONAL_COMPONENTS) + else() + list(APPEND __arguments COMPONENTS) + endif() +endif() + +find_package(Qt6 CONFIG COMPONENTS Core QUIET) +if (NOT Qt6_FOUND) + find_package(Qt5 CONFIG ${__arguments} ${Qt5_FIND_COMPONENTS}) + + # Remove Qt6 from the not found packages in Qt5 mode + get_property(not_found_packages GLOBAL PROPERTY "PACKAGES_NOT_FOUND") + if(not_found_packages) + list(REMOVE_ITEM not_found_packages Qt6) + set_property(GLOBAL PROPERTY "PACKAGES_NOT_FOUND" "${not_found_packages}") + endif() + return() +else() + find_package(Qt6 CONFIG ${__arguments} ${Qt5_FIND_COMPONENTS}) +endif() + +foreach(comp IN LISTS Qt5_FIND_COMPONENTS) + if(TARGET Qt6::${comp}) + if (NOT TARGET Qt5::${comp}) + set_property(TARGET Qt6::${comp} PROPERTY IMPORTED_GLOBAL TRUE) + add_library(Qt5::${comp} ALIAS Qt6::${comp}) + endif() + if (TARGET Qt6::${comp}Private AND NOT TARGET Qt5::${comp}Private) + set_property(TARGET Qt6::${comp}Private PROPERTY IMPORTED_GLOBAL TRUE) + add_library(Qt5::${comp}Private ALIAS Qt6::${comp}Private) + endif() + endif() +endforeach() + +set(Qt5_FOUND ${Qt6_FOUND}) + +foreach(tool qmake lrelease) + if (TARGET Qt6::${tool} AND NOT TARGET Qt5::${tool}) + add_executable(Qt5::${tool} IMPORTED GLOBAL) + get_target_property(imported_location Qt6::${tool} IMPORTED_LOCATION_RELEASE) + set_target_properties(Qt5::${tool} PROPERTIES IMPORTED_LOCATION "${imported_location}") + endif() +endforeach() + +if (NOT DEFINED qt5_wrap_cpp) + function(qt5_wrap_cpp outfiles) + qt6_wrap_cpp(${outfiles} ${ARGN}) + set(${outfiles} ${${outfiles}} PARENT_SCOPE) + endfunction() +endif() diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index f6bade8d26b..8a729e9f5e8 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -415,7 +415,7 @@ function(add_qtc_library name) ) add_qtc_depends(${name} - PRIVATE ${_arg_DEPENDS} ${_TEST_DEPENDS} + PRIVATE ${_arg_DEPENDS} ${IMPLICIT_DEPENDS} PUBLIC ${_arg_PUBLIC_DEPENDS} ) @@ -626,7 +626,7 @@ function(add_qtc_plugin target_name) ) add_qtc_depends(${target_name} - PRIVATE ${_arg_DEPENDS} ${_DEP_PLUGINS} ${_TEST_DEPENDS} + PRIVATE ${_arg_DEPENDS} ${_DEP_PLUGINS} ${IMPLICIT_DEPENDS} PUBLIC ${_arg_PUBLIC_DEPENDS} ) @@ -799,7 +799,7 @@ function(add_qtc_executable name) add_executable("${name}" ${_arg_SOURCES}) target_include_directories("${name}" PRIVATE "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES}) target_compile_definitions("${name}" PRIVATE ${_arg_DEFINES} ${TEST_DEFINES} ${DEFAULT_DEFINES}) - target_link_libraries("${name}" PRIVATE ${_arg_DEPENDS} ${_TEST_DEPENDS}) + target_link_libraries("${name}" PRIVATE ${_arg_DEPENDS} ${IMPLICIT_DEPENDS}) set(skip_translation OFF) if (_arg_SKIP_TRANSLATION) @@ -846,7 +846,7 @@ function(add_qtc_test name) add_executable(${name} ${_arg_SOURCES}) add_qtc_depends(${name} - PRIVATE ${_arg_DEPENDS} ${_TEST_DEPENDS} + PRIVATE ${_arg_DEPENDS} ${IMPLICIT_DEPENDS} ) target_include_directories(${name} PRIVATE "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES}) diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index 57578d866f3..553baa8e24d 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -44,6 +44,7 @@ #include #include +#include #include #include @@ -442,7 +443,7 @@ void NavigatorView::changeSelection(const QItemSelection & /*newSelection*/, con } bool blocked = blockSelectionChangedSignal(true); - setSelectedModelNodes(nodeSet.toList()); + setSelectedModelNodes(Utils::toList(nodeSet)); blockSelectionChangedSignal(blocked); } diff --git a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp index bee96ae4111..91d8eff591e 100644 --- a/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp +++ b/src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp @@ -80,7 +80,7 @@ QStringList QmlProjectItem::files() const } } } - return files.toList(); + return Utils::toList(files); } /** diff --git a/src/shared/qtcreator_pch.h b/src/shared/qtcreator_pch.h index c17d9002a39..4988f3d9392 100644 --- a/src/shared/qtcreator_pch.h +++ b/src/shared/qtcreator_pch.h @@ -50,5 +50,16 @@ #include #include +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +#include +using Qt::endl; +using Qt::forcesign; +using Qt::noshowbase; +using Qt::dec; +using Qt::showbase; +using Qt::hex; +using Qt::noforcesign; +#endif + #include #endif