Управление проектами

Существует ряд программ (make, cmake, ant, scons, ...) для управления процессом 
компиляции, компоновки и решения похожих задач. Такие задачи часто собирательно
называют сборкой. Наиболее известной среди программ такого рода является make.
Рассмотрим её простейшие функции. При запуске эта программа использует файл
makefile, который должен находиться в текущем каталоге.

Программа make автоматически определяет, какие части проекта требуют обработки,
и запускает соответствующие программы. Она позволяет использовать переменные,
условные конструкции, шаблоны, функции для преобразования текста и т.п.

Простой makefile состоит из правил вида

ЦЕЛЬ: ПРЕДПОСЫЛКИ
     КОМАНДА
     ...

Цель -- это обычно файл, который должен быть сгенерирован. Целью также может
быть имя действия, которое следует выполнить. Предпосылки -- это файлы, 
необходимые для достижения цели. Последовательность команд описывает как
получить цель. Иногда make может автоматически генерировать команды по цели
и предпосылкам -- в этом случае раздел команд может отсутствовать. Перед каждой 
командой необходимо наличие знака табуляции. Комментарии заключаются между 
знаком # и концом строки. Файл-цель генерируется только в случае, если файл-цель
отсутствует или хотя бы одна из предпосылок новее цели.

Пример простого файла makefile

hoc: hoc.cpp.y makefile
        -lex hoc.cpp.l
        yacc hoc.cpp.y
        g++ -o hoc y.tab.c
clean:
        rm -f y.tab.c lex.yy.c hoc *.c

Цель hoc -- это имя получаемой программы -- главная цель. Её предпосылки -- это
файлы hoc.cpp.y и сам makefile. Если команду начать знаком -, то в случае её
неуспеха, например, из-за отсутствия неучтённой предпосылки hoc.cpp.l, процесс 
сборки будет продолжен. При отсутствии предпосылки make пытается её 
сгенерировать -- это позволяет описать процесс достижения цели через
достижение подцелей. Цель-действие clean выполняется только при явном указании 
при вызове make.

В командах можно использовать множество стандартных переменных, например,
$^ означает все предпосылки, $@ --- цель, $< --- первую предпосылку, ... 

Существуют программы (imake, automake, ...) для автоматической генерации файла
makefile из более общих описаний --- это позволяет, в частности, улучшить 
переносимость программ.

Транслятор gcc с опцией -MM можно использовать для генерации целей и их
предпосылок, например, g++ -MM *.cpp сделает нужную распечатку по проекту
на си++ в текущем каталоге.