aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/diagnostics.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2022-12-08 10:49:57 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2022-12-08 10:49:57 +0200
commitf7600f07eecbdac0a4400ca2bc39e3e9f5a53b1b (patch)
tree3bc35a46a68b41dab1148fdbac1d64b818b53960 /libbuild2/diagnostics.cxx
parente55ab94a6fa652c71cdb119dc1b269c836672930 (diff)
Add --[no]diag-color options (infrastructure only)
Diffstat (limited to 'libbuild2/diagnostics.cxx')
-rw-r--r--libbuild2/diagnostics.cxx40
1 files changed, 36 insertions, 4 deletions
diff --git a/libbuild2/diagnostics.cxx b/libbuild2/diagnostics.cxx
index d91150b..b31ff82 100644
--- a/libbuild2/diagnostics.cxx
+++ b/libbuild2/diagnostics.cxx
@@ -3,7 +3,8 @@
#include <libbuild2/diagnostics.hxx>
-#include <cstring> // strchr(), memcpy()
+#include <cstring> // strcmp(), strchr(), memcpy()
+#include <cstdlib> // getenv()
#include <libbutl/process-io.hxx>
@@ -24,23 +25,54 @@ namespace build2
bool silent = true;
optional<bool> diag_progress_option;
+ optional<bool> diag_color_option;
bool diag_no_line = false;
bool diag_no_column = false;
- bool stderr_term = false;
+ optional<const char*> stderr_term = nullopt;
+ bool stderr_term_color = false;
void
- init_diag (uint16_t v, bool s, optional<bool> p, bool nl, bool nc, bool st)
+ init_diag (uint16_t v,
+ bool s,
+ optional<bool> p,
+ optional<bool> c,
+ bool nl,
+ bool nc,
+ bool st)
{
assert (!s || v == 0);
verb = v;
silent = s;
diag_progress_option = p;
+ diag_color_option = c;
diag_no_line = nl;
diag_no_column = nc;
- stderr_term = st;
+
+ if (st)
+ {
+ stderr_term = std::getenv ("TERM");
+
+ stderr_term_color =
+#ifdef _WIN32
+ // For now we disable color on Windows since it's unclear if/where/how
+ // it is supported. Maybe one day someone will figure this out.
+ //
+ false
+#else
+ // This test was lifted from GCC (Emacs shell sets TERM=dumb).
+ //
+ *stderr_term != nullptr && strcmp (*stderr_term, "dumb") != 0
+#endif
+ ;
+ }
+ else
+ {
+ stderr_term = nullopt;
+ stderr_term_color = false;
+ }
}
// Stream verbosity.