diff options
author | Cristian Le <[email protected]> | 2025-01-28 14:35:55 +0100 |
---|---|---|
committer | Cristian Le <[email protected]> | 2025-02-25 22:09:42 +0100 |
commit | 39e7946cb6562c6f9b1baf5c44b1694922d0538e (patch) | |
tree | 62900c8b53aec6f80b352136d925788e73a83eb7 | |
parent | 2433d02856bb55150d62d84b71b7d8a90c0ce81f (diff) |
Bundle Kitware's RunCMake test module
Introduce a new module `TestInternalPrivate`.
Kitware's RunCMake allows to create more granular unit tests using
`cmake -P` scripts instead of configuring, generating and building full
projects.
[ChangeLog][Third-Party Code]
Add upstream cmake's RunCMake test infrastructure module to
src/testinternal/3rdparty/cmake to aid in creation of cmake auto-tests.
Pick-to: 6.8 6.9
Change-Id: I08cb7c6dc6f61bde29f176d58295f4f660b34ca8
Reviewed-by: Alexandru Croitor <[email protected]>
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/testinternal/3rdparty/cmake/Copyright.txt | 136 | ||||
-rw-r--r-- | src/testinternal/3rdparty/cmake/QtRunCMakeTestHelpers.cmake | 37 | ||||
-rw-r--r-- | src/testinternal/3rdparty/cmake/REUSE.toml | 6 | ||||
-rw-r--r-- | src/testinternal/3rdparty/cmake/RunCMake.cmake | 354 | ||||
-rw-r--r-- | src/testinternal/3rdparty/cmake/qt_attribution.json | 15 | ||||
-rw-r--r-- | src/testinternal/CMakeLists.txt | 31 | ||||
-rw-r--r-- | tests/auto/cmake/CMakeLists.txt | 4 | ||||
-rw-r--r-- | tests/auto/cmake/RunCMake/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/auto/cmake/RunCMake/README.md | 15 |
10 files changed, 599 insertions, 1 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index afcdd1f463e..babf5bc31d2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -86,6 +86,7 @@ if(QT_FEATURE_gui) add_subdirectory(platformsupport) endif() if (QT_FEATURE_testlib) + add_subdirectory(testinternal) add_subdirectory(testlib) endif() if(QT_FEATURE_printsupport) diff --git a/src/testinternal/3rdparty/cmake/Copyright.txt b/src/testinternal/3rdparty/cmake/Copyright.txt new file mode 100644 index 00000000000..2074109b019 --- /dev/null +++ b/src/testinternal/3rdparty/cmake/Copyright.txt @@ -0,0 +1,136 @@ +CMake - Cross Platform Makefile Generator +Copyright 2000-2024 Kitware, Inc. and Contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of Kitware, Inc. nor the names of Contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +------------------------------------------------------------------------------ + +The following individuals and institutions are among the Contributors: + +* Aaron C. Meadows <[email protected]> +* Adriaan de Groot <[email protected]> +* Aleksey Avdeev <[email protected]> +* Alexander Neundorf <[email protected]> +* Alexander Smorkalov <[email protected]> +* Alexey Sokolov <[email protected]> +* Alex Merry <[email protected]> +* Alex Turbov <[email protected]> +* Andreas Pakulat <[email protected]> +* Andreas Schneider <[email protected]> +* André Rigland Brodtkorb <[email protected]> +* Axel Huebl, Helmholtz-Zentrum Dresden - Rossendorf +* Benjamin Eikel +* Bjoern Ricks <[email protected]> +* Brad Hards <[email protected]> +* Christopher Harvey +* Christoph Grüninger <[email protected]> +* Clement Creusot <[email protected]> +* Daniel Blezek <[email protected]> +* Daniel Pfeifer <[email protected]> +* Dawid Wróbel <[email protected]> +* Enrico Scholz <[email protected]> +* Eran Ifrah <[email protected]> +* Esben Mose Hansen, Ange Optimization ApS +* Geoffrey Viola <[email protected]> +* Google Inc +* Gregor Jasny +* Helio Chissini de Castro <[email protected]> +* Ilya Lavrenov <[email protected]> +* Insight Software Consortium <insightsoftwareconsortium.org> +* Intel Corporation <www.intel.com> +* Jan Woetzel +* Jordan Williams <[email protected]> +* Julien Schueller +* Kelly Thompson <[email protected]> +* Konstantin Podsvirov <[email protected]> +* Laurent Montel <[email protected]> +* Mario Bensi <[email protected]> +* Martin Gräßlin <[email protected]> +* Mathieu Malaterre <[email protected]> +* Matthaeus G. Chajdas +* Matthias Kretz <[email protected]> +* Matthias Maennich <[email protected]> +* Michael Hirsch, Ph.D. <www.scivision.co> +* Michael Stürmer +* Miguel A. Figueroa-Villanueva +* Mike Durso <[email protected]> +* Mike Jackson +* Mike McQuaid <[email protected]> +* Nicolas Bock <[email protected]> +* Nicolas Despres <[email protected]> +* Nikita Krupen'ko <[email protected]> +* NVIDIA Corporation <www.nvidia.com> +* OpenGamma Ltd. <opengamma.com> +* Patrick Stotko <[email protected]> +* Per Øyvind Karlsen <[email protected]> +* Peter Collingbourne <[email protected]> +* Petr Gotthard <[email protected]> +* Philip Lowman <[email protected]> +* Philippe Proulx <[email protected]> +* Raffi Enficiaud, Max Planck Society +* Raumfeld <raumfeld.com> +* Roger Leigh <[email protected]> +* Rolf Eike Beer <[email protected]> +* Roman Donchenko <[email protected]> +* Roman Kharitonov <[email protected]> +* Ruslan Baratov +* Sebastian Holtermann <[email protected]> +* Stephen Kelly <[email protected]> +* Sylvain Joubert <[email protected]> +* The Qt Company Ltd. +* Thomas Sondergaard <[email protected]> +* Tobias Hunger <[email protected]> +* Todd Gamblin <[email protected]> +* Tristan Carel +* University of Dundee +* Vadim Zhukov +* Will Dicharry <[email protected]> + +See version control history for details of individual contributions. + +The above copyright and license notice applies to distributions of +CMake in source and binary form. Third-party software packages supplied +with CMake under compatible licenses provide their own copyright notices +documented in corresponding subdirectories or source files. + +------------------------------------------------------------------------------ + +CMake was initially developed by Kitware with the following sponsorship: + + * National Library of Medicine at the National Institutes of Health + as part of the Insight Segmentation and Registration Toolkit (ITK). + + * US National Labs (Los Alamos, Livermore, Sandia) ASC Parallel + Visualization Initiative. + + * National Alliance for Medical Image Computing (NAMIC) is funded by the + National Institutes of Health through the NIH Roadmap for Medical Research, + Grant U54 EB005149. + + * Kitware, Inc. diff --git a/src/testinternal/3rdparty/cmake/QtRunCMakeTestHelpers.cmake b/src/testinternal/3rdparty/cmake/QtRunCMakeTestHelpers.cmake new file mode 100644 index 00000000000..cc3cff95c7c --- /dev/null +++ b/src/testinternal/3rdparty/cmake/QtRunCMakeTestHelpers.cmake @@ -0,0 +1,37 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. +# +# Original file location was Tests/RunCMake/CMakeLists.txt + +set(RunCMakeDir ${CMAKE_CURRENT_LIST_DIR}) + +macro(add_RunCMake_test test) + set(TEST_ARGS ${ARGN}) + if ("${ARGV1}" STREQUAL "TEST_DIR") + if ("${ARGV2}" STREQUAL "") + message(FATAL_ERROR "Invalid args") + endif() + set(Test_Dir ${ARGV2}) + list(REMOVE_AT TEST_ARGS 0) + list(REMOVE_AT TEST_ARGS 0) + else() + set(Test_Dir ${test}) + endif() + if(CMAKE_C_COMPILER_ID STREQUAL "LCC") + list(APPEND TEST_ARGS -DRunCMake_TEST_LCC=1) + endif() + add_test(NAME RunCMake.${test} COMMAND ${CMAKE_COMMAND} + -DCMAKE_MODULE_PATH=${RunCMakeDir} + -DRunCMake_GENERATOR_IS_MULTI_CONFIG=${_isMultiConfig} + -DRunCMake_GENERATOR=${CMAKE_GENERATOR} + -DRunCMake_GENERATOR_INSTANCE=${CMAKE_GENERATOR_INSTANCE} + -DRunCMake_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM} + -DRunCMake_GENERATOR_TOOLSET=${CMAKE_GENERATOR_TOOLSET} + -DRunCMake_MAKE_PROGRAM=${CMake_TEST_EXPLICIT_MAKE_PROGRAM} + -DRunCMake_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/${Test_Dir} + -DRunCMake_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/${test} + ${${test}_ARGS} + ${TEST_ARGS} + -P "${CMAKE_CURRENT_SOURCE_DIR}/${Test_Dir}/RunCMakeTest.cmake" + ) +endmacro() diff --git a/src/testinternal/3rdparty/cmake/REUSE.toml b/src/testinternal/3rdparty/cmake/REUSE.toml new file mode 100644 index 00000000000..373ce9d2b3e --- /dev/null +++ b/src/testinternal/3rdparty/cmake/REUSE.toml @@ -0,0 +1,6 @@ +version = 1 +[[annotations]] +path = ["**"] +precedence = "closest" +SPDX-FileCopyrightText = "Copyright 2000-2025 Kitware, Inc. and Contributors" +SPDX-License-Identifier = "BSD-3-Clause"
\ No newline at end of file diff --git a/src/testinternal/3rdparty/cmake/RunCMake.cmake b/src/testinternal/3rdparty/cmake/RunCMake.cmake new file mode 100644 index 00000000000..65a320dacad --- /dev/null +++ b/src/testinternal/3rdparty/cmake/RunCMake.cmake @@ -0,0 +1,354 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. +# +# Original file location was Tests/RunCMake/RunCMake.cmake + +foreach( + arg + IN ITEMS + RunCMake_GENERATOR + RunCMake_SOURCE_DIR + RunCMake_BINARY_DIR + ) + if(NOT DEFINED ${arg}) + message(FATAL_ERROR "${arg} not given!") + endif() +endforeach() + +function(run_cmake test) + if(DEFINED ENV{RunCMake_TEST_FILTER}) + set(test_and_variant "${test}${RunCMake_TEST_VARIANT_DESCRIPTION}") + if(NOT test_and_variant MATCHES "$ENV{RunCMake_TEST_FILTER}") + return() + endif() + unset(test_and_variant) + endif() + + set(top_src "${RunCMake_SOURCE_DIR}") + set(top_bin "${RunCMake_BINARY_DIR}") + if(EXISTS ${top_src}/${test}-result.txt) + file(READ ${top_src}/${test}-result.txt expect_result) + string(REGEX REPLACE "\n+$" "" expect_result "${expect_result}") + elseif(DEFINED RunCMake_TEST_EXPECT_RESULT) + set(expect_result "${RunCMake_TEST_EXPECT_RESULT}") + else() + set(expect_result 0) + endif() + + string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} platform_name) + #remove all additional bits from cygwin/msys name + if(platform_name MATCHES cygwin) + set(platform_name cygwin) + endif() + if(platform_name MATCHES msys) + set(platform_name msys) + endif() + + foreach(o IN ITEMS stdout stderr config) + if(RunCMake-${o}-file AND EXISTS ${top_src}/${RunCMake-${o}-file}) + file(READ ${top_src}/${RunCMake-${o}-file} expect_${o}) + string(REGEX REPLACE "\n+$" "" expect_${o} "${expect_${o}}") + elseif(EXISTS ${top_src}/${test}-${o}-${platform_name}.txt) + file(READ ${top_src}/${test}-${o}-${platform_name}.txt expect_${o}) + string(REGEX REPLACE "\n+$" "" expect_${o} "${expect_${o}}") + elseif(EXISTS ${top_src}/${test}-${o}.txt) + file(READ ${top_src}/${test}-${o}.txt expect_${o}) + string(REGEX REPLACE "\n+$" "" expect_${o} "${expect_${o}}") + elseif(DEFINED RunCMake_TEST_EXPECT_${o}) + string(REGEX REPLACE "\n+$" "" expect_${o} "${RunCMake_TEST_EXPECT_${o}}") + else() + unset(expect_${o}) + endif() + endforeach() + foreach(o IN ITEMS stdout stderr config) + if(DEFINED RunCMake_TEST_NOT_EXPECT_${o}) + string(REGEX REPLACE "\n+$" "" not_expect_${o} "${RunCMake_TEST_NOT_EXPECT_${o}}") + endif() + endforeach() + if (NOT expect_stderr) + if (NOT RunCMake_DEFAULT_stderr) + set(RunCMake_DEFAULT_stderr "^$") + endif() + set(expect_stderr ${RunCMake_DEFAULT_stderr}) + endif() + + if (NOT RunCMake_TEST_SOURCE_DIR) + set(RunCMake_TEST_SOURCE_DIR "${top_src}") + endif() + if(NOT RunCMake_TEST_BINARY_DIR) + set(RunCMake_TEST_BINARY_DIR "${top_bin}/${test}-build") + endif() + if(NOT RunCMake_TEST_NO_CLEAN) + file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}") + endif() + file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}") + if(RunCMake-prep-file AND EXISTS ${top_src}/${RunCMake-prep-file}) + include(${top_src}/${RunCMake-prep-file}) + else() + include(${top_src}/${test}-prep.cmake OPTIONAL) + endif() + if(RunCMake_TEST_OUTPUT_MERGE) + set(actual_stderr_var actual_stdout) + set(actual_stderr "") + else() + set(actual_stderr_var actual_stderr) + endif() + if(DEFINED RunCMake_TEST_TIMEOUT) + set(maybe_timeout TIMEOUT ${RunCMake_TEST_TIMEOUT}) + else() + set(maybe_timeout "") + endif() + if(RunCMake-stdin-file AND EXISTS ${top_src}/${RunCMake-stdin-file}) + set(maybe_input_file INPUT_FILE ${top_src}/${RunCMake-stdin-file}) + elseif(EXISTS ${top_src}/${test}-stdin.txt) + set(maybe_input_file INPUT_FILE ${top_src}/${test}-stdin.txt) + else() + set(maybe_input_file "") + endif() + if(NOT RunCMake_TEST_COMMAND) + if(NOT DEFINED RunCMake_TEST_OPTIONS) + set(RunCMake_TEST_OPTIONS "") + endif() + if(APPLE) + list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0025=NEW) + endif() + if(RunCMake_TEST_LCC AND NOT RunCMake_TEST_NO_CMP0129) + list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0129=NEW) + endif() + if(RunCMake_MAKE_PROGRAM) + list(APPEND RunCMake_TEST_OPTIONS "-DCMAKE_MAKE_PROGRAM=${RunCMake_MAKE_PROGRAM}") + endif() + set(RunCMake_TEST_COMMAND ${CMAKE_COMMAND}) + if(NOT RunCMake_TEST_NO_SOURCE_DIR) + list(APPEND RunCMake_TEST_COMMAND "${RunCMake_TEST_SOURCE_DIR}") + endif() + list(APPEND RunCMake_TEST_COMMAND -G "${RunCMake_GENERATOR}") + if(RunCMake_GENERATOR_PLATFORM) + list(APPEND RunCMake_TEST_COMMAND -A "${RunCMake_GENERATOR_PLATFORM}") + endif() + if(RunCMake_GENERATOR_TOOLSET) + list(APPEND RunCMake_TEST_COMMAND -T "${RunCMake_GENERATOR_TOOLSET}") + endif() + if(RunCMake_GENERATOR_INSTANCE) + list(APPEND RunCMake_TEST_COMMAND "-DCMAKE_GENERATOR_INSTANCE=${RunCMake_GENERATOR_INSTANCE}") + endif() + list(APPEND RunCMake_TEST_COMMAND + -DRunCMake_TEST=${test} + --no-warn-unused-cli + ) + else() + set(RunCMake_TEST_OPTIONS "") + endif() + if(NOT DEFINED RunCMake_TEST_RAW_ARGS) + set(RunCMake_TEST_RAW_ARGS "") + endif() + if(NOT RunCMake_TEST_COMMAND_WORKING_DIRECTORY) + set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${RunCMake_TEST_BINARY_DIR}") + endif() + string(CONCAT _code [[execute_process( + COMMAND ${RunCMake_TEST_COMMAND} + ${RunCMake_TEST_OPTIONS} + ]] "${RunCMake_TEST_RAW_ARGS}\n" [[ + WORKING_DIRECTORY "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}" + OUTPUT_VARIABLE actual_stdout + ERROR_VARIABLE ${actual_stderr_var} + RESULT_VARIABLE actual_result + ENCODING UTF8 + ${maybe_timeout} + ${maybe_input_file} + )]]) + if(DEFINED ENV{PWD}) + set(old_pwd "$ENV{PWD}") + else() + set(old_pwd) + endif() + # Emulate a shell using this directory. + set(ENV{PWD} "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}") + cmake_language(EVAL CODE "${_code}") + if(DEFINED old_pwd) + set(ENV{PWD} "${old_pwd}") + else() + set(ENV{PWD}) + endif() + set(msg "") + if(NOT "${actual_result}" MATCHES "${expect_result}") + string(APPEND msg "Result is [${actual_result}], not [${expect_result}].\n") + endif() + set(config_file "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}/CMakeFiles/CMakeConfigureLog.yaml") + if(EXISTS "${config_file}") + file(READ "${config_file}" actual_config) + else() + set(actual_config "") + endif() + + # Special case: remove ninja no-op line from stderr, but not stdout. + # Test cases that look for it should use RunCMake_TEST_OUTPUT_MERGE. + string(REGEX REPLACE "(^|\r?\n)ninja: no work to do\\.\r?\n" "\\1" actual_stderr "${actual_stderr}") + + # Remove incidental content from both stdout and stderr. + string(CONCAT ignore_line_regex + "(^|\n)((==[0-9]+==" + "|BullseyeCoverage" + "|[a-z]+\\([0-9]+\\) malloc:" + "|clang[^:]*: warning: the object size sanitizer has no effect at -O0, but is explicitly enabled:" + "|flang-new: warning: argument unused during compilation: .-flang-experimental-exec." + "|icp?x: remark: Note that use of .-g. without any optimization-level option will turn off most compiler optimizations" + "|ifx: remark #10440: Note that use of a debug option without any optimization-level option will turnoff most compiler optimizations" + "|lld-link: warning: procedure symbol record for .* refers to PDB item index [0-9A-Fa-fx]+ which is not a valid function ID record" + "|Error kstat returned" + "|Hit xcodebuild bug" + "|Recompacting log\\.\\.\\." + + "|LICENSE WARNING:" + "|Your license to use PGI[^\n]*expired" + "|Please obtain a new version at" + "|contact PGI Sales at" + "|ic(p?c|l): remark #10441: The Intel\\(R\\) C\\+\\+ Compiler Classic \\(ICC\\) is deprecated" + + "|[^\n]*install_name_tool: warning: changes being made to the file will invalidate the code signature in:" + "|[^\n]*(createItemModels|_NSMainThread|Please file a bug at)" + "|[^\n]*xcodebuild[^\n]*DVTAssertions: Warning" + "|[^\n]*xcodebuild[^\n]*DVTCoreDeviceEnabledState: DVTCoreDeviceEnabledState_Disabled set via user default" + "|[^\n]*xcodebuild[^\n]*DVTPlugInManager" + "|[^\n]*xcodebuild[^\n]*DVTSDK: Warning: SDK path collision for path" + "|[^\n]*xcodebuild[^\n]*Requested but did not find extension point with identifier" + "|[^\n]*xcodebuild[^\n]*nil host used in call to allows.*HTTPSCertificateForHost" + "|[^\n]*xcodebuild[^\n]*warning: file type[^\n]*is based on missing file type" + "|[^\n]*objc[^\n]*: Class [^\n]* One of the two will be used. Which one is undefined." + "|[^\n]*is a member of multiple groups" + "|[^\n]*offset in archive not a multiple of 8" + "|[^\n]*from Time Machine by path" + "|[^\n]*Bullseye Testing Technology" + ${RunCMake_TEST_EXTRA_IGNORE_LINE_REGEX} + ")[^\n]*\n)+" + ) + if(RunCMake_IGNORE_POLICY_VERSION_DEPRECATION) + string(REGEX REPLACE [[ +^CMake Deprecation Warning at [^ +]*CMakeLists.txt:1 \(cmake_minimum_required\): + Compatibility with CMake < 3\.10 will be removed from a future version of + CMake. + + Update the VERSION argument <min> value\. Or, use the <min>\.\.\.<max> syntax + to tell CMake that the project requires at least <min> but has been updated + to work with policies introduced by <max> or earlier\. ++ +]] "" actual_stderr "${actual_stderr}") + endif() + foreach(o IN ITEMS stdout stderr config) + string(REGEX REPLACE "\r\n" "\n" actual_${o} "${actual_${o}}") + string(REGEX REPLACE "${ignore_line_regex}" "\\1" actual_${o} "${actual_${o}}") + string(REGEX REPLACE "\n+$" "" actual_${o} "${actual_${o}}") + if(DEFINED expect_${o}) + if(NOT "${actual_${o}}" MATCHES "${expect_${o}}") + string(APPEND msg "${o} does not match that expected.\n") + endif() + endif() + if(DEFINED not_expect_${o}) + if("${actual_${o}}" MATCHES "${not_expect_${o}}") + string(APPEND msg "${o} matches that not expected.\n") + endif() + endif() + endforeach() + unset(RunCMake_TEST_FAILED) + unset(RunCMake_TEST_FAILURE_MESSAGE) + if(RunCMake-check-file AND EXISTS ${top_src}/${RunCMake-check-file}) + include(${top_src}/${RunCMake-check-file}) + else() + include(${top_src}/${test}-check.cmake OPTIONAL) + endif() + if(RunCMake_TEST_FAILED) + set(msg "${RunCMake_TEST_FAILED}\n${msg}") + endif() + if(msg) + string(REPLACE ";" "\" \"" command "\"${RunCMake_TEST_COMMAND}\"") + if(RunCMake_TEST_OPTIONS) + string(REPLACE ";" "\" \"" options "\"${RunCMake_TEST_OPTIONS}\"") + string(APPEND command " ${options}") + endif() + if(RunCMake_TEST_RAW_ARGS) + string(APPEND command " ${RunCMake_TEST_RAW_ARGS}") + endif() + string(APPEND msg "Command was:\n command> ${command}\n") + endif() + if(msg) + foreach(o IN ITEMS stdout stderr config) + if(DEFINED expect_${o}) + string(REGEX REPLACE "\n" "\n expect-${o}> " expect_${o} " expect-${o}> ${expect_${o}}") + string(APPEND msg "Expected ${o} to match:\n${expect_${o}}\n") + endif() + if(NOT o STREQUAL "config" OR DEFINED expect_${o}) + string(REGEX REPLACE "\n" "\n actual-${o}> " actual_${o} " actual-${o}> ${actual_${o}}") + string(APPEND msg "Actual ${o}:\n${actual_${o}}\n") + endif() + endforeach() + if(RunCMake_TEST_FAILURE_MESSAGE) + string(APPEND msg "${RunCMake_TEST_FAILURE_MESSAGE}") + endif() + message(SEND_ERROR "${test}${RunCMake_TEST_VARIANT_DESCRIPTION} - FAILED:\n${msg}") + else() + message(STATUS "${test}${RunCMake_TEST_VARIANT_DESCRIPTION} - PASSED") + endif() +endfunction() + +function(run_cmake_command test) + set(RunCMake_TEST_COMMAND "${ARGN}") + run_cmake(${test}) +endfunction() + +function(run_cmake_script test) + set(RunCMake_TEST_COMMAND ${CMAKE_COMMAND} ${ARGN} -P ${RunCMake_SOURCE_DIR}/${test}.cmake) + run_cmake(${test}) +endfunction() + +function(run_cmake_with_options test) + set(RunCMake_TEST_OPTIONS "${ARGN}") + run_cmake(${test}) +endfunction() + +function(run_cmake_with_raw_args test args) + set(RunCMake_TEST_RAW_ARGS "${args}") + run_cmake(${test}) +endfunction() + +function(ensure_files_match expected_file actual_file) + if(NOT EXISTS "${expected_file}") + message(FATAL_ERROR "Expected file does not exist:\n ${expected_file}") + endif() + if(NOT EXISTS "${actual_file}") + message(FATAL_ERROR "Actual file does not exist:\n ${actual_file}") + endif() + file(READ "${expected_file}" expected_file_content) + file(READ "${actual_file}" actual_file_content) + if(NOT "${expected_file_content}" STREQUAL "${actual_file_content}") + message(FATAL_ERROR "Actual file content does not match expected:\n + \n + expected file: ${expected_file}\n + expected content:\n + ${expected_file_content}\n + \n + actual file: ${actual_file}\n + actual content:\n + ${actual_file_content}\n + ") + endif() +endfunction() + +# Get the user id on unix if possible. +function(get_unix_uid var) + set("${var}" "" PARENT_SCOPE) + if(UNIX) + set(ID "id") + if(CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND EXISTS "/usr/xpg4/bin/id") + set (ID "/usr/xpg4/bin/id") + endif() + execute_process(COMMAND ${ID} -u $ENV{USER} OUTPUT_VARIABLE uid ERROR_QUIET + RESULT_VARIABLE status OUTPUT_STRIP_TRAILING_WHITESPACE) + if(status EQUAL 0) + set("${var}" "${uid}" PARENT_SCOPE) + endif() + endif() +endfunction() + +# Protect RunCMake tests from calling environment. +unset(ENV{MAKEFLAGS}) diff --git a/src/testinternal/3rdparty/cmake/qt_attribution.json b/src/testinternal/3rdparty/cmake/qt_attribution.json new file mode 100644 index 00000000000..e1cdbcdb9f8 --- /dev/null +++ b/src/testinternal/3rdparty/cmake/qt_attribution.json @@ -0,0 +1,15 @@ +{ + "Id": "cmake-runcmake-test-modules", + "Name": "cmake-runcmake-test-modules", + "QDocModule": "qttestinternals_private", + "QtUsage": "Used as part of the build system.", + + "Description": "CMake helpers for running CMake tests.", + "Homepage": "https://cmake.org/", + "Version": "3.31.5", + + "License": "BSD 3-Clause \"New\" or \"Revised\" License", + "LicenseId": "BSD-3-Clause", + "LicenseFile": "Copyright.txt", + "Copyright": "Copyright © 2000-2024 Kitware, Inc. and Contributors" +} diff --git a/src/testinternal/CMakeLists.txt b/src/testinternal/CMakeLists.txt new file mode 100644 index 00000000000..f0b9c3d5314 --- /dev/null +++ b/src/testinternal/CMakeLists.txt @@ -0,0 +1,31 @@ +# Copyright (C) 2025 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +##################################################################### +## TestInternal Module: +##################################################################### + +# file properties must be set before calling `qt_internal_add_module` until it can be `DEFER`ed +set_source_files_properties( + 3rdparty/cmake/QtRunCMakeTestHelpers.cmake + 3rdparty/cmake/RunCMake.cmake + PROPERTIES + QT_INSTALL_PATH 3rdparty/cmake +) + +qt_internal_add_module(TestInternalsPrivate + # Dummy interface target + INTERNAL_MODULE + HEADER_MODULE + NO_GENERATE_CPP_EXPORTS + NO_MODULE_HEADERS + NO_ADDITIONAL_TARGET_INFO + + ATTRIBUTION_FILE_DIR_PATHS + 3rdparty/cmake + EXTRA_CMAKE_FILES + 3rdparty/cmake/QtRunCMakeTestHelpers.cmake + 3rdparty/cmake/RunCMake.cmake + EXTRA_CMAKE_INCLUDES + 3rdparty/cmake/QtRunCMakeTestHelpers.cmake +) diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt index 751f040c81c..59d19fabf82 100644 --- a/tests/auto/cmake/CMakeLists.txt +++ b/tests/auto/cmake/CMakeLists.txt @@ -75,7 +75,7 @@ if(UNIX AND NOT APPLE AND NOT WIN32 AND CMAKE_CROSSCOMPILING AND NOT QT_ENABLE_C return() endif() -set(required_packages Core Network Xml Sql Test) +set(required_packages Core Network Xml Sql Test TestInternalsPrivate) set(optional_packages DBus Gui Widgets PrintSupport OpenGL Concurrent) # Setup the test when called as a completely standalone project. @@ -465,3 +465,5 @@ if(NOT QNX AND NOT WASM AND NOT (WIN32 AND QT_BUILD_MINIMAL_STATIC_TESTS) _qt_internal_test_expect_pass(test_qt_add_ui_11) endif() +# Add all tests using CMake's RunCMake test module +add_subdirectory(RunCMake) diff --git a/tests/auto/cmake/RunCMake/CMakeLists.txt b/tests/auto/cmake/RunCMake/CMakeLists.txt new file mode 100644 index 00000000000..e6fc346707c --- /dev/null +++ b/tests/auto/cmake/RunCMake/CMakeLists.txt @@ -0,0 +1 @@ +# Add RunCMake tests using `add_RunCMake_test()` diff --git a/tests/auto/cmake/RunCMake/README.md b/tests/auto/cmake/RunCMake/README.md new file mode 100644 index 00000000000..b59fe6c6c81 --- /dev/null +++ b/tests/auto/cmake/RunCMake/README.md @@ -0,0 +1,15 @@ +# RunCMake tests + +These test suites use upstream [CMake's `RunCMake`][RunCMake-cmake] test module. See the upstream +documentation on how to add tests. + +A few minor adjustments we make: +- `add_RunCMake_test()` function is defined in `QtRunCMakeTestHelpers` module +instead of the `CMakeLists.txt` +- `CMAKE_CMAKE_COMMAND` is replaced with `CMAKE_COMMAND` +- `CMAKE_MODULE_PATH` points to `CMAKE_CURRENT_LIST_DIR` (indirectly via variable `RunCMakeDir`) + instead of `CMAKE_CURRENT_SOURCE_DIR` + +Update `/cmake/3rdparty/cmake` as needed. Last fetched from `v3.31.5`. + +[RunCMake-cmake]: https://gitlab.kitware.com/cmake/cmake/-/blob/master/Tests/RunCMake/README.rst |