1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
#!/usr/bin/env perl
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This tool is a "replacement" for make, which wraps the make command around
# a filter that tries to normalize the output such that the filenames are relative
# to the build directory. This passes all arguments passed along to make itself,
# and you can override the "make" command using the MAKE environment variable.
use strict;
use Term::ANSIColor;
my %COLORS = (
"_header" => "italic green",
"_line" => "cyan",
"_message" => "italic magenta",
"error" => "red",
"warning" => "yellow",
"note" => "blue"
);
my $CMD = $ENV{"MAKE"} || "make" . " 2>&1 " . join(" ", @ARGV);
my @DIRS = ();
print colored("Running: $CMD\n", $COLORS{"_header"});
open my $cmd, '-|', $CMD;
while (my $line = <$cmd>) {
if ($line =~ /(error|warning|note):/) {
my $msg = $1;
my @parts = split(/:/, $line);
my $file = $parts[0];
if (substr($file, 0, 1) ne "/") {
$file =~ s/^[\.\/]+//; # Strip leading ./, ../, ../../, etc.
# Lazy eval on this, assuming that we will not find errors typically...
if (!@DIRS) {
@DIRS = split(/\n/, `find . -type d | fgrep -v -e .deps -e .libs -e .git -e .vscode`);
}
foreach (@DIRS) {
if (-f "$_/$file") {
$file = "$_/$file";
last;
}
}
}
print colored("$file:$parts[1]:$parts[2]:", $COLORS{"_line"});
print colored("$msg", $COLORS{"$msg"});
print colored("$parts[4]\n", $COLORS{"_message"});
} else {
print $line;
}
}
|