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
Любые идеи, как его решить?
Ответы
Ответ 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 пытается это сделать:
Но это должно быть сделано:
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