StdIo: Honor NO_COLOR environment variable

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

Closes: #26458
This commit is contained in:
Brad King
2025-05-20 11:57:29 -04:00
parent 27f375d514
commit 6aa604ef10
6 changed files with 36 additions and 7 deletions
+3 -3
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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})