Ayuda con perl para modificar el script colormake

Hola,
Antes de nada, una pequeña introducción, por si alguien no conoce el script colormake:

Colormake es un script en perl que permite, como su propio nombre indica, colorear la salida de make a la hora de compilar programas. A mí me resulta muy útil, ya que soy muy tiquismiquis con los warnings en el código, y el script me permite detectarlos de una manera muy cómodo de un golpe de vista si la compilación es larga. El programa se puede descargar de http://bre.klaki.net/programs/colormake/ o se puede instalar directamente de los repositorios de Debian.

Bien, ahora vamos con el problema:

En mi caso, prefiero descargarme el código de la página y hacerle algunas pequeñas modificaciones. Una de ellas es la redefinición de algunos colores, cosa que no supone ningún problema. La otra modificación que hago es, en realidad, un añadido. Los únicos compiladores que vienen definidos son las de GNU y, como quiera que yo testeo mis programas con otros muchos (tcc, pcc, clang, intel, sun, etc.), he añadido sus nombres al script para que resalte las líneas correspondientes. El problema es que no sé si alguno de esos nombres contiene algún carácter raro o especial para perl, pero hay nombres para los que no resalta la línea (por ejemplo, para tcc y opencc). Pego el código debajo por si a alguien se le ocurre algo.

#!/usr/bin/perl
#
# colormake.pl 0.3
#
# Copyright: (C) 1999, Bjarni R. Einarsson <bre@netverjar.is>
#                      http://bre.klaki.net/
#
#
   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 2 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, write to the Free Software
#   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#

# He añadido más compiladores para el resaltado

# Some useful color codes, see end of file for more.
#
$col_ltgray =       "\033[37m";
$col_purple =       "\033[35m";
$col_green =        "\033[32m";
$col_cyan =         "\033[36m";
$col_brown =        "\033[33m";
$col_norm =         "\033[00m";
$col_background =   "\033[07m";
$col_brighten =     "\033[01m";
$col_underline =    "\033[04m";
$col_blink =     "\033[05m";
$col_red =          "\033[31m",

# Customize colors here...
#
$col_default =      $col_ltgray;
$col_gcc =          $col_purple . $col_brighten;
$col_make =         $col_cyan;
$col_filename =     $col_brown;
$col_linenum =      $col_cyan;
$col_trace =        $col_brown;
$col_warning =      $col_green;
$tag_error =        "";
$col_error =        $tag_error . $col_red . $col_brighten;
$error_highlight =  $col_brighten;

# Get size of terminal
#
$lines = shift @ARGV || 0;
$cols  = shift @ARGV || 0;
$cols -= 19;

