Я пробую решение Дэвида, но сталкиваюсь с проблемой "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++
(что аналогично /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++
)
Lookup DIST_CMDLISTфайл, чтобы увидеть, если любая строка имеет базовое имя равно g++
.В этом случае /usr/local/ccache/g++
перезапишет команду на /usr/local/ccache/g++ main.cc -c
.который вызовет ccache на удаленном сервере.
Выше приведен только пример, и вы можете расширить отображение компилятора, изменив значение DISTCC_CMDLIST_NUMWORDS с 1 на другоезначения, чтобы сделать больше трюков.