Пример написания и использования Makefile
Сначала про настройку окружения
.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
Пример
Начнём с таких вот файлов:
prog.c |
fun.c |
|
|
const.c |
outlib.h |
1 int Count=0;
|
|
Их можно собрать в один файл просто с помощью cc *.c -o prog
- Напишем простейший Makefile для этого:
- Помните о табах!
Заодно сделаем цель clean. Пробуем make, make clean.
- Так можно и скриптом было сделать. Обеспечим раздельную компиляцию и компоновку.
- Кстати, вот альтернативная форма, в которой нет табуляций.