Browse Source

Add CMAKE_CTEST_ARGUMENTS variable to pass command-line arguments to ctest

Fixes: #20172
Robert Goulet 5 years ago
parent
commit
4153d8445b

+ 1 - 0
Help/manual/cmake-variables.7.rst

@@ -369,6 +369,7 @@ Variables that Control the Build
    /variable/CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY
    /variable/CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY_CONFIG
    /variable/CMAKE_CONFIG_POSTFIX
+   /variable/CMAKE_CTEST_ARGUMENTS
    /variable/CMAKE_CUDA_SEPARABLE_COMPILATION
    /variable/CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS
    /variable/CMAKE_DEBUG_POSTFIX

+ 6 - 0
Help/release/dev/cmake-ctest-arguments.rst

@@ -0,0 +1,6 @@
+cmake-ctest-arguments
+---------------------
+
+* A :variable:`CMAKE_CTEST_ARGUMENTS` variable was added to specify a list
+  of command-line arguments passed to CTest when running through the
+  ``test`` (or ``RUN_TESTS``) target of the generated build system.

+ 6 - 0
Help/variable/CMAKE_CTEST_ARGUMENTS.rst

@@ -0,0 +1,6 @@
+CMAKE_CTEST_ARGUMENTS
+---------------------
+
+Set this to a :ref:`semicolon-separated list <CMake Language Lists>` of
+command-line arguments to pass to :manual:`ctest(1)` when running tests
+through the ``test`` (or ``RUN_TESTS``) target of the generated build system.

+ 7 - 0
Source/cmGlobalGenerator.cxx

@@ -2458,6 +2458,13 @@ void cmGlobalGenerator::AddGlobalTarget_Test(
   cmCustomCommandLine singleLine;
   singleLine.push_back(cmSystemTools::GetCTestCommand());
   singleLine.push_back("--force-new-ctest-process");
+  if (auto testArgs = mf->GetDefinition("CMAKE_CTEST_ARGUMENTS")) {
+    std::vector<std::string> args;
+    cmExpandList(testArgs, args);
+    for (auto const& arg : args) {
+      singleLine.push_back(arg);
+    }
+  }
   if (cmakeCfgIntDir && *cmakeCfgIntDir && cmakeCfgIntDir[0] != '.') {
     singleLine.push_back("-C");
     singleLine.push_back(cmakeCfgIntDir);

+ 4 - 0
Tests/RunCMake/CTest/CMakeCTestArguments-test-check.cmake

@@ -0,0 +1,4 @@
+set(log "${RunCMake_TEST_BINARY_DIR}/output-log.txt")
+if(NOT EXISTS "${log}")
+  set(RunCMake_TEST_FAILED "The expected output log file is missing:\n  ${log}")
+endif()

+ 2 - 0
Tests/RunCMake/CTest/CMakeCTestArguments.cmake

@@ -0,0 +1,2 @@
+include(CTest)
+add_test(NAME CMakeCTestArguments COMMAND ${CMAKE_COMMAND} -E echo CMakeCTestArguments)

+ 13 - 0
Tests/RunCMake/CTest/RunCMakeTest.cmake

@@ -5,3 +5,16 @@ run_cmake(BeforeProject)
 unset(RunCMake_TEST_OPTIONS)
 
 run_cmake(NotOn)
+
+function(run_CMakeCTestArguments)
+  run_cmake_with_options(CMakeCTestArguments "-DCMAKE_CTEST_ARGUMENTS=--quiet\\;--output-log\\;output-log.txt")
+  set(RunCMake_TEST_NO_CLEAN 1)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CMakeCTestArguments-build)
+  if(RunCMake_GENERATOR MATCHES "Make|Ninja")
+    set(test "test")
+  else()
+    set(test "RUN_TESTS")
+  endif()
+  run_cmake_command(CMakeCTestArguments-test ${CMAKE_COMMAND} --build . --config Debug --target "${test}")
+endfunction()
+run_CMakeCTestArguments()