Как заставить 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, если настройки еще нет, но это последнее средство :)


person David Gardner    schedule 06.06.2011    source источник


Ответы (2)


Оказывается, есть простой способ сделать это: просто использовать оболочку для CCACHE_PREFIX вместо distcc напрямую, примерно так:

Файл: distcc-wrap.sh

#!/bin/sh
compiler=$(basename $1)
shift
exec distcc "$compiler" "$@"

export CCACHE_PREFIX=distcc-wrap.sh, а затем это позволяет удаленному компилятору жить в другом месте, и distcc будет искать его в ПУТИ.

(Спасибо Джоэлю из списка рассылки ccache за этот ответ; см. http://www.mail-archive.com/[email protected]/msg00670.html для исходного сообщения)

person David Gardner    schedule 08.06.2011

Я пробую решение Дэвида, но сталкиваюсь с проблемой «похоже, что distcc вызвал себя рекурсивно!» в обычном режиме distcc. Это связано с тем, что когда узел 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) для выполнения компиляции, вместо использования абсолютного пути, расширенного хост-машиной, вы можете сделать следующее:

  1. создайте файл /path/to/.distcc/DISTCC_CMDLIST с этой строкой:

    /usr/local/ccache/g++

  2. export DISTCC_CMDLIST=/path/to/.distcc/DISTCC_CMDLIST

  3. перезапустить демон distccd distccd --no-detach -a <host IPs> --daemon

Что произойдет, если удаленный сервер distcc получит расширенную команду от хоста lke /usr/bin/g++ main.cc -c, он отобразит реальный компилятор из / usr / bin / g ++ в / usr / local / ccache / g ++. Сопоставление выполняется:

  1. получить базовое имя из пути компилятора в принимающей команде (g++ в данном случае)

  2. Найдите файл DIST_CMDLIST, чтобы узнать, имеет ли какая-либо строка базовое имя, равное g++. В этом случае это будет /usr/local/ccache/g++

  3. перезапишите команду на /usr/local/ccache/g++ main.cc -c. который вызовет ccache на удаленном сервере.

Вышеупомянутое является всего лишь примером, и вы можете расширить сопоставление компилятора, изменив значение DISTCC_CMDLIST_NUMWORDS с 1 на другие значения, чтобы сделать больше трюков.

person wilson100    schedule 23.05.2016