gcc ccache

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:

Mejorando la salida de g ++


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