aboutsummaryrefslogtreecommitdiff

Тестовая система сборки

Эта система сборки позволяет рекурсивно обходить дерево зависимостей, описанного с помощью файловой системы и метаинформации в 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'ом.