Răsfoiți Sursa

Merge topic 'ctest-no-tests-action-env-var'

0661de58d8 ctest(1): Add CTEST_NO_TESTS_ACTION env var

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !8044
Brad King 2 ani în urmă
părinte
comite
dd18be5ebf

+ 14 - 0
Help/envvar/CTEST_NO_TESTS_ACTION.rst

@@ -0,0 +1,14 @@
+CTEST_NO_TESTS_ACTION
+---------------------
+
+.. versionadded:: 3.26
+
+.. include:: ENV_VAR.txt
+
+Environment variable that controls how :manual:`ctest <ctest(1)>` handles
+cases when there are no tests to run. Possible values are: ``error``,
+``ignore``, empty or unset.
+
+The :option:`--no-tests=\<action\> <ctest --no-tests>` option to
+:manual:`ctest <ctest(1)>` overrides this environment variable if both
+are given.

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

@@ -92,6 +92,7 @@ Environment Variables for CTest
 
 
    /envvar/CMAKE_CONFIG_TYPE
    /envvar/CMAKE_CONFIG_TYPE
    /envvar/CTEST_INTERACTIVE_DEBUG_MODE
    /envvar/CTEST_INTERACTIVE_DEBUG_MODE
+   /envvar/CTEST_NO_TESTS_ACTION
    /envvar/CTEST_OUTPUT_ON_FAILURE
    /envvar/CTEST_OUTPUT_ON_FAILURE
    /envvar/CTEST_PARALLEL_LEVEL
    /envvar/CTEST_PARALLEL_LEVEL
    /envvar/CTEST_PROGRESS_OUTPUT
    /envvar/CTEST_PROGRESS_OUTPUT

+ 5 - 0
Help/manual/ctest.1.rst

@@ -435,6 +435,11 @@ Run Tests
  unifies the behavior of CTest by either returning an error code if no tests
  unifies the behavior of CTest by either returning an error code if no tests
  were found or by ignoring it.
  were found or by ignoring it.
 
 
+ .. versionadded:: 3.26
+
+ This option can also be set by setting the :envvar:`CTEST_NO_TESTS_ACTION`
+ environment variable.
+
 View Help
 View Help
 =========
 =========
 
 

+ 7 - 0
Help/release/dev/ctest-no-tests-action-env-var.rst

@@ -0,0 +1,7 @@
+ctest-no-tests-action-env-var
+-----------------------------
+
+* The :envvar:`CTEST_NO_TESTS_ACTION` environment variable was added to
+  provide a default value for the
+  :option:`--no-tests=\<action\> <ctest --no-tests>` command line
+  argument of :manual:`ctest(1)`.

+ 20 - 0
Source/cmCTest.cxx

@@ -217,6 +217,7 @@ struct cmCTest::Private
   std::map<std::string, std::string> Definitions;
   std::map<std::string, std::string> Definitions;
 
 
   cmCTest::NoTests NoTestsMode = cmCTest::NoTests::Legacy;
   cmCTest::NoTests NoTestsMode = cmCTest::NoTests::Legacy;
+  bool NoTestsModeSetInCli = false;
 };
 };
 
 
 struct tm* cmCTest::GetNightlyTime(std::string const& str, bool tomorrowtag)
 struct tm* cmCTest::GetNightlyTime(std::string const& str, bool tomorrowtag)
@@ -2132,6 +2133,7 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
     } else {
     } else {
       this->Impl->NoTestsMode = cmCTest::NoTests::Ignore;
       this->Impl->NoTestsMode = cmCTest::NoTests::Ignore;
     }
     }
+    this->Impl->NoTestsModeSetInCli = true;
   }
   }
 
 
   // options that control what tests are run
   // options that control what tests are run
@@ -2774,6 +2776,24 @@ int cmCTest::Run(std::vector<std::string>& args, std::string* output)
     }
     }
   }
   }
 
 
+  // handle CTEST_NO_TESTS_ACTION environment variable
+  if (!this->Impl->NoTestsModeSetInCli) {
+    std::string action;
+    if (cmSystemTools::GetEnv("CTEST_NO_TESTS_ACTION", action) &&
+        !action.empty()) {
+      if (action == "error"_s) {
+        this->Impl->NoTestsMode = cmCTest::NoTests::Error;
+      } else if (action == "ignore"_s) {
+        this->Impl->NoTestsMode = cmCTest::NoTests::Ignore;
+      } else {
+        cmCTestLog(this, ERROR_MESSAGE,
+                   "Unknown value for CTEST_NO_TESTS_ACTION: '" << action
+                                                                << '\'');
+        return 1;
+      }
+    }
+  }
+
   // TestProgressOutput only supported if console supports it and not logging
   // TestProgressOutput only supported if console supports it and not logging
   // to a file
   // to a file
   this->Impl->TestProgressOutput = this->Impl->TestProgressOutput &&
   this->Impl->TestProgressOutput = this->Impl->TestProgressOutput &&

