From 3a62f9e0c98d1cc311846394b744c8553ea9739c Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Thu, 6 May 2021 16:38:53 +0200 Subject: CMake: Resurrect test_import_plugins cmake build tests Now that we run tests for static Qt builds in the CI, it makes sense to restore the CMake build tests that check that static plugin importing works correctly. Resurrect the previously commented out test_import_plugins project and port the mockplugins qmake projects to CMake. mockplugins is a CMake project that uses the internal Qt CMake API to build and install some Qt modules and plugins. test_import_plugins depends on that test (via a CMake fixture) to build public projects that use those plugins. The installation of the mockplugins modules pollutes the Qt install prefix, but in the CI that only happens on the test VM, which means the release packages are not affected. Locally on a developer machine the Qt install path will be polluted, but it's not that much of a big deal. We could try and address that in a future change by using the QT_ADDITIONAL_PACKAGES_PREFIX_PATH functionality added for Conan to allow the installation of Qt packages into a non-standard prefix. Task-number: QTBUG-87580 Task-number: QTBUG-92933 Change-Id: I0841064a60a5ffba5118640d3197527a38ba6c30 Reviewed-by: Qt CI Bot Reviewed-by: Joerg Bornemann --- tests/auto/cmake/CMakeLists.txt | 26 +++++- tests/auto/cmake/mockplugins/.cmake.conf | 1 + tests/auto/cmake/mockplugins/CMakeLists.txt | 32 +++++++ .../cmake/mockplugins/mock1plugin/CMakeLists.txt | 9 ++ .../cmake/mockplugins/mock2plugin/CMakeLists.txt | 9 ++ .../cmake/mockplugins/mock3plugin/CMakeLists.txt | 9 ++ .../cmake/mockplugins/mock4plugin/CMakeLists.txt | 10 ++ .../cmake/mockplugins/mock5plugin/CMakeLists.txt | 10 ++ .../cmake/mockplugins/mock6plugin/CMakeLists.txt | 9 ++ .../cmake/mockplugins/mockplugins1/CMakeLists.txt | 9 ++ .../cmake/mockplugins/mockplugins1/configure.cmake | 2 + .../cmake/mockplugins/mockplugins2/CMakeLists.txt | 8 ++ .../cmake/mockplugins/mockplugins3/CMakeLists.txt | 9 ++ .../cmake/mockplugins/mockplugins3/configure.cmake | 2 + .../auto/cmake/test_import_plugins/CMakeLists.txt | 102 ++++++++++----------- tests/auto/cmake/test_import_plugins/check.cpp.in | 2 +- tests/auto/cmake/test_import_plugins/main.cpp | 4 +- 17 files changed, 194 insertions(+), 59 deletions(-) create mode 100644 tests/auto/cmake/mockplugins/.cmake.conf create mode 100644 tests/auto/cmake/mockplugins/CMakeLists.txt create mode 100644 tests/auto/cmake/mockplugins/mock1plugin/CMakeLists.txt create mode 100644 tests/auto/cmake/mockplugins/mock2plugin/CMakeLists.txt create mode 100644 tests/auto/cmake/mockplugins/mock3plugin/CMakeLists.txt create mode 100644 tests/auto/cmake/mockplugins/mock4plugin/CMakeLists.txt create mode 100644 tests/auto/cmake/mockplugins/mock5plugin/CMakeLists.txt create mode 100644 tests/auto/cmake/mockplugins/mock6plugin/CMakeLists.txt create mode 100644 tests/auto/cmake/mockplugins/mockplugins1/CMakeLists.txt create mode 100644 tests/auto/cmake/mockplugins/mockplugins1/configure.cmake create mode 100644 tests/auto/cmake/mockplugins/mockplugins2/CMakeLists.txt create mode 100644 tests/auto/cmake/mockplugins/mockplugins3/CMakeLists.txt create mode 100644 tests/auto/cmake/mockplugins/mockplugins3/configure.cmake (limited to 'tests/auto') diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt index 9e5195e723..ff3edf922a 100644 --- a/tests/auto/cmake/CMakeLists.txt +++ b/tests/auto/cmake/CMakeLists.txt @@ -221,8 +221,30 @@ if(NOT NO_WIDGETS) _qt_internal_test_expect_pass(test_QTBUG-63422) endif() -# FIXME: Needs porting of the qmake .pro files to create the modules and plugins in Qt6 CMake land. -# _qt_internal_test_expect_pass(test_import_plugins BINARY ${CMAKE_CTEST_COMMAND}) +# Find main Qt installation location and bin dir. +if(QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX) + set(qt_install_prefix "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}") +elseif(QT6_INSTALL_PREFIX) + set(qt_install_prefix "${QT6_INSTALL_PREFIX}") +endif() +if(INSTALL_BINDIR) + set(qt_install_bin_dir "${INSTALL_BINDIR}") +elseif(QT6_INSTALL_BINS) + set(qt_install_bin_dir "${QT6_INSTALL_BINS}") +endif() + +# Test building and installing a few dummy Qt modules and plugins. +_qt_internal_test_expect_pass(mockplugins + BINARY "${CMAKE_COMMAND}" + BINARY_ARGS + "-DQT_BUILD_DIR=${CMAKE_CURRENT_BINARY_DIR}/mockplugins" + -P "${qt_install_prefix}/${qt_install_bin_dir}/qt-cmake-private-install.cmake") +set_tests_properties(mockplugins PROPERTIES FIXTURES_SETUP build_mockplugins) + +# Test importing the plugins built in the project above. +_qt_internal_test_expect_pass(test_import_plugins BINARY ${CMAKE_CTEST_COMMAND} BINARY_ARGS -V) +set_tests_properties(test_import_plugins PROPERTIES FIXTURES_REQUIRED build_mockplugins) + _qt_internal_test_expect_pass(test_versionless_targets) _qt_internal_test_expect_pass(test_add_resources_binary_generated diff --git a/tests/auto/cmake/mockplugins/.cmake.conf b/tests/auto/cmake/mockplugins/.cmake.conf new file mode 100644 index 0000000000..4e73b3d607 --- /dev/null +++ b/tests/auto/cmake/mockplugins/.cmake.conf @@ -0,0 +1 @@ +set(QT_REPO_MODULE_VERSION "6.2.0") diff --git a/tests/auto/cmake/mockplugins/CMakeLists.txt b/tests/auto/cmake/mockplugins/CMakeLists.txt new file mode 100644 index 0000000000..c536cc3f09 --- /dev/null +++ b/tests/auto/cmake/mockplugins/CMakeLists.txt @@ -0,0 +1,32 @@ +# Generated from qtsvg.pro. + +cmake_minimum_required(VERSION 3.15.0) + +include(.cmake.conf) +project(QtMockPlugins + VERSION "${QT_REPO_MODULE_VERSION}" + DESCRIPTION "Qt MockPlugins Libraries" + HOMEPAGE_URL "https://qt.io/" + LANGUAGES CXX C +) + +# Make sure we only use latest private CMake API, aka no compatibility wrappers. +set(QT_NO_INTERNAL_COMPATIBILITY_FUNCTIONS TRUE) + +find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core) +find_package(Qt6 ${PROJECT_VERSION} QUIET CONFIG OPTIONAL_COMPONENTS Gui Widgets Xml) + +qt_build_repo_begin() + +add_subdirectory(mockplugins1) +add_subdirectory(mockplugins2) +add_subdirectory(mockplugins3) + +add_subdirectory(mock1plugin) +add_subdirectory(mock2plugin) +add_subdirectory(mock3plugin) +add_subdirectory(mock4plugin) +add_subdirectory(mock5plugin) +add_subdirectory(mock6plugin) + +qt_build_repo_end() diff --git a/tests/auto/cmake/mockplugins/mock1plugin/CMakeLists.txt b/tests/auto/cmake/mockplugins/mock1plugin/CMakeLists.txt new file mode 100644 index 0000000000..9443e15c56 --- /dev/null +++ b/tests/auto/cmake/mockplugins/mock1plugin/CMakeLists.txt @@ -0,0 +1,9 @@ +qt_internal_add_plugin(QMock1Plugin + CLASS_NAME QMock1Plugin + TYPE mockplugin + SOURCES + qmock1plugin.cpp qmock1plugin.h + PUBLIC_LIBRARIES + Qt::Core + Qt::MockPlugins1 +) diff --git a/tests/auto/cmake/mockplugins/mock2plugin/CMakeLists.txt b/tests/auto/cmake/mockplugins/mock2plugin/CMakeLists.txt new file mode 100644 index 0000000000..7e88d2ea84 --- /dev/null +++ b/tests/auto/cmake/mockplugins/mock2plugin/CMakeLists.txt @@ -0,0 +1,9 @@ +qt_internal_add_plugin(QMock2Plugin + CLASS_NAME QMock2Plugin + TYPE mockplugin + SOURCES + qmock2plugin.cpp qmock2plugin.h + PUBLIC_LIBRARIES + Qt::Core + Qt::MockPlugins1 +) diff --git a/tests/auto/cmake/mockplugins/mock3plugin/CMakeLists.txt b/tests/auto/cmake/mockplugins/mock3plugin/CMakeLists.txt new file mode 100644 index 0000000000..e58947d5e7 --- /dev/null +++ b/tests/auto/cmake/mockplugins/mock3plugin/CMakeLists.txt @@ -0,0 +1,9 @@ +qt_internal_add_plugin(QMock3Plugin + CLASS_NAME QMock3Plugin + TYPE mockplugin + SOURCES + qmock3plugin.cpp qmock3plugin.h + PUBLIC_LIBRARIES + Qt::Core + Qt::MockPlugins1 +) diff --git a/tests/auto/cmake/mockplugins/mock4plugin/CMakeLists.txt b/tests/auto/cmake/mockplugins/mock4plugin/CMakeLists.txt new file mode 100644 index 0000000000..f254f044d5 --- /dev/null +++ b/tests/auto/cmake/mockplugins/mock4plugin/CMakeLists.txt @@ -0,0 +1,10 @@ +qt_internal_add_plugin(QMock4Plugin + CLASS_NAME QMock4Plugin + TYPE mockplugin + DEFAULT_IF FALSE + SOURCES + qmock4plugin.cpp qmock4plugin.h + PUBLIC_LIBRARIES + Qt::Core + Qt::MockPlugins1 +) diff --git a/tests/auto/cmake/mockplugins/mock5plugin/CMakeLists.txt b/tests/auto/cmake/mockplugins/mock5plugin/CMakeLists.txt new file mode 100644 index 0000000000..a66f8955a0 --- /dev/null +++ b/tests/auto/cmake/mockplugins/mock5plugin/CMakeLists.txt @@ -0,0 +1,10 @@ +qt_internal_add_plugin(QMock5Plugin + CLASS_NAME QMock5Plugin + TYPE mockplugin + DEFAULT_IF FALSE + SOURCES + qmock5plugin.cpp qmock5plugin.h + PUBLIC_LIBRARIES + Qt::Core + Qt::MockPlugins3 +) diff --git a/tests/auto/cmake/mockplugins/mock6plugin/CMakeLists.txt b/tests/auto/cmake/mockplugins/mock6plugin/CMakeLists.txt new file mode 100644 index 0000000000..974b891704 --- /dev/null +++ b/tests/auto/cmake/mockplugins/mock6plugin/CMakeLists.txt @@ -0,0 +1,9 @@ +qt_internal_add_plugin(QMock6Plugin + CLASS_NAME QMock6Plugin + TYPE mockauxplugin + SOURCES + qmock6plugin.cpp qmock6plugin.h + PUBLIC_LIBRARIES + Qt::Core + Qt::MockPlugins3 +) diff --git a/tests/auto/cmake/mockplugins/mockplugins1/CMakeLists.txt b/tests/auto/cmake/mockplugins/mockplugins1/CMakeLists.txt new file mode 100644 index 0000000000..705885c7fa --- /dev/null +++ b/tests/auto/cmake/mockplugins/mockplugins1/CMakeLists.txt @@ -0,0 +1,9 @@ +qt_internal_add_module(MockPlugins1 + PLUGIN_TYPES mockplugin + SOURCES + fake.cpp + LIBRARIES + Qt::CorePrivate + PUBLIC_LIBRARIES + Qt::Core +) diff --git a/tests/auto/cmake/mockplugins/mockplugins1/configure.cmake b/tests/auto/cmake/mockplugins/mockplugins1/configure.cmake new file mode 100644 index 0000000000..46da2db2b8 --- /dev/null +++ b/tests/auto/cmake/mockplugins/mockplugins1/configure.cmake @@ -0,0 +1,2 @@ +# This is needed so that MODULE_PLUGIN_TYPES property is set on the exported target. +# Fun times. diff --git a/tests/auto/cmake/mockplugins/mockplugins2/CMakeLists.txt b/tests/auto/cmake/mockplugins/mockplugins2/CMakeLists.txt new file mode 100644 index 0000000000..9d406ef483 --- /dev/null +++ b/tests/auto/cmake/mockplugins/mockplugins2/CMakeLists.txt @@ -0,0 +1,8 @@ +qt_internal_add_module(MockPlugins2 + SOURCES + fake.cpp + LIBRARIES + Qt::CorePrivate + PUBLIC_LIBRARIES + Qt::Core +) diff --git a/tests/auto/cmake/mockplugins/mockplugins3/CMakeLists.txt b/tests/auto/cmake/mockplugins/mockplugins3/CMakeLists.txt new file mode 100644 index 0000000000..fc7c7aa944 --- /dev/null +++ b/tests/auto/cmake/mockplugins/mockplugins3/CMakeLists.txt @@ -0,0 +1,9 @@ +qt_internal_add_module(MockPlugins3 + PLUGIN_TYPES mockauxplugin + SOURCES + fake.cpp + LIBRARIES + Qt::CorePrivate + PUBLIC_LIBRARIES + Qt::Core +) diff --git a/tests/auto/cmake/mockplugins/mockplugins3/configure.cmake b/tests/auto/cmake/mockplugins/mockplugins3/configure.cmake new file mode 100644 index 0000000000..46da2db2b8 --- /dev/null +++ b/tests/auto/cmake/mockplugins/mockplugins3/configure.cmake @@ -0,0 +1,2 @@ +# This is needed so that MODULE_PLUGIN_TYPES property is set on the exported target. +# Fun times. diff --git a/tests/auto/cmake/test_import_plugins/CMakeLists.txt b/tests/auto/cmake/test_import_plugins/CMakeLists.txt index a793fe211d..3db7f012db 100644 --- a/tests/auto/cmake/test_import_plugins/CMakeLists.txt +++ b/tests/auto/cmake/test_import_plugins/CMakeLists.txt @@ -1,4 +1,3 @@ - cmake_minimum_required(VERSION 3.1) project(import_plugins_advanced) @@ -6,26 +5,9 @@ enable_testing() set(CMAKE_INCLUDE_CURRENT_DIR ON) -if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/FindPackageHints.cmake") - include("${CMAKE_CURRENT_LIST_DIR}/FindPackageHints.cmake") -endif() - -# Need to find Qt5Core explicitly because the MockPlugins1 and MockPlugins2 config files -# are in a different directory (the source dir) when doing a standalone tests build, -# whereas Core is in the installed directory, and due to NO_DEFAULT_PATH being used -# for the Core dependency call in Qt5MockPlugins, Core would not be found in the source -# dir. -find_package(Qt5 COMPONENTS Core REQUIRED HINTS ${Qt5Tests_PREFIX_PATH}) -get_target_property(qt_is_static Qt5::Core TYPE) - -# For a similar reason, we need to find the MockPlugins packages not via COMPONENTS argument, -# but directly, because the location of Qt5Config.cmake is in the installed dir, while -# the MockPlugins are in the source dir, and Qt5Config only looks for packages relative -# to its own location. -# The packages are still successfuly found, because the CMAKE_PREFIX_PATH populated by qmake -# contains both the installed Qt dir, and the Qt source dir. -find_package(Qt5MockPlugins1 REQUIRED HINTS ${Qt5Tests_PREFIX_PATH}) -find_package(Qt5MockPlugins2 REQUIRED HINTS ${Qt5Tests_PREFIX_PATH}) +find_package(Qt6 COMPONENTS REQUIRED MockPlugins1 MockPlugins2) +# MockPlugins3 is automatically find_dependency'd by QMock5Plugin which depends on MockPlugins3. +# QMock5Plugin itself is loaded by QtMockPlugins1Plugins.cmake. function(create_test_executable TARGET_NAME) set(CHECK_FILE ${CMAKE_BINARY_DIR}/${TARGET_NAME}_check.cpp) @@ -37,75 +19,87 @@ function(create_test_executable TARGET_NAME) configure_file("${CMAKE_SOURCE_DIR}/check.cpp.in" ${CHECK_FILE}) add_executable(${TARGET_NAME} main.cpp ${CHECK_FILE}) - target_link_libraries(${TARGET_NAME} Qt5::MockPlugins1) + target_link_libraries(${TARGET_NAME} PRIVATE Qt6::MockPlugins1) add_test(test_${TARGET_NAME} ${TARGET_NAME}) endfunction() -create_test_executable(default QMock1Plugin QMock2Plugin) -# No call to qt5_import_plugins() for the default +# No call to qt_import_plugins() for the default case. +create_test_executable(default + QMock1Plugin QMock2Plugin -# TODO This test is known to fail because CMake currently doesn't have a way to -# implement its own equivalent of the PLUGIN_EXTENDS mechanism at generate- -# time (meaning a library only gets linked if a set of other libraries are -# *also* linked.) CMake 3.14 or beyond may have such a mechanism, but until -# then, this test is expected to fail, because QMock3Plugin is not being -# linked even though MockPlugins2 is present. -create_test_executable(default_link QMock1Plugin QMock2Plugin QMock3Plugin) -target_link_libraries(default_link Qt5::MockPlugins2) -set_property(TEST test_default_link PROPERTY DISABLED 1) -# No call to qt5_import_plugins() for the default + QMock3Plugin # TODO: Should not be linked based on .pro file, see QTBUG-93501 +) + +# No call to qt_import_plugins() for the default_link case. +create_test_executable(default_link QMock1Plugin QMock2Plugin + + # TODO: in qmake QMock3Plugin should only be linked if the executable depends on MockPlugins2 + # module (based on .pro file PLUGIN_EXTENDS). Here it's accidentally linked because + # we're missing PLUGIN_EXTENDS information in CMake land. Thus it's considered + # a default plugin which is linked regardless of whether MockPlugins2 is linked. + # It's possible the qmake behavior is also wrong, because the qmake qt5 test seems to + # expect to link the plugin if both MockPlugins1 AND MockPlugins2 are linked, but qt.pf + # suggests that MockPlugins1 OR MockPlugins2 is sufficient to link the plugin, not both. + # See QTBUG-93501 + QMock3Plugin +) +target_link_libraries(default_link PRIVATE Qt6::MockPlugins2) create_test_executable(manual QMock1Plugin QMock2Plugin QMock3Plugin QMock4Plugin) -qt5_import_plugins(manual - INCLUDE Qt5::QMock3Plugin Qt5::QMock4Plugin +qt_import_plugins(manual + INCLUDE Qt6::QMock3Plugin Qt6::QMock4Plugin ) create_test_executable(manual_genex QMock1Plugin QMock2Plugin QMock3Plugin) -qt5_import_plugins(manual_genex - INCLUDE $<1:Qt5::QMock3Plugin> $<0:Qt5::QMock4Plugin> +qt_import_plugins(manual_genex + INCLUDE $<1:Qt6::QMock3Plugin> $<0:Qt6::QMock4Plugin> ) create_test_executable(blacklist QMock1Plugin) -qt5_import_plugins(blacklist - EXCLUDE Qt5::QMock2Plugin Qt5::QMock3Plugin +qt_import_plugins(blacklist + EXCLUDE Qt6::QMock2Plugin Qt6::QMock3Plugin ) create_test_executable(blacklist_genex QMock1Plugin) -qt5_import_plugins(blacklist_genex - EXCLUDE $<1:Qt5::QMock2Plugin> $<1:Qt5::QMock3Plugin> $<0:Qt5::QMock1Plugin> +qt_import_plugins(blacklist_genex + EXCLUDE $<1:Qt6::QMock2Plugin> $<1:Qt6::QMock3Plugin> $<0:Qt6::QMock1Plugin> ) create_test_executable(override QMock3Plugin QMock4Plugin) -qt5_import_plugins(override - INCLUDE_BY_TYPE mockplugin Qt5::QMock3Plugin Qt5::QMock4Plugin +qt_import_plugins(override + INCLUDE_BY_TYPE mockplugin Qt6::QMock3Plugin Qt6::QMock4Plugin ) create_test_executable(override_genex QMock3Plugin) -qt5_import_plugins(override_genex - INCLUDE_BY_TYPE mockplugin $<1:Qt5::QMock3Plugin> $<0:Qt5::QMock4Plugin> +qt_import_plugins(override_genex + INCLUDE_BY_TYPE mockplugin $<1:Qt6::QMock3Plugin> $<0:Qt6::QMock4Plugin> ) +get_target_property(prop_plugs override_genex QT_PLUGINS) +get_target_property(prop_types override_genex QT_PLUGINS_mockplugin) create_test_executable(override_mix QMock2Plugin QMock3Plugin) -qt5_import_plugins(override_mix - INCLUDE Qt5::QMock2Plugin - INCLUDE_BY_TYPE mockplugin Qt5::QMock3Plugin +qt_import_plugins(override_mix + INCLUDE Qt6::QMock2Plugin + INCLUDE_BY_TYPE mockplugin Qt6::QMock3Plugin ) if(NOT WIN32) # Compiling an empty static array fails on Windows. create_test_executable(none) - qt5_import_plugins(none + qt_import_plugins(none EXCLUDE_BY_TYPE mockplugin ) endif() create_test_executable(none_mix QMock3Plugin QMock4Plugin) -qt5_import_plugins(none_mix - INCLUDE Qt5::QMock3Plugin Qt5::QMock4Plugin +qt_import_plugins(none_mix + INCLUDE Qt6::QMock3Plugin Qt6::QMock4Plugin EXCLUDE_BY_TYPE mockplugin ) +# QMock5Plugin links against the Qt::MockPlugins3 module, which provides the default plugin +# QMock6Plugin which is why it is pulled in. create_test_executable(recursive QMock5Plugin QMock6Plugin) -qt5_import_plugins(recursive - INCLUDE_BY_TYPE mockplugin Qt5::QMock5Plugin +qt_import_plugins(recursive + INCLUDE_BY_TYPE mockplugin Qt6::QMock5Plugin ) diff --git a/tests/auto/cmake/test_import_plugins/check.cpp.in b/tests/auto/cmake/test_import_plugins/check.cpp.in index df6ea03d2d..6441ba4ad9 100644 --- a/tests/auto/cmake/test_import_plugins/check.cpp.in +++ b/tests/auto/cmake/test_import_plugins/check.cpp.in @@ -5,4 +5,4 @@ QString expectedPlugins[] = { @EXPECTED_PLUGINS@ }; -std::size_t numExpectedPlugins = sizeof(expectedPlugins) / sizeof(numExpectedPlugins); +std::size_t numExpectedPlugins = sizeof(expectedPlugins) / sizeof(*expectedPlugins); diff --git a/tests/auto/cmake/test_import_plugins/main.cpp b/tests/auto/cmake/test_import_plugins/main.cpp index 2918d557d9..2bb316368d 100644 --- a/tests/auto/cmake/test_import_plugins/main.cpp +++ b/tests/auto/cmake/test_import_plugins/main.cpp @@ -77,7 +77,7 @@ int main(int argc, char **argv) std::cerr << "Loaded plugins do not match what was expected!" << std::endl << "Expected plugins:" << std::endl; - QList expectedPluginList = expectedPluginSet.toList(); + QList expectedPluginList = expectedPluginSet.values(); expectedPluginList.sort(); for (QString plugin : expectedPluginList) { std::cerr << (actualPluginSet.contains(plugin) ? " " : "- ") @@ -86,7 +86,7 @@ int main(int argc, char **argv) std::cerr << std::endl << "Actual plugins:" << std::endl; - QList actualPluginList = actualPluginSet.toList(); + QList actualPluginList = actualPluginSet.values(); actualPluginList.sort(); for (QString plugin : actualPluginList) { std::cerr << (expectedPluginSet.contains(plugin) ? " " : "+ ") -- cgit v1.2.3