Как заставить ccache не передавать полный путь к компилятору distcc
(Это отличается от вопроса ccache и абсолютного пути, так как я хочу, чтобы только путь команды не раскрывался на хост-машине ccache)
При совместном использовании ccache и distcc ccache расширяет компилятор до абсолютного пути, и тогда distcc не может использовать PATH на удаленной машине, чтобы выбрать, какой компилятор использовать.
например, я звоню CCACHE_PREFIX=distcc ccache g++ foo.cc
и ccache расширяет это на локальный шаг предварительной обработки и проверку кэша, а затем вызывает distcc как distcc /usr/bin/g++
, что является неверной версией (g++ находится в пути на удаленном компьютере до /usr/bin, но это вовсе не дает ему возможности искать путь).
У меня есть несколько разных машин, используемых в качестве хостов distcc, и они имеют одинаковую версию gcc/g++, установленную в разных местах (да, эта проблема исчезнет, если я помещу их все где-то вроде / usr / local, но я не могу сделать это в данный момент).
Есть ли настройка, чтобы ccache передавался просто g++
вместо distcc расширить путь к абсолютному пути локального компилятора? Я не совсем против исправления ccache, если нет настроек, но это последнее средство:)
2 ответа
Оказывается, есть простой способ сделать это: просто используйте обертку для CCACHE_PREFIX
вместо distcc
напрямую, с чем-то вроде этого:
Файл: distcc-wrap.sh
#!/bin/sh
compiler=$(basename $1)
shift
exec distcc "$compiler" "$@"
export CCACHE_PREFIX=distcc-wrap.sh
и тогда это позволяет удаленному компилятору жить в другом месте, и distcc будет искать его в PATH.
(Спасибо Джоэлу в списке рассылки ccache за этот ответ; см. http://www.mail-archive.com/ccache@lists.samba.org/msg00670.html оригинальное сообщение)
Я пробую решение Дэвида, но сталкиваюсь с проблемой "distcc, кажется, вызвал себя рекурсивно!" в обычном режиме distcc. Это связано с тем, что, когда host distcc выполняет предварительную обработку (cpp), он вызывает ccache хоста, но distcc-wrap
перехватывает и порождает вложенный distcc и формирует рекурсивный вызов:
g ++ -> ccache -> distcc -> distcc-wrap -> препроцесс с использованием g++ -> ccache -> distcc -> .... и так далее.
Мое решение заключается в использовании DISTCC_CMDLIST
, от man distccd
:
DISTCC_CMDLIST
Если задана переменная среды DISTCC_CMDLIST, загрузите список поддерживаемых команд из файла с именем DISTCC_CMDLIST и откажитесь от обслуживания любой команды, последние слова которой DISTCC_CMDLIST_MATCHWORDS не соответствуют командам в этом списке. Смотрите комментарии в src/serve.c.
Предполагая, что на удаленной машине вы хотите использовать /usr/local/ccache/g++
(который является simulink для /usr/bin/ccache
) чтобы выполнить компиляцию, вместо использования абсолютного пути, развернутого на хост-машине, вы можете сделать так:
создать файл
/path/to/.distcc/DISTCC_CMDLIST
с этой строкой:/usr/local/ccache/g++
export DISTCC_CMDLIST=/path/to/.distcc/DISTCC_CMDLIST
перезапустить distccd демон
distccd --no-detach -a <host IPs> --daemon
Что произойдет, когда удаленный сервер distcc получит расширенную команду от хоста lke /usr/bin/g++ main.cc -c
, он отобразит реальный компилятор из /usr/bin/g++ в /usr/local/ccache/g++. Сопоставление выполняется:
получить базовое имя из пути компилятора при получении команды (
g++
в этом случае)Поиск файла DIST_CMDLIST, чтобы увидеть, если какая-либо строка имеет базовое имя, равное
g++
, В этом случае это будет/usr/local/ccache/g++
перезаписать команду на
/usr/local/ccache/g++ main.cc -c
, который вызовет ccache на удаленном сервере.
Выше приведен только пример, и вы можете расширить отображение компилятора, изменив значение DISTCC_CMDLIST_NUMWORDS с 1 на другие значения, чтобы сделать больше трюков.