Попытка объединить кэш и colorgcc. Текст следующей ссылки:
Когда выполнение g ++ - версия получает:
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
Какие-либо идеи, как решить его?
Без исправления самого colorgcc.pl
самый простой способ исправить это - написать простую оболочку сценарий для каждой команды, вызывая ccache
с соответствующими аргументами для этой команды и передавая аргументы, полученные сценарием (фактически каррирование вызова ccache
).
Например, для gcc :
/usr/local/bin/ccache-gcc.sh:
#! / Bin / bash
ccache / usr / bin / gcc "$ @"
~ / .colorgcc:
gcc: /usr/local/bin/ccache-gcc.sh
и для g ++ :
/ usr / local / bin / ccache-g ++. Sh:
#! / Bin / bash
ccache / usr / bin / g ++ "$ @"
~ / .colorgcc:
gcc: /usr/local/bin/ccache-g++.sh
Есть способы очистить это, чтобы вы использовали только один скрипт с символическими ссылками. для каждого варианта, но они выходят за рамки данного ответа, и я оставляю их вам в качестве упражнения: -)
Проблема em заключается в том, что сценарий обрабатывает все, что находится справа от двоеточия в файле prefs, как «команду», переданную в exec, а не как «команду» и дополнительные «аргументы». Т.е. в вашем случае сценарий пытается сделать следующее:
Неверно:
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
, которая разбивает одну строку аргументов на несколько ожидаемых execvp
, срабатывает только тогда, когда exec
получает единственный аргумент. В colorgcc.pl
вызов exec
выглядит (примерно) так:
exec "${program}" @ARGV
где $ {program}
берется из вашей конфигурации (или значений по умолчанию ), а @ARGV
- это список аргументов, которые вы передали, когда (косвенно) вызывали colorgcc.pl
. В вашем случае $ {program}
, буквально, ccache / usr / bin / g ++
(одна строка, как указано выше), тогда как должно быть просто ccache
, при этом / usr / bin / g ++
добавляется к @ARGV
.
(Некоторые из вас могут задаться вопросом, почему я так старался объяснить это, когда это однострочное исправление для colorgcc.pl
. Это правда, но если бы я только это сделал, мир потеряет еще одну возможность узнать об этом классе ошибок. Плюс, я не получил бы столько голосов.)