Подтвердить что ты не робот

G++, colorgcc и ccache

Попытка комбинировать ccache и colorgcc. Следуя текст ссылки:

  • my g++ - это мягкая ссылка на colorgcc
  • ~/.colorgccrc содержит строку: "g++: ccache/usr/bin/g++"

При запуске g++ --version получите:

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

Любые идеи, как его решить?

4b9b3361

Ответ 1

Просто наткнулся на эту же проблему. Для меня проблема может быть решена путем тщательной настройки переменных среды:

# 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"

Тогда все, что мне нужно было сделать, это отредактировать файл конфигурации colorgcc (/etc/colorgcc/colorgcc или ~/.colorgcc) и сказать ему вместо этого вызвать 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

Это, конечно, работает только если у вас есть символические ссылки colorgcc, установленные в /usr/lib/colorgcc/bin и символические ссылки ccache в /usr/lib/ccache/bin - соответственно отрегулируйте.

Ответ 2

Короткий ответ

Не исправляя colorgcc.pl сам, самый простой способ исправить это - написать себе простую оболочку script для каждой команды, вызвав ccache с соответствующими аргументами для этой команды и пропустив аргументы script получено (фактически currying вызов ccache.)

Например, для gcc:

  • /usr/local/bin/ccache-gcc.sh:

    #!/bin/bash
    ccache /usr/bin/gcc "[email protected]"
    
  • ~/.colorgcc:

    gcc: /usr/local/bin/ccache-gcc.sh
    

и для g++:

  • /USR/локальные/бен/CCache-г ++ ш:.

    #!/bin/bash
    ccache /usr/bin/g++ "[email protected]"
    
  • ~/.colorgcc:

    gcc: /usr/local/bin/ccache-g++.sh
    

Есть способы очистить это, так что вы используете только один script, с символическими ссылками для каждого варианта, но это выходит за рамки этого ответа, и я оставляю их вам как упражнение: -)

Длительный ответ

Проблема заключается в том, что script обрабатывает все справа от двоеточия в файле prefs как "команда", переданную exec, а не как "команда" и "дополнительные" аргументы. I.e., В вашем случае, script пытается это сделать:

  • Неправильно:

    exec "ccache /usr/bin/g++" "--version"
    

    (т.е. " ccache/usr/bin/g++" - это один аргумент.)

Но это должно быть сделано:

  • Правильно:

    exec "ccache" "/usr/bin/g++" "--version"
    

    (т.е. ccache "и" /usr/bin/g++ "являются двумя отдельными аргументами.)

Perl exec в конечном итоге вызывает execvp, возможно, применив некоторые аргументы "сделайте, что я имею в виду", к его аргументам. execvp, то делает некоторые собственные DWIM. Perl exec pre-processing, которая разбивает одну строку аргумента на множество аргументов execvp, ожидает только, когда exec получает один аргумент. В colorgcc.pl вызов exec выглядит примерно так:

exec "${program}" @ARGV

где ${program} происходит из вашей конфигурации (или по умолчанию), а @ARGV - это список аргументов, которые вы передали, когда вы (косвенно) вызывали colorgcc.pl. В вашем случае ${program} буквально ccache /usr/bin/g++ (одна строка, как указано выше), когда она должна быть просто ccache, причем /usr/bin/g++ добавляется к @ARGV.


(Некоторые из вас могут задаться вопросом, почему я столкнулся со всей проблемой, объясняя это, когда это однострочное исправление для colorgcc.pl. Это правда, но если бы я просто сделал это, мир потерял бы еще одну возможность чтобы узнать об этом классе ошибок. Кроме того, я не получил бы столько голосов.)

Ответ 3

Быстрый ответ

Лучше не изменять системные файлы. здесь приведены некоторые переменные и простая функция colorgcc для вывода вывода вашей компиляции. Вы теряете код возврата, но можете поступить иначе, если вам это действительно нужно.

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; '
    }

используйте его так:

./configure | tee -a yourlog.configure.log | colorgcc
make | tee -a yourlog.make.log | colorgcc
make install | tee -a yourlog.install.log | colorgcc

Ответ 4

Вот как исправлять colorgcc. Проблема заключается в

exec $compiler, @ARGV

и

$compiler_pid = open3('<&STDIN', \*GCCOUT, '', $compiler, @ARGV);

$compiler находится в вашем случае "ccache/usr/bin/g++". Нам нужно изменить его так, чтобы $compiler - ccache и /usr/bin/g ++ добавлено к @ARGV

После строки

$progName = $1 || $0;

выполните следующие изменения:

$shell_command = $compilerPaths{$progName} || $compilerPaths{"gcc"};
@shell_array = split(' ',$shell_command);
$compiler = shift @shell_array;
if ( scalar (@shell_array) > 0 ) {
  unshift (@ARGV, @shell_array);
}

заменить строку

$compiler = $compilerPaths{$progName} || $compilerPaths{"gcc"};

Йирка

Ответ 5

Для меня лучшим решением является это. После установки ccache на Fedora у меня есть следующее в PATH:

PATH =/USR/lib64/CCache:/USR/локальные/бен:/USR/бен:/бен

и команда gcc вызовет двоичный файл ccache:

который gcc

/USR/lib64/CCache/НКУ

Чтобы создать цепочку вызовов gcc → color-gcc → ccache → gcc

Мне нужно просто создать следующие псевдонимы:

alias gcc="color-gcc"
alias g++="color-gcc"

Поместите эти две строки в конец ~/.bashrc и все готово! Нет необходимости создавать символические ссылки или исправить источник color-gcc.

(Если вы используете другую оболочку, чем BASH, вам нужно будет поместить псевдонимы в соответствующий файл настроек оболочки)

Йирка

Ответ 6

есть еще один способ раскрасить GCC, который, я думаю, намного проще установить, потому что вам не нужно редактировать какие-либо системные файлы, такие как .bash. Кроме того, он основан на Ruby, который позволяет широко настраивать с помощью Ruby gems. Например, GilCC показывает # предупреждения, количество ошибок и время компиляции, очень удобно, когда вы хотите очистить или улучшить время сборки.

вот ссылка на stackoverflow, которая говорит о GilCC:

Улучшение вывода g++

Ответ 7

Как уже говорили другие, речь идет о настройке путей и символических ссылок.

Следуйте бесценному Arch guide по этому вопросу.

Я делаю это много раз и является такой сложной настройкой, что в итоге я установил оболочку докера с правильной конфигурацией.

Вы можете проверить это здесь

Короче говоря, используйте этот псевдоним

alias mmake='docker run --rm -v "$(pwd):/src" -t ownyourbits/mmake'

и do mmake вместо make