Тестовая система сборки
Эта система сборки позволяет рекурсивно обходить дерево зависимостей,
описанного с помощью файловой системы и метаинформации в Makefile'ах.
Формат метаинформации и более подробную информацию см. в задании (файл
PROBLEM
).
Требования к работе системы сборки
- GNU Make
- bash (используется башизм)
Как использовать
$ ./build-system-shell # войти в shell для сборки
$ make -C src/servers/trading/fix # собрать `src/servers/trading/fix`
$ exit # выйти из shell для сборки
Как работает
Для корректной работы системы необходимо войти в специальный shell. На самом деле это bash с небольшими изменениями:
- третий файловый дескриптор проброшен в /dev/null;
- во все Makefile'ы, собираемые в этом shell'е, будет
инджектиться Makefile.inc, который предоставляет основной механизм сборки
(переменная
MAKEFILES
); - отключается лишний verbose от GNU Make (переменная
MAKEFLAGS
).
make -C %проект%
работает так:
- начинает выполняться цель
build
(от неё зависит цельall
в каждом изMakefile
); - перед началом сборки мы проходимся по списку зависимостей и вызываем для каждой зависимости Makefile;
- после того, как n-ая зависимость собралась, в третий файловый дескриптор пишется весь список собранных в процессе её сборки сущностей, который потом попадает в переменную builtlist;
- перед сборкой n-ой зависимости мы смотрим, нет ли уже в переменной builtlist этой зависимости; если есть, то значит, что она уже была собрана в процессе данной сборки, иначе собираем её;
- в момент каждого дочернего вызова make передаётся переменная BUILTLIST, содержащая список того, что было собрано родительским и дочерними make'ами до этого.
Примечание: третий файловый дескриптор нужен для того, чтобы передавать метаинформацию из дочерних процессов так, чтобы эта информация не перемешивалась с stdout'ом и stderr'ом.