You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
6.2 KiB
243 lines
6.2 KiB
--- a/colorgcc
|
|
+++ b/colorgcc
|
|
@@ -88,16 +88,16 @@
|
|
#
|
|
# 1.0.0 Initial Version
|
|
|
|
+use strict;
|
|
+
|
|
use Term::ANSIColor;
|
|
use IPC::Open3;
|
|
+use Cwd 'abs_path';
|
|
+
|
|
+my(%nocolor, %colors, %compilerPaths);
|
|
|
|
sub initDefaults
|
|
{
|
|
- $compilerPaths{"gcc"} = "/usr/local/bin/gcc";
|
|
- $compilerPaths{"g++"} = "/usr/local/bin/g++";
|
|
- $compilerPaths{"cc"} = "/usr/bin/cc";
|
|
- $compilerPaths{"c++"} = "/usr/local/bin/c++";
|
|
-
|
|
$nocolor{"dumb"} = "true";
|
|
|
|
$colors{"srcColor"} = color("cyan");
|
|
@@ -125,26 +125,26 @@
|
|
next if (m/^\#.*/); # It's a comment.
|
|
next if (!m/(.*):\s*(.*)/); # It's not of the form "foo: bar".
|
|
|
|
- $option = $1;
|
|
- $value = $2;
|
|
+ my $option = $1;
|
|
+ my $value = $2;
|
|
|
|
- if ($option =~ m/cc|c\+\+|gcc|g\+\+/)
|
|
- {
|
|
- $compilerPaths{$option} = $value;
|
|
- }
|
|
- elsif ($option eq "nocolor")
|
|
+ if ($option eq "nocolor")
|
|
{
|
|
# The nocolor option lists terminal types, separated by
|
|
# spaces, not to do color on.
|
|
- foreach $termtype (split(/\s+/, $value))
|
|
+ foreach my $term (split(' ', $value))
|
|
{
|
|
- $nocolor{$termtype} = "true";
|
|
+ $nocolor{$term} = 1;
|
|
}
|
|
}
|
|
- else
|
|
+ elsif (defined $colors{$option})
|
|
{
|
|
$colors{$option} = color($value);
|
|
}
|
|
+ else
|
|
+ {
|
|
+ $compilerPaths{$option} = $value;
|
|
+ }
|
|
}
|
|
close(PREFS);
|
|
}
|
|
@@ -180,41 +180,80 @@
|
|
initDefaults();
|
|
|
|
# Read the configuration file, if there is one.
|
|
-$configFile = $ENV{"HOME"} . "/.colorgccrc";
|
|
+my $configFile = $ENV{"HOME"} . "/.colorgccrc";
|
|
if (-f $configFile)
|
|
{
|
|
loadPreferences($configFile);
|
|
}
|
|
+elsif (-f '/etc/colorgcc/colorgccrc')
|
|
+{
|
|
+ loadPreferences('/etc/colorgcc/colorgccrc');
|
|
+}
|
|
|
|
# Figure out which compiler to invoke based on our program name.
|
|
$0 =~ m%.*/(.*)$%;
|
|
-$progName = $1 || $0;
|
|
-
|
|
-$compiler = $compilerPaths{$progName} || $compilerPaths{"gcc"};
|
|
-
|
|
-# Get the terminal type.
|
|
-$terminal = $ENV{"TERM"} || "dumb";
|
|
+my $progName = $1 || $0;
|
|
+my $compiler_pid;
|
|
|
|
-# If it's in the list of terminal types not to color, or if
|
|
-# we're writing to something that's not a tty, don't do color.
|
|
-if (! -t STDOUT || $nocolor{$terminal})
|
|
+# If called as "colorgcc", just filter STDIN to STDOUT.
|
|
+if ($progName eq 'colorgcc')
|
|
{
|
|
- exec $compiler, @ARGV
|
|
- or die("Couldn't exec");
|
|
+ open(GCCOUT, "<&STDIN");
|
|
}
|
|
+else
|
|
+{
|
|
+ # See if the user asked for a specific compiler.
|
|
+ my $compiler;
|
|
+ if (!defined($compiler = $compilerPaths{$progName}))
|
|
+ {
|
|
+ # Find our wrapper dir on the PATH and tweak the PATH to remove
|
|
+ # everything up-to and including our wrapper dir.
|
|
+ if ($0 =~ m#(.*)/#)
|
|
+ {
|
|
+ # We were called with an explicit path, so trim that off the PATH.
|
|
+ my $find = $1;
|
|
+ $find = abs_path($1) unless $find =~ m#^/#;
|
|
+ $ENV{'PATH'} =~ s#.*(^|:)\Q$find\E(:|$)##;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ my(@dirs) = split(/:/, $ENV{'PATH'});
|
|
+ while (defined($_ = shift @dirs))
|
|
+ {
|
|
+ if (-x "$_/$progName")
|
|
+ {
|
|
+ $ENV{'PATH'} = join(':', @dirs);
|
|
+ last;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ $compiler = $progName;
|
|
+ }
|
|
|
|
-# Keep the pid of the compiler process so we can get its return
|
|
-# code and use that as our return code.
|
|
-$compiler_pid = open3('<&STDIN', \*GCCOUT, \*GCCOUT, $compiler, @ARGV);
|
|
+ # Get the terminal type.
|
|
+ my $terminal = $ENV{"TERM"} || "dumb";
|
|
+
|
|
+ # If it's in the list of terminal types not to color, or if
|
|
+ # we're writing to something that's not a tty, don't do color.
|
|
+ if (! -t STDOUT || $nocolor{$terminal})
|
|
+ {
|
|
+ exec $compiler, @ARGV
|
|
+ or die("Couldn't exec");
|
|
+ }
|
|
+
|
|
+ # Keep the pid of the compiler process so we can get its return
|
|
+ # code and use that as our return code.
|
|
+ $compiler_pid = open3('<&STDIN', \*GCCOUT, \*GCCOUT, $compiler, @ARGV);
|
|
+}
|
|
|
|
# Colorize the output from the compiler.
|
|
while(<GCCOUT>)
|
|
{
|
|
- if (m/^(.*?):([0-9]+):(.*)$/) # filename:lineno:message
|
|
+ if (m#^(.+?\.[^:/ ]+):([0-9]+):(.*)$#) # filename:lineno:message
|
|
{
|
|
- $field1 = $1 || "";
|
|
- $field2 = $2 || "";
|
|
- $field3 = $3 || "";
|
|
+ my $field1 = $1 || "";
|
|
+ my $field2 = $2 || "";
|
|
+ my $field3 = $3 || "";
|
|
|
|
if ($field3 =~ m/\s+warning:.*/)
|
|
{
|
|
@@ -232,6 +271,10 @@
|
|
}
|
|
print("\n");
|
|
}
|
|
+ elsif (m/^:.+`.*'$/) # filename:message:
|
|
+ {
|
|
+ srcscan($_, $colors{"warningMessageColor"});
|
|
+ }
|
|
elsif (m/^(.*?):(.+):$/) # filename:message:
|
|
{
|
|
# No line number, treat as an "introductory" line of text.
|
|
@@ -244,11 +287,9 @@
|
|
}
|
|
}
|
|
|
|
-# Get the return code of the compiler and exit with that.
|
|
-waitpid($compiler_pid, 0);
|
|
-exit ($? >> 8);
|
|
-
|
|
-
|
|
-
|
|
-
|
|
-
|
|
+if ($compiler_pid)
|
|
+{
|
|
+ # Get the return code of the compiler and exit with that.
|
|
+ waitpid($compiler_pid, 0);
|
|
+ exit ($? >> 8);
|
|
+}
|
|
--- a/colorgccrc
|
|
+++ b/colorgccrc
|
|
@@ -20,12 +20,14 @@
|
|
# For example, srcColor: bold cyan on_yellow
|
|
#
|
|
|
|
-# Define the paths to the actual location of the various compilers.
|
|
+# Only define the paths to the actual location of the various compilers if
|
|
+# you need to do something weird. For normal installs, we'll figure out
|
|
+# who to call next automatically.
|
|
# (Currently, colorgcc only understands these: g++ gcc c++ cc)
|
|
-g++: /usr/local/bin/g++
|
|
-gcc: /usr/local/bin/gcc
|
|
-c++: /usr/local/bin/c++
|
|
-cc: /usr/bin/cc
|
|
+##g++: /usr/bin/g++
|
|
+##gcc: /usr/bin/gcc
|
|
+##c++: /usr/bin/c++
|
|
+##cc: /usr/bin/cc
|
|
|
|
# Don't do color if our terminal type ($TERM) is one of these.
|
|
# (List all terminal types on one line, seperated by whitespace.)
|
|
@@ -43,12 +45,10 @@
|
|
|
|
# Warnings
|
|
warningFileNameColor: reset
|
|
-warningNumberColor: white
|
|
+warningNumberColor: blue
|
|
warningMessageColor: yellow
|
|
|
|
# Errors
|
|
errorFileNameColor: reset
|
|
-errorNumberColor: white
|
|
+errorNumberColor: blue
|
|
errorMessageColor: bold red
|
|
-
|
|
-
|
|
--- a/INSTALL
|
|
+++ b/INSTALL
|
|
@@ -27,9 +27,9 @@
|
|
When "g++" is invoked, colorgcc is run instead. colorgcc looks at the
|
|
program name to figure out which compiler to use.
|
|
|
|
-Copy the sample colorgccrc file to $HOME/.colorgccrc and make sure the
|
|
-absolute paths for the compilers are correct for your system.
|
|
-See the comments in the sample .colorgccrc for more information.
|
|
+Modify the file /etc/colorgcc/colorgccrc if you want to change the default
|
|
+values for everyone. For individual customizations, copy this file to
|
|
+$HOME/.colorgccrc and change that.
|
|
|
|
|
|
Note:
|