Два упрощенных make-файла
makefile1
a.txt:
echo “123144234” > a.txt
t2: a.txt
cat a.txt > b.txt
makefile2
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 на другом компьютере, там будет b Ошибка сборки, поскольку a.txt
отсутствует на другом компьютере? - Какие есть варианты для распределенной Linux файловой системы?