Тестовая система сборки ======================= Эта система сборки позволяет рекурсивно обходить дерево зависимостей, описанного с помощью файловой системы и метаинформации в Makefile'ах. Формат метаинформации и более подробную информацию см. в задании (файл `PROBLEM`). ### Требования к работе системы сборки * GNU Make * bash (используется башизм) ### Как использовать ```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'ом.