Два упрощенных 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
на эту отдельную машину.
ВОПРОС
- Если makefile2 запускается с использованием
distcc
без синхронизированной распределенной файловой системы, аt2
являетсяmake
d на другом компьютере, возникнет ли ошибка сборки, посколькуa.txt
отсутствует на другом компьютере? - Какие есть варианты для распределенной файловой системы Linux?