g++, colorgcc y ccache
(7)
Intentando combinar ccache y colorgcc. Siguiente texto del enlace :
- mi g ++ es un enlace suave a colorgcc
- ~ / .colorgccrc contiene la línea: "g ++: ccache / usr / bin / g ++"
Cuando se ejecuta g ++ --version receive:
Can''t exec "ccache /usr/bin/gcc": No such file or directory at /usr/lib/perl5/5.8.8/IPC/Open3.pm line 246.
open3: exec of ccache /usr/bin/gcc --version failed at /usr/local/bin/colorgcc/gcc line 208
¿Alguna idea de cómo resolverlo?
La respuesta corta
Sin parchear colorgcc.pl
, la forma más fácil de solucionar esto es escribir usted mismo un script de envoltura simple para cada comando, invocar ccache
con los argumentos apropiados para ese comando y pasar los argumentos que recibió el guión ( ccache
efectiva la llamada a ccache
.)
Por ejemplo, para gcc :
/usr/local/bin/ccache-gcc.sh:
#!/bin/bash ccache /usr/bin/gcc "$@"
~ / .colorgcc:
gcc: /usr/local/bin/ccache-gcc.sh
y para g ++ :
/usr/local/bin/ccache-g++.sh:
#!/bin/bash ccache /usr/bin/g++ "$@"
~ / .colorgcc:
gcc: /usr/local/bin/ccache-g++.sh
Hay formas de limpiar esto para que solo uses un solo script, con enlaces simbólicos para cada variante, pero esos están más allá del alcance de esta respuesta, y te los dejo como un ejercicio :-)
La respuesta larga
El problema es que la secuencia de comandos trata todo a la derecha de los dos puntos en el archivo de preferencias a medida que el "comando" pasa a exec, no como el "comando" y los "argumentos" adicionales. Es decir, en su caso, el guión termina tratando de hacer esto:
Incorrecto:
exec "ccache /usr/bin/g++" "--version"
(es decir, " ccache / usr / bin / g ++ " es un argumento único).
Pero debería estar haciendo esto:
Correcto:
exec "ccache" "/usr/bin/g++" "--version"
(es decir, " ccache " y " / usr / bin / g ++ " son dos argumentos diferentes ).
El exec
de Perl finalmente llama a execvp
, luego de aplicar posiblemente alguna lógica de "haz lo que quiero decir" a sus argumentos. execvp
luego hace algo de DWIM propio. El preprocesamiento del exec
de Perl, que divide una sola cadena de argumentos en los múltiples argumentos que execvp
espera, solo se execvp
cuando el exec
recibe un único argumento. En colorgcc.pl
, la llamada al exec
ve así (más o menos):
exec "${program}" @ARGV
donde ${program}
proviene de su configuración (o los valores predeterminados), y @ARGV
es la lista de argumentos que pasó cuando (indirectamente) invocó colorgcc.pl
. En su caso, ${program}
es, literalmente, ccache /usr/bin/g++
(una sola cadena, como se indicó anteriormente,) cuando debería ser simplemente ccache
, con /usr/bin/g++
siendo @ARGV
a @ARGV
.
(Algunos de ustedes pueden preguntarse por qué me he tomado la molestia de explicar esto, cuando se trata de una solución de una línea para colorgcc.pl
. Eso es cierto, pero si lo hiciera, el mundo perdería otra oportunidad de aprender sobre esta clase de errores. Además, no recibiría tantos votos).
Solo encontré este mismo problema. Para mí, el problema podría resolverse ajustando cuidadosamente las variables de entorno:
# Make "g++" command call colorgcc
export PATH="/usr/lib/colorgcc/bin:$PATH"
# Tell ccache to invoke compilers in /usr/bin
export CCACHE_PATH="/usr/bin"
Luego, todo lo que tuve que hacer fue editar el archivo de configuración de colorgcc ( /etc/colorgcc/colorgcc
o ~/.colorgcc
) y decirle que llame a ccache:
g++: /usr/lib/ccache/bin/g++
gcc: /usr/lib/ccache/bin/gcc
c++: /usr/lib/ccache/bin/g++
cc: /usr/lib/ccache/bin/gcc
g77: /usr/lib/ccache/bin/g77
f77: /usr/lib/ccache/bin/g77
gcj: /usr/lib/ccache/bin/gcj
Esto, por supuesto, solo funciona si tienes los enlaces simbólicos de colorgcc instalados en /usr/lib/colorgcc/bin
y los enlaces simbólicos de ccache en /usr/lib/ccache/bin
- ajusta en consecuencia.
La respuesta rápida
Mejor no modificar ningún archivo de sistema. aquí hay algunas variables y una función de shell colorgcc simple para canalizar el resultado de su compilación. Pierdes el código de retorno, pero puedes manejarlo de manera diferente si realmente lo necesitas.
n=$(tput setaf 0)
r=$(tput setaf 1)
g=$(tput setaf 2)
y=$(tput setaf 3)
b=$(tput setaf 4)
m=$(tput setaf 5)
c=$(tput setaf 6)
w=$(tput setaf 7)
N=$(tput setaf 8)
R=$(tput setaf 9)
G=$(tput setaf 10)
Y=$(tput setaf 11)
B=$(tput setaf 12)
M=$(tput setaf 13)
C=$(tput setaf 14)
W=$(tput setaf 15)
END=$(tput sgr0)
colorgcc()
{
perl -wln -M''Term::ANSIColor'' -e ''
m/not found$/ and print "$ENV{N}$`$ENV{END}", "$&", "$ENV{END}"
or
m/found$/ and print "$ENV{N}$`${g}", "$&", "$ENV{END}"
or
m/yes$/ and print "$ENV{N}$`${g}", "$&", "$ENV{END}"
or
m/no$/ and print "$ENV{N}$`$ENV{END}", "$&", "$ENV{END}"
or
m/undefined reference to/i and print "$ENV{r}", "$_", "$ENV{END}"
or
m/ Error |error:/i and print "$ENV{r}", "$_", "$ENV{END}"
or
m/ Warning |warning:/i and print "$ENV{y}", "$_", "$ENV{END}"
or
m/nsinstall / and print "$ENV{c}", "$_", "$ENV{END}"
or
m/Linking |/.a/b/ and print "$ENV{C}", "$_", "$ENV{END}"
or
m/Building|gcc|g/+/+|/bCC/b|/bcc/b/ and print "$ENV{N}", "$_", "$ENV{END}"
or
print; ''
}
úsalo así:
./configure | tee -a yourlog.configure.log | colorgcc
make | tee -a yourlog.make.log | colorgcc
make install | tee -a yourlog.install.log | colorgcc
Aquí es cómo parchar colorgcc. El problema es con
exec $compiler, @ARGV
y
$compiler_pid = open3(''<&STDIN'', /*GCCOUT, '''', $compiler, @ARGV);
$ compilador es en su caso "ccache / usr / bin / g ++". Necesitamos cambiarlo para que $ compilador sea ccache y / usr / bin / g ++ se anteponga a @ARGV
Después de la línea
$progName = $1 || $0;
hacer las siguientes modificaciones:
$shell_command = $compilerPaths{$progName} || $compilerPaths{"gcc"};
@shell_array = split('' '',$shell_command);
$compiler = shift @shell_array;
if ( scalar (@shell_array) > 0 ) {
unshift (@ARGV, @shell_array);
}
reemplazando la línea
$compiler = $compilerPaths{$progName} || $compilerPaths{"gcc"};
Jirka
Para mí, la mejor solución es esta. Después de instalar ccache en Fedora, he seguido en mi ruta:
PATH = / usr / lib64 / ccache: / usr / local / bin: / usr / bin: / bin
y el comando gcc llamará a ccache binary:
cual gcc
/ usr / lib64 / ccache / gcc
Para crear una cadena de llamada gcc -> color-gcc -> ccache -> gcc
Solo necesito crear los siguientes alias:
alias gcc="color-gcc"
alias g++="color-gcc"
Pon estas dos líneas al final de ~ / .bashrc ¡y listo! No es necesario crear enlaces simbólicos o corregir la fuente de color-gcc.
(En caso de que esté utilizando otro shell que no sea BASH, deberá colocar los alias en el archivo de configuración del shell apropiado)
Jirka
hay otra manera de colorear GCC que creo que es mucho más fácil de instalar porque no tienes que editar ningún archivo de sistema como .bash Además, está basado en Ruby, que permite una amplia personalización utilizando gemas de Ruby. Por ejemplo, GilCC muestra # de advertencias, # de errores y tiempo de compilación, muy útil cuando desea realizar una limpieza o mejorar el tiempo de compilación.
aquí está el enlace a que habla de GilCC:
Como otros ya han dicho, se trata de establecer caminos y enlaces simbólicos.
Sigue la valiosa guía de Arch sobre esto.
Hago esto tantas veces y es una configuración tan complicada que terminé configurando un contenedor Docker con la configuración correcta.
Puedes verlo aquí
En resumen, usa este alias
alias mmake=''docker run --rm -v "$(pwd):/src" -t ownyourbits/mmake''
y hacer mmake
lugar de make