1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
Тестовая система сборки
=======================
Эта система сборки позволяет рекурсивно обходить дерево зависимостей,
описанного с помощью файловой системы и метаинформации в 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'ом.
<!--
# vim: set ft=markdown:
-->
|