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

  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 на другие значения, чтобы сделать больше трюков.

Другие вопросы по тегам