Многофайловая сборка
Сначала про настройку окружения
.dircolors; grep; man; PS1
vim: цветовые схемы, *~-файлы, vimbackup
- (есть пакет в ALT)
zsh/bash: раскраска командной строки, алиасы
велосипедный парк ~/.local/bin
- ???
Сборка из нескольких файлов
- Зачем много файлов?
- Быстрее компилировать не все
- Проще ориентироваться
- Си: пространства имён!
- Скомпилировать сразу все файлы?
- (пере)компиляция только изменённых
Компиляция до .o
(повтор: сложность компоновки вручную с помощью ld)
Make
Проблемы многофайловой сборки: вручную муторно, сценарий делает много лишнего
- Перекомпиляция только обновлённых исходников
- Построение графа зависимостей и подграфа пересборки
- Удаление мусора и генератов
В том числе того, что разработчик считает генератом
- Скриптование / code reuse приёмов сборки
- в т. ч. уникальных для проекта
ТАБУЛЯЦИИ!
Gnu make
(есть много, но этот популярнее всех остальных, вместе взатых)
- Цели и рецепты
Как правило «как создать файл из других файлов» (например, prog.o из prog.c)
Вариант с шаблоном: «как создать файл определённого типа из других файлов другого определённого типа» (например .o из .c)
- Командный интерпретатор ОС в качестве языка сценариев (как правило, shell)
- ⇒ нужен shell под системы без shell
- Переменные
- Специальные переменные
Подстановка / подстановка с заменой $(foo:.o=.c) / ...
- Отложенная и немедленная подстановка (например, в присваивании)
Много правил по умолчанию, make -p
- условные операторы / функции
- … чёрт в ступе …
- …
Литература по GNU Make
Очень старый учебник по старому Make (зато подробный и с объяснениями)
Книга Владимира Игнатова Эффективное использование GNU Make
Пример
См. FrBrGeorge/MakefileExample
Другие низкоуровневые системы сборки
Ориентированные на ЯП и особенности сред программирования Apache_Ant/Apache_Maven (Java), Cabal (Haskell), ASDF (Lisp/CLisp), Boost.Build…
∃ Более высокий уровень — инструменты генерации сборочных сценариев (+окружение, +варианты сборки, +параметризация, +…), об этом после
Д/З
- Прочитать и прощёлкать
по возможности учебник по Make (про интеграцию с SCCS можно не читать). Есть ли отличия в поведении от GNU Make?
В репозитории с Д/З сделать (вложенный) подкаталог 03_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)
- И чтобы все генераты удалялись!
Обратите внимание на то, что нумерация лекций поменялась, просьба переименовать каталог с предыдущим домашним заданием в отдельно коммите!