g ++, colorgcc и кэш

Попытка объединить кэш и colorgcc. Текст следующей ссылки:

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

Когда выполнение 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

Какие-либо идеи, как решить его?

21
задан dimba 3 January 2010 в 16:07
поделиться

1 ответ

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

Без исправления самого 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 . Это правда, но если бы я только это сделал, мир потеряет еще одну возможность узнать об этом классе ошибок. Плюс, я не получил бы столько голосов.)

17
ответ дан 29 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: