浏览代码

StdIo: Honor NO_COLOR environment variable

This convention is documented by https://bixense.com/clicolors/

Closes: #26458
Brad King 5 月之前
父节点
当前提交
6aa604ef10

+ 3 - 3
Help/envvar/CLICOLOR.rst

@@ -9,11 +9,11 @@ Set to ``0`` to tell command-line tools not to print color
 messages even if connected to a terminal.
 This is a `common convention`_ among command-line tools in general.
 
-See also the :envvar:`CLICOLOR_FORCE` environment variable.
-:envvar:`CLICOLOR_FORCE`, if activated, takes precedence over
+See also the :envvar:`NO_COLOR` and :envvar:`CLICOLOR_FORCE` environment
+variables.  If either of them is activated, it takes precedence over
 :envvar:`!CLICOLOR`.
 
 See the :variable:`CMAKE_COLOR_DIAGNOSTICS` variable to control
 color in a generated build system.
 
-.. _`common convention`: https://web.archive.org/web/20230417221418/https://bixense.com/clicolors/
+.. _`common convention`: https://web.archive.org/web/20250410160803/https://bixense.com/clicolors/

+ 5 - 4
Help/envvar/CLICOLOR_FORCE.rst

@@ -9,11 +9,12 @@ Set to a non-empty value, other than ``0``, to tell command-line
 tools to print color messages even if not connected to a terminal.
 This is a `common convention`_ among command-line tools in general.
 
-See also the :envvar:`CLICOLOR` environment variable.
-:envvar:`!CLICOLOR_FORCE`, if activated, takes precedence over
-:envvar:`CLICOLOR`.
+See also the :envvar:`NO_COLOR` and :envvar:`CLICOLOR` environment variables.
+If :envvar:`NO_COLOR` is activated, it takes precedence over
+:envvar:`!CLICOLOR_FORCE`.  Otherwise, if :envvar:`!CLICOLOR_FORCE` is
+activated, it takes precedence over :envvar:`CLICOLOR`.
 
 See the :variable:`CMAKE_COLOR_DIAGNOSTICS` variable to control
 color in a generated build system.
 
-.. _`common convention`: https://web.archive.org/web/20230417221418/https://bixense.com/clicolors/
+.. _`common convention`: https://web.archive.org/web/20250410160803/https://bixense.com/clicolors/

+ 19 - 0
Help/envvar/NO_COLOR.rst

@@ -0,0 +1,19 @@
+NO_COLOR
+--------
+
+.. versionadded:: 4.1
+
+.. include:: include/ENV_VAR.rst
+
+Set to a non-empty value, other than ``0``, to tell command-line
+tools not to print color messages even if connected to a terminal.
+This is a `common convention`_ among command-line tools in general.
+
+See also the :envvar:`CLICOLOR_FORCE` and :envvar:`CLICOLOR` environment
+variables.  If :envvar:`!NO_COLOR` is activated, it takes precedence
+over both of them.
+
+See the :variable:`CMAKE_COLOR_DIAGNOSTICS` variable to control
+color in a generated build system.
+
+.. _`common convention`: https://web.archive.org/web/20250410160803/https://bixense.com/clicolors/

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

@@ -32,6 +32,7 @@ Environment Variables that Change Behavior
    /envvar/CMAKE_PROGRAM_PATH
    /envvar/CMAKE_TLS_VERIFY
    /envvar/CMAKE_TLS_VERSION
+   /envvar/NO_COLOR
    /envvar/SSL_CERT_DIR
    /envvar/SSL_CERT_FILE
 

+ 7 - 0
Source/cmStdIoTerminal.cxx

@@ -101,6 +101,13 @@ void SetVT100Attrs(std::ostream& os, TermAttrSet const& attrs)
 }
 
 auto const TermEnv = []() -> cm::optional<TermKind> {
+  /* Disable color according to https://bixense.com/clicolors/ convention. */
+  if (cm::optional<std::string> noColor =
+        cmSystemTools::GetEnvVar("NO_COLOR")) {
+    if (!noColor->empty() && *noColor != "0"_s) {
+      return TermKind::None;
+    }
+  }
   /* Force color according to https://bixense.com/clicolors/ convention.  */
   if (cm::optional<std::string> cliColorForce =
         cmSystemTools::GetEnvVar("CLICOLOR_FORCE")) {

+ 1 - 0
Tests/EnforceConfig.cmake.in

@@ -29,6 +29,7 @@ if(NOT CTEST_CONFIGURATION_TYPE)
 endif()
 
 # Isolate tests from user configuration in the environment.
+unset(ENV{NO_COLOR})
 unset(ENV{CLICOLOR})
 unset(ENV{CLICOLOR_FORCE})
 unset(ENV{CMAKE_GENERATOR})