$in = 'unknown';
$| = 1;
while (<>)
{
$orgline = $thisline = $_;

# Remove multiple spaces
$thisline =~ s/  \+/ /g;

# Truncate lines.
# I suppose this is bad, but it's better than what less does!
if ($cols >= 0)
{
    $thisline =~ s/^(.{$cols}).....*(.{15})$/$1 .. $2/;
}

# make[1]: Entering directory `/blah/blah/blah'
if ($thisline =~ s/^((p|g)?make\[)/$col_make$1/x)
{
$in = 'make';
}
elsif ($thisline =~ s/^(\s*(g?cc|(g|c)\+\+|gfortran|g77|g95|f77|f90|f95|
                            i586-mingw32msvc-gcc|i586-mingw32msvc-g\+\+|
                            i586-mingw32msvc-gfortran|
                            mkoctfile|clang|llvm|llvm-gcc|
                            mcc|mcxx|plaincc|plaincxx|
                            tcc|pcc|ack|nwcc|vc|tendracc|lcc|owcc|icc|
                            opencc|openCC|openf90|openf95|
                            c89|c99|CC|suncc|sunCC|sunf77|sunf90|sunf95|
                            pgcc|pgCC|pgf77|pgf95|pgfortran|
                            libtool: compile:).*)$/$col_gcc$1$col_norm/)
{
$in = 'gcc';
}
elsif ($thisline =~ /^(\s*\(|\[|a(r|wk)|c(p|d|h(mod|own))|do(ne)?|
                       e(cho|lse)|f(ind|or)|i(f|nstall)|mv|perl|
                       r(anlib|m(dir)?)|s(e(d|t)|trip)|tar)\s+/)
{
$in = $1;
}
elsif ($in eq 'gcc')
{
# Do interesting things if make is compiling something.

if (($thisline !~ /[,:]$/) && ($thisline !~ /warning/))
{
# error?
if ($cols >= 0)
{
# Retruncate line, because we are about to insert "Error:".
my $c = $cols - length($tag_error);
$thisline = $orgline;
    $thisline =~ s/^(.{$c}).....*(.{15})$/$1 .. $2/;
}
$thisline =~ s/(\d+:\s+)/$1$col_default$col_error/;
$thisline = $error_highlight . $thisline . $col_norm;
}
else
{
# warning
$thisline =~ s|(warning:\s+)(.*)$|$1$col_warning$2|;
}

# In file included from main.cpp:38:
# main.cpp: In function int main(...)':
$thisline =~ s/(In f(unction|ile))/$col_trace$1/x;

# /blah/blah/blah.cpp:123:
$thisline =~ s|^([^:]+)|$col_filename$1$col_default|;
$thisline =~ s|:(\d+)([:,])|:$col_linenum$1$col_default$2|;
}

if ($thisline !~ /^\s+/)
{
print $col_norm, $col_default;
}
print $thisline;
}

print $col_norm;

# UNUSED:
#
#%colors = (
#    'black'     => "\033[30m",
#    'red'       => "\033[31m",
#    'green'     => "\033[32m",
#    'yellow'    => "\033[33m",
#    'blue'      => "\033[34m",
#    'magenta'   => "\033[35m",
#    'purple'    => "\033[35m",
#    'cyan'      => "\033[36m",
#    'white'     => "\033[37m",
#    'darkgray'  => "\033[30m");

De entrada la línea 35 está mal

$col_red = "\033[31m",

tienes una coma al final en vez de ;

Gracias, corregido. Era una de las definiciones de color que había hecho y, como el script funciona, no me sabía que estaba mal. De todas formas, sigo teniendo el problema de que no colorea con algunos compiladores.

jgpallero escribió:

Gracias, corregido. Era una de las definiciones de color que había hecho y, como el script funciona, no me sabía que estaba mal. De todas formas, sigo teniendo el problema de que no colorea con algunos compiladores.

En tal caso deberías indicar que compiladores y sus versiones.

nerve_net escribió:

En tal caso deberías indicar que compiladores y sus versiones.

¿¿??

tentativamente por ejemplo, dices que tienes un problema con tcc, para lanzar un script con tcc tienes que tenerlo en el encabezado, si el encabezado remite a gcc quizás no funcione, sería una cosa a comprobar.

pvaldes escribió:

tentativamente por ejemplo, dices que tienes un problema con tcc, para lanzar un script con tcc tienes que tenerlo en el encabezado, si el encabezado remite a gcc quizás no funcione, sería una cosa a comprobar.

Lo siento, pero no te he entendido. Yo, sin saber nada de perl, intuyo que el trozo de código

elsif ($thisline =~ s/^(\s*(g?cc|(g|c)\+\+|gfortran|g77|g95|f77|f90|f95|
                            i586-mingw32msvc-gcc|i586-mingw32msvc-g\+\+|
                            i586-mingw32msvc-gfortran|
                            mkoctfile|clang|llvm|llvm-gcc|
                            mcc|mcxx|plaincc|plaincxx|
                            tcc|pcc|ack|nwcc|vc|tendracc|lcc|owcc|icc|
                            opencc|openCC|openf90|openf95|
                            c89|c99|CC|suncc|sunCC|sunf77|sunf90|sunf95|
                            pgcc|pgCC|pgf77|pgf95|pgfortran|
                            libtool: compile:).*)$/$col_gcc$1$col_norm/)
{
$in = 'gcc';
}

indica que cualquier línea que comience por una de las palabras de finidas en la lista es una llamada de compilación, cosa que parece que se indica en la variable $in con el código 'gcc'. Más adelante, según el valor de $in, se colorea la línea o no. Por eso creo que el problema viene de algún conflicto con las cadenas identificadores de los compiladores que he añadido, no de que el compilador realmente exista o no.

jgpallero escribió:
nerve_net escribió:

En tal caso deberías indicar que compiladores y sus versiones.

¿¿??

Aunque has mencionado los compiladores no así sus versiones, de una versión a otra de compilador pueden cambiar cosas que hagan que este script deje de funcionar.

En ese sentido y sobre todo si pretendes que otro pruebe el comportamiento del script para corregir errores es necesario probar con la misma versión que utilices tú.

nerve_net escribió:
jgpallero escribió:
nerve_net escribió:

En tal caso deberías indicar que compiladores y sus versiones.

¿¿??

Aunque has mencionado los compiladores no así sus versiones, de una versión a otra de compilador pueden cambiar cosas que hagan que este script deje de funcionar.

En ese sentido y sobre todo si pretendes que otro pruebe el comportamiento del script para corregir errores es necesario probar con la misma versión que utilices tú.

Pero es que el script no necesita para nada los compiladores. El problema se reduce a que una línea que debería aparecer coloreada en pantalla (porque comienza con una determinada palabra, en este caso el nombre con el que se invoca a un compilador) sale en el color por defecto de la consola.

jgpallero escribió:
nerve_net escribió:
jgpallero escribió:
nerve_net escribió:

En tal caso deberías indicar que compiladores y sus versiones.

¿¿??

Aunque has mencionado los compiladores no así sus versiones, de una versión a otra de compilador pueden cambiar cosas que hagan que este script deje de funcionar.

En ese sentido y sobre todo si pretendes que otro pruebe el comportamiento del script para corregir errores es necesario probar con la misma versión que utilices tú.

Pero es que el script no necesita para nada los compiladores. El problema se reduce a que una línea que debería aparecer coloreada en pantalla (porque comienza con una determinada palabra, en este caso el nombre con el que se invoca a un compilador) sale en el color por defecto de la consola.

Bjarni escribió:

Colormake
---------

This is a simple wrapper for making the output from make easier to read
(more colorful), and errors easier to find in messy compilations. It was
inspired by Micheal T. Babcock's excellent logcolorize program.

Por otro lado make invoca el compilador que se le indique en el fichero makefile, así que la salida make durante la compilación son los del compilador, no de make.

Por ir más rápidos, pega un ejemplo de la cadena que no se colorea.

va a ser mejor, sí...