+ 8 - 0
Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake

@@ -389,6 +389,14 @@ function(run_NoTests)
   run_cmake_command(no-tests_error ${CMAKE_CTEST_COMMAND} --no-tests=error)
   run_cmake_command(no-tests_error ${CMAKE_CTEST_COMMAND} --no-tests=error)
   run_cmake_command(no-tests_bad ${CMAKE_CTEST_COMMAND} --no-tests=bad)
   run_cmake_command(no-tests_bad ${CMAKE_CTEST_COMMAND} --no-tests=bad)
   run_cmake_command(no-tests_legacy ${CMAKE_CTEST_COMMAND})
   run_cmake_command(no-tests_legacy ${CMAKE_CTEST_COMMAND})
+
+  run_cmake_command(no-tests_env_ignore ${CMAKE_COMMAND} -E env CTEST_NO_TESTS_ACTION=ignore ${CMAKE_CTEST_COMMAND})
+  run_cmake_command(no-tests_env_error ${CMAKE_COMMAND} -E env CTEST_NO_TESTS_ACTION=error ${CMAKE_CTEST_COMMAND})
+  run_cmake_command(no-tests_env_bad ${CMAKE_COMMAND} -E env CTEST_NO_TESTS_ACTION=bad ${CMAKE_CTEST_COMMAND})
+  run_cmake_command(no-tests_env_empty_legacy ${CMAKE_COMMAND} -E env CTEST_NO_TESTS_ACTION= ${CMAKE_CTEST_COMMAND})
+
+  run_cmake_command(no-tests_env_bad_with_cli_error ${CMAKE_COMMAND} -E env CTEST_NO_TESTS_ACTION=bad ${CMAKE_CTEST_COMMAND} --no-tests=error)
+
   file(WRITE "${RunCMake_TEST_BINARY_DIR}/NoTestsScript.cmake" "
   file(WRITE "${RunCMake_TEST_BINARY_DIR}/NoTestsScript.cmake" "
     set(CTEST_COMMAND \"${CMAKE_CTEST_COMMAND}\")
     set(CTEST_COMMAND \"${CMAKE_CTEST_COMMAND}\")
     set(CTEST_SOURCE_DIRECTORY \"${RunCMake_SOURCE_DIR}\")
     set(CTEST_SOURCE_DIRECTORY \"${RunCMake_SOURCE_DIR}\")

+ 1 - 0
Tests/RunCMake/CTestCommandLine/no-tests_env_bad-result.txt

@@ -0,0 +1 @@
+1

+ 1 - 0
Tests/RunCMake/CTestCommandLine/no-tests_env_bad-stderr.txt

@@ -0,0 +1 @@
+^Unknown value for CTEST_NO_TESTS_ACTION: 'bad'$

+ 1 - 0
Tests/RunCMake/CTestCommandLine/no-tests_env_bad_with_cli_error-result.txt

@@ -0,0 +1 @@
+8

+ 1 - 0
Tests/RunCMake/CTestCommandLine/no-tests_env_bad_with_cli_error-stderr.txt

@@ -0,0 +1 @@
+No tests were found!!!

+ 1 - 0
Tests/RunCMake/CTestCommandLine/no-tests_env_empty_legacy-stderr.txt

@@ -0,0 +1 @@
+^No tests were found!!!$

+ 1 - 0
Tests/RunCMake/CTestCommandLine/no-tests_env_error-result.txt

@@ -0,0 +1 @@
+8

+ 1 - 0
Tests/RunCMake/CTestCommandLine/no-tests_env_error-stderr.txt

@@ -0,0 +1 @@
+No tests were found!!!

+ 1 - 0
Tests/RunCMake/RunCTest.cmake

@@ -3,6 +3,7 @@ include(RunCMake)
 # Isolate our ctest runs from external environment.
 # Isolate our ctest runs from external environment.
 unset(ENV{CTEST_PARALLEL_LEVEL})
 unset(ENV{CTEST_PARALLEL_LEVEL})
 unset(ENV{CTEST_OUTPUT_ON_FAILURE})
 unset(ENV{CTEST_OUTPUT_ON_FAILURE})
+unset(ENV{CTEST_NO_TESTS_ACTION})
 
 
 function(run_ctest CASE_NAME)
 function(run_ctest CASE_NAME)
   configure_file(${RunCMake_SOURCE_DIR}/test.cmake.in
   configure_file(${RunCMake_SOURCE_DIR}/test.cmake.in