My dmake script is a wrapper around make to get gcc color output.
And dmake saves the compilation log to output files for viewing later.

The newest gcc can generate color output using
-fdiagnostics-color=[auto|never|always]

The default is never if GCC_COLORS environment variable isn't present in the
environment, and auto otherwise

In .bashrc is needed

export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

The clang compiler has this option:

-f[no-]color-diagnostics

This option, which defaults to on when a color-capable terminal is detected, controls whether or not Clang prints diagnostics in color.

When this option is enabled, Clang will use colors to highlight specific parts of the diagnostic, e.g.,

See also https://clang.llvm.org/docs/UsersManual.html

And this is the source of my dmake awk script on Linux


#!/bin/sh -x
# helper script to run make using GNU AWK with colorizing in development.
# 
# /*
#  *
#  *  This program is free software: you can redistribute it and/or modify
#  *  it under the terms of the GNU General Public License as published by
#  *  the Free Software Foundation, either version 3 of the License, or
#  *  (at your option) any later version.
#  *
#  *  This program is distributed in the hope that it will be useful,
#  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  *  GNU General Public License for more details.
#  *
#  *  You should have received a copy of the GNU General Public License
#  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
#  *
#  *  The four essential freedoms with GNU GPL software:
#  *  The freedom to run the program, for any purpose
#  *  The freedom to study how the program works, and change it to make it do what you wish
#  *  The freedom to redistribute copies so you can help others
#  *  The freedom to distribute copies of your modified versions to others
#  */
# 
# GNU / Linux is user-friendly. It's just particular who its friends are :)
# 
# Only for GNU LINUX console:
#
#    \033          ascii ESCape
#    \033[<NUM>G   move to column <NUM> (linux console, xterm, not vt100)
#    \033[<NUM>C   move <NUM> columns forward but only upto last column
#    \033[<NUM>D   move <NUM> columns backward but only upto first column
#    \033[<NUM>A   move <NUM> rows up
#    \033[<NUM>B   move <NUM> rows down
#    \033[1m       switch on bold
#    \033[31m      switch on red
#    \033[32m      switch on green
#    \033[33m      switch on yellow
#    \033[m        switch off color/bold
#    \017          exit alternate mode (xterm, vt100, linux console)
#    \033[10m      exit alternate mode (linux console)
#    \015          carriage return (without newline)
#    Black       0;30     Dark Gray     1;30
#    Blue        0;34     Light Blue    1;34
#    Green       0;32     Light Green   1;32
#    Cyan        0;36     Light Cyan    1;36
#    Red         0;31     Light Red     1;31
#    Purple      0;35     Light Purple  1;35
#    Brown       0;33     Yellow        1;33
#    Light Gray  0;37     White         1;37
#
# normally 4 args to make should be oke. otherwise argv() to do.
# add colors for enter/leave dir
# if errors then run script to mailto or otherwise
# if errors then run script to start emacs on the file
rm -v -f dsmake.output
rm -v -f dsmake.errors
rm -v -f dsmake.warnings
make $1 $2 $3 $4 2>&1 |
gawk '
function toul() { print "\033[4m"; }
function tobold() { print "\033[36m"; }
function isentermakedir(thetext) { n = match(thetext, /[ ]Entering/); return n; }
function isleavemakedir(thetext) { n = match(thetext, /[ ]Leaving/); return n; }
function isgccerr(thetext) { n = match(thetext, /[ ]error:/); return n; }
function isgccwarning(thetext) { n = match(thetext, /[ ]warning:/); return n; }
BEGIN { tobold(); print "\033[34m"; print ":)" > "dsmake.output" }
/^/ { print $0 > "dsmake.output"; print "\033[34m"; if(isgccerr($0)) { print "\033[31m"; print $0 > "dsmake.errors"; } ; if(isgccwarning($0)) { print "\033[35m"; print $0 > "dsmake.warnings" } ; print $0; next; }
END { print "end of make" > "dsmake.output"; print "\033[37m"; print "\033[10m"; }
'

# end.