SVN commit 1304575 by lunakl: clang has its own color support, use that instead of icecream's own M +11 -0 arg.cpp M +1 -0 client.h M +6 -1 local.cpp M +1 -1 remote.cpp M +16 -2 util.cpp M +2 -1 util.h --- trunk/icecream/client/arg.cpp #1304574:1304575 @@ -110,6 +110,7 @@ bool seen_s = false; bool seen_mf = false; bool seen_md = false; + bool fno_color_diagnostics = false; if( icerun ) { always_local = true; job.setLanguage( CompileJob::Lang_Custom ); @@ -293,6 +294,12 @@ || str_equal("-MG", a) || str_equal("-MP", a)) { args.append(a, Arg_Local); + } else if (str_equal("-fno-color-diagnostics", a)) { + fno_color_diagnostics = true; + args.append( a, Arg_Rest ); + } else if (str_equal("-fcolor-diagnostics", a)) { + fno_color_diagnostics = false; + args.append( a, Arg_Rest ); } else args.append( a, Arg_Rest ); } else { @@ -402,6 +409,10 @@ if ( ofile.empty() || (!stat( ofile.c_str(), &st ) && !S_ISREG( st.st_mode ))) always_local = true; + // redirecting Clang's output will turn off its automatic coloring, so force it, unless disabled + if (compiler_is_clang(job.language()) && colorify_possible() && !fno_color_diagnostics) + args.append("-fcolor-diagnostics", Arg_Rest); + job.setFlags( args ); job.setOutputFile( ofile ); --- trunk/icecream/client/client.h #1304574:1304575 @@ -49,6 +49,7 @@ extern int build_local (CompileJob& job, MsgChannel *daemon, struct rusage *usage =0); extern std::string find_compiler( CompileJob::Language lang ); extern std::string find_compiler( const CompileJob& job ); +extern bool compiler_is_clang( CompileJob::Language lang ); /* In remote.cpp - permill is the probability it will be compiled three times */ extern int build_remote (CompileJob &job, MsgChannel *scheduler, const Environments &envs, int permill); --- trunk/icecream/client/local.cpp #1304574:1304575 @@ -143,6 +143,11 @@ return path_lookup(compiler); } +bool compiler_is_clang( CompileJob::Language lang ) +{ + return get_compiler_name( lang ).find("clang") != string::npos; +} + static volatile int lock_fd = 0; static volatile int user_break_signal = 0; static volatile pid_t child_pid; @@ -220,7 +225,7 @@ } bool color_output = job.language() != CompileJob::Lang_Custom - && colorify_wanted(); + && colorify_wanted(job.language()); int pf[2]; if (color_output && pipe(pf)) --- trunk/icecream/client/remote.cpp #1304574:1304575 @@ -423,7 +423,7 @@ { write(STDOUT_FILENO, crmsg->out.c_str(), crmsg->out.size() ); - if(colorify_wanted()) + if(colorify_wanted(job.language())) colorify_output(crmsg->err); else write(STDERR_FILENO, crmsg->err.c_str(), crmsg->err.size() ); --- trunk/icecream/client/util.cpp #1304574:1304575 @@ -37,7 +37,9 @@ #include #include +#include "client.h" #include "exitcode.h" +#include "job.h" #include "logging.h" #include "util.h" @@ -201,13 +203,25 @@ } } -bool colorify_wanted() +bool colorify_possible() { const char* term_env = getenv("TERM"); - return isatty(2) && !getenv("EMACS") && term_env && strcasecmp(term_env, "DUMB"); + return isatty(2) && term_env && strcasecmp(term_env, "DUMB"); } +bool colorify_wanted(CompileJob::Language lang) +{ + // Clang has coloring, and an explicit option to force it even if output is not a tty. + if (compiler_is_clang(lang)) + return false; + + if (getenv("EMACS")) + return false; + + return colorify_possible(); +} + void colorify_output(const string& _s_ccout) { string s_ccout(_s_ccout); --- trunk/icecream/client/util.h #1304574:1304575 @@ -28,7 +28,8 @@ extern std::string find_basename(const std::string &sfile); extern void colorify_output(const std::string &s_ccout); -extern bool colorify_wanted(); +extern bool colorify_wanted(CompileJob::Language lang); +extern bool colorify_possible(); extern bool dcc_unlock(int lock_fd); extern bool dcc_lock_host(int &lock_fd);