Как заставить ccache не передавать полный путь к компилятору distcc - PullRequest
4 голосов
/ 06 июня 2011

(Это отличается от вопроса 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 ]

6 голосов
/ 08 июня 2011

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

1 голос
/ 23 мая 2016

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

  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. Lookup DIST_CMDLISTфайл, чтобы увидеть, если любая строка имеет базовое имя равно g++.В этом случае /usr/local/ccache/g++

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

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

...