\chapter{make и cvs}
\section{Вскипятить воду}
Известен такой анекдот: математику и физику предложили задачу:
Даны дрова, спички, плита, чайник и водопроводный кран. Требуется
вскипятить воду. И математик и физик выдали один и тот же алгоритм
решения. После этого условия задачи несколько видоизменили: дан чайник с
водой и плита с заложенными дровами. Требуется то же самое. Физик поджёг
дрова и поставил чайник на огонь, а математик вынул дрова из печи и
вылил воду из чайника, после чего заявил, что задача сводится к
предыдущей. 

Большая часть начинающих пользователей уверена что компьютер может
действовать только как <<математик>>, руководствуясь заранее заданными
алгоритмами. Между тем Unix-системы с самого своего рождения достаточно
умны, чтобы действовать как <<физик>>. В комплект большинства
Unix-систем (во всяком случае всех свободно распространяемых) входит
команда {\tt make} (в переводе с английского <<сделай>>) которая как раз
и занимается тем что решает подобного рода задачи.

Команду {\tt make} изобрели программисты, чтобы облегчить себе работу.
Сложный программный проект обычно состоит из десятков, если не сотен
файлов, которые разными сложными способами зависят друг от друга, и
процесс компиляции всех файлов может занимать заметное время (до
нескольких часов на слабых машинах). Поэтому чтобы не заставлять
компьютер делать ненужную работу, раз за разом перекомпилируя файлы в
которые никаких изменений не вносилось, и была придумана команда {\tt
make}.

Она читает специальный файл с именем {\tt Makefile}, в котором описаны
цели (target), условия, необходимые для их достижения (которые сами
могут быть целями, описанными в том же Makefile) и команды unix, которые
необходимо выполнить чтобы достичь цели, если условия выполняются.

Цели (и условия) это обычно имена файлов. Если существуют и файл
условие, и файл-цель, но дата изменения файла условия позже, чем
файла-цели, цель будет перестроена. Это очень полезно как при написании
программ ({\tt make} позаботится о том, чтобы все изменения были
учтены), так и при работе с текстами (собственно говоря, программа это
тоже текст).

Поэтому если вы готовите какой-то сложный отчет, содержащий
таблицы-выборки из базы данных, графики построенные по этим таблицам, и
много кусков текста, живущих в отдельных файлах, крайне рекомендую
воспользоваться {\tt make} для того чтобы его форматировать. Правильно
написанный {\tt Makefile} гарантирует, что при обнаружении ошибки в
данных или пропущенной запятой в тексте, отчет будет переформатирован с
внесением всех необходимых исправлений в графики и так далее, за
минимально возможное время.

Попробуем написать {\tt Makefile} для задачи, с котрой мы начали главу.


\begin{verbatim}
tea: горящая_плита чайник_с_водой
	поставить чайник плита
	подождать пока вскипит
горящая_плита: дрова_в_плите
	зажечь дрова
дрова_в_плите: плита дрова
	положить дрова плита
чайник_с_водой: чайник водопровод
	налить вода чайник
\end{verbatim}

Вроде бы все очевидно. Теперь попробуйте представить себе как команда
{\tt make} будет выполнять задачу в первом и во втором случае. Желающие
читатели могут попробовать на самом деле написать такой {\tt Makefile}
и попробовать выполнить команду {\tt make tea} (придется, правда,
написать несколько скриптов~--- <<поставить>>, <<зажечь>>, <<налить>> и
т.д, которые будут создавать соответствующие файлы-цели, например
командой {\tt touch}).

Не исключено, что единственной наградой за старательное воспроизведение 
этого {\tt Makefile} будет сообщение от программы {\tt make} <<missing
separator. Stop.>>. Не огорчайтесть, это бывает даже с довольно опытными
программистами. Дело в том, что {\tt make} требует, чтобы строки,
описывающие действия, обязательно начинались с символа табуляции, а не с
нескольких пробелов. Отличить одно от другого на экране довольно тяжело,
а многие редакторы часто оказывают медвежью услугу пользователю, заменяя
табуляции на пробелы.

Возможности команды {\tt make} не исчерпываются вышеприведенными. Она
позволяет описывать <<общие>> правила вида "если нужен файл {\tt
что-то-там.o}, а есть файл {\tt что-то-там.c}, то\dots", писать
зависимости вида "от всех файлов {\tt *.o} в текущем каталоге" и даже
строить список зависимостей с помощью такого же правила, как и любой
другой файл. Все это подробно описано в info-документации на make.

\section{Маленькая машина времени}

	
