distcc — в каких случаях требуется синхронизированная сетевая файловая система

Два упрощенных make-файла

сделать файл1

a.txt:
    echo “123144234” > a.txt

t2: a.txt
    cat a.txt > b.txt

сделать файл2

t1:
    echo “123144234” > a.txt

t2: t1
    cat a.txt > b.txt

Оба make-файла имеют одинаковую функциональность.

Оба make-файла могут выполняться параллельно, поскольку зависимость от t2 от t1.

Однако есть критическая разница, которая может?/делает? иметь значение, когда речь идет о распределенных сборках.

В makefile1 t2 напрямую зависит от артефакта a.txt, который также совпадает с именем самой цели a.txt. Однако в makefile2, несмотря на то, что рецепт и артефакт t1 такие же, как и для a.txt, имя цели не a.txt.

Это отличие является ключевым, поскольку gnu make (и я предполагаю, что distcc) НЕ анализирует задание и не анализирует файловую систему во время выполнения, чтобы определить все артефакты для данной цели. В makefile2 gnu make НЕ создает НИКАКОЙ связи между a.txt и t1.

Когда сборка выполняется как make -j, то есть параллельно, но не распределено, эта разница не имеет значения, поскольку все цели make выполняются на одном компьютере, то есть все экземпляры make имеют доступ к одной и той же файловой системе.

Но давайте подумаем, что может?/делает? произойти во время распределенной сборки, если две цели построены на двух разных машинах.

В обоих make-файлах рецепт для t2 будет запускаться ПОСЛЕ рецепта для a.txt/t1.

Однако в makefile1 зависимость t2 от a.txt является явной, то есть distcc знает, что для make t2 на отдельной машине он должен отправить файл a.txt на эту отдельную машину.

ВОПРОС

  1. Если makefile2 запускается с использованием distcc без синхронизированной распределенной файловой системы, а t2 является maked на другом компьютере, возникнет ли ошибка сборки, поскольку a.txt отсутствует на другом компьютере?
  2. Какие есть варианты для распределенной файловой системы Linux?

person Bob    schedule 11.02.2020    source источник


Ответы (1)


distcc — это просто замена gcc. Он использует локальный gcc для предварительной обработки исходного файла, затем отправляет его для компиляции на другую машину, получает обратно объектный файл и сохраняет его в локальной файловой системе. distcc не требует общей сетевой файловой системы или синхронизации часов между участвующими хостами.

Существует также новая функция «накачки», которая выполняет предварительную обработку на удаленных серверах, но также не требует общей сетевой файловой системы или синхронизации часов.

Ваш make всегда работает локально.

Отвечая на ваши вопросы:

  1. distcc не запускается make. make запускает distc вместо gcc. make проверяет зависимости и их временные метки локально.
  2. make работает локально, и ему все равно, является ли используемая файловая система локальной или сетевой.
person Maxim Egorushkin    schedule 18.02.2020
comment
Имеет смысл, что на других машинах запускается только команда компиляции, а не весь рецепт make. Тогда вам вообще не нужно заботиться о моем деле. - person Bob; 18.02.2020
comment
@Bob Рецепт также работает локально. Он работает distcc локально, который внутри взаимодействует с distcc серверами. - person Maxim Egorushkin; 18.02.2020