5.2. Система сборки Make
Система сборки Make является старейшей в своем классе (1976 г.) и при этом до сих пор активно используется разработчиками.
К основным характеристикам Make относятся:
- Использование файловой системы, вместо таблицы, а также времени модификации файлов для определения необходимости пересборки задач;
- Поддержка только статических зависимостей;
- Использование алгоритма топологической сортировки в качестве алгоритма планировщика.
В Make используется специальный конфигурационный файл с именем Makefile для определения плана сборки. Основными элементами декларативного языка Makefile являются определения переменных, а также правила сборки, состоящие из задачи-цели и ряда задач-зависимостей для этой цели.
Рассмотрим пример определения Makefile для графа «экипировки» на рис. 34.
equipment: shoes jacket
@echo $@
underwear:
@echo $@
socks: underwear
@echo $@
shirt: underwear
@echo $@
trousers: shirt
@echo $@
sweater: shirt
@echo $@
shoes: trousers
@echo $@
jacket: sweater
@echo $@
В этом примере имеется последовательность правил следующего вида:
цель: зависимости
действие
Действия представляют собой последовательность строк, это команды для интерпретатора командной строки ОС. Командами могут быть, в частности, вызовы компилятора или вызовы инструментов преобразования форматов данных.
Обратите внимание, что строки действий выделяются символом табуляции. Именно табуляцией, а не пробелами. Если была получена ошибка missing separator при выполнении Makefile, то речь идет именно о путанице с пробелами и табуляциями.
Цели и зависимости представляют собой, с точки зрения make, имена файлов. У этих файлов и проверяется время последней модификации. Если файл цели задачи отсутствует, то сборка этой задачи всегда будет произведена.
Вызов make в каталоге, содержащем приведенный выше Makefile, выдаст следующую информацию:
underwear
shirt
trousers
shoes
sweater
jacket
equipment
В правилах могут использоваться специальные переменные, среди которых:
$@. Имя цели.$<. Имя первой зависимости.$^. Список имен всех зависимостей.
Переменные в Makefile определяются, как показано в примере ниже:
SHOW = @echo $@
%:
$(SHOW)
equipment: shoes jacket
underwear:
socks: underwear
shirt: underwear
trousers: shirt
sweater: shirt
shoes: trousers
jacket: sweater
Здесь используется определение шаблона с помощью %, что обозначает произвольное имя. В рассматриваемом примере это приводит к выполнению указанного действия для всех целей.
Утилита make по умолчанию начинает выполнение с первой цели, указанной в Makefile. Можно также указать и конкретную цель для сборки:
# make trousers
underwear
shirt
trousers
В Makefile часто добавляются псевдоцели, такие как all (собрать все) и clean (очистить от временных файлов). Для того, чтобы утилита make могла отличить псевдоцели от файлов, используется специальная цель .PHONY.