Многофайловая сборка
Сначала про настройку окружения
- .dircolors; grep; man; PS1 
- vim: цветовые схемы, *~-файлы, vimbackup 
- zsh/bash: раскраска командной строки, алиасы 
- велосипедный парк
- ???
Сборка из нескольких файлов
- Зачем много файлов? - Быстрее компилировать не все
- Проще ориентироваться
- Си: пространства имён!
 пример пример
 
- Скомпилировать сразу все файлы?
- (пере)компиляция только изменённых - Компиляция до .o 
- (повтор: сложность компоновки вручную с помощью ld) 
 
 
Make
Проблемы многофайловой сборки: вручную муторно, сценарий делает много лишнего
- Перекомпиляция только обновлённых исходников - Построение графа зависимостей и подграфа пересборки
 
- Удаление генератов - В том числе того, что разработчик считает генератом 
 
- Скриптование / code reuse приёмов сборки - в т. ч. уникальных для проекта
 
ТАБУЛЯЦИИ!
Gnu make
(есть много, но этот популярнее всех остальных, вместе взатых)
- Цели и рецепты - Как правило «как создать файл из других файлов» (например, prog.o из prog.c) 
- Вариант: «как создать файл определённого типа из других файлов другого определённого типа» (например .o из .c 
 
- Командный интерпретатор ОС в качестве языка сценариев (как правило, shell) - ⇒ нужен shell под системы без shell
 
- Переменные - Специальные переменные
- Подстановка
- Отложенное и немедленное присваивание
 
- Много правил по умолчанию
- … (что успеем)
Литература по GNU Make
- Очень старый учебник по старому Make (зато подробный и с объяснениями) 
- Книга Владимира Игнатова Эффективное использование GNU Make 
Пример
См. FrBrGeorge/MakefileExample
(не успели) Другие низкоуровневые системы сборки
- Ориентированные на ЯП и особенности сред программирования Apache_Ant/Apache_Maven (Java), Cabal (Haskell), ASDF (Lisp/CLisp), Boost.Build… 
∃ Более высокий уровень — инструменты генерации сборочных сценариев (+окружение, +варианты сборки, +параметризация, +…), об этом после
Д/З
- Прочитать и прощёлкать  - по возможности учебник по Make (про интеграцию с SCCS можно не читать). Есть ли отличия в поведении от GNU Make? 
 
- В репозитории с Д/З сделать (вложенный) подкаталог 04_Multifile и поместить туда код из Пример применения make - Убедиться, что он работает. Исправить ошибки, если они есть)
- Доделать Makefile так, чтобы - Собирались две библиотеки: liboutput_static.a и liboutput.so из файлов fun.o и const.o 
- Собиралось три бинарника: prog (из .o-фйалов), prog-a (из prog.o и liboutput_static.a) и prog-so (из prog.o и liboutput.so) 
- Имелась цель test:, для достижения которой каждый из трёх бинарников запускается без параметров (обратите внимание на перенаправление stderr), с одним каким-нибудь параметром и с тремя параметрами (для каждого бинарника параметры одинаковые). Затем выводы соответствующих запусков сравниваются (например, с помощью cmp file1 file2) 
- И чтобы все генераты удалались!
 
 
