Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подбельский Фомин_Программирование на языке СИ_...doc
Скачиваний:
356
Добавлен:
10.08.2019
Размер:
53.81 Mб
Скачать

9.1.1. Команда make

Команда make позволяет документировать взаимосвязи между модулями и освобождает пользователя от рутинной работы по слежению за изменениями в модулях.

Команда make при вызове обновляет (перестраивает) исполняемый модуль, причем транслируются только те функции, в исходные тексты которых были внесены изменения.

Исходными данными для команды make служит файл описаний зависимостей модулей. Описания зависимостей модулей и соответствующих действий хранятся в так называемом make-файле, который по умолчанию называется makefile или makefile. В этом случае он может не указываться при вызове команды make. При выборе для make-файла (файла зависимостей) произвольного имени часто назначают имена, начинающиеся с заглавной буквы, так как при просмотре содержимого каталога (в UNIX для просмотра используется команда Is -l) они будут располагаться в верхней части списка модулей каталога, что облегчает поиск и распознавание make-файлов.

Приведем текст файла зависимостей модулей для программы сортировки на основе бинарного дерева. В простейшем случае make-файл будет выглядеть так:

В первой строке первым параметром перед символом ':' указывается имя так называемого целевого файла, а после символа ':' приводится список имен файлов, от которых зависит целевой файл. Эта строка информирует команду make о необходимости выполнить команду, записанную в следующей строке, если какой-либо из объектных модулей (файлы *.о) имеет более позднюю дату модификации по сравнению с целевым файлом tree, являющимся в нашем примере исполняемым модулем программы сортировки.

Если какой-либо из исходных модулей на препроцессорном уровне включает файл с текстом части программы, то описание зависимостей файлов необходимо дополнить соответствующей строкой по следующему образцу:

Здесь указано, что объектные модули prog.o и а.о зависят от включаемого (директивой #include) файла def.h

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

Формат файла описаний зависимостей модулей.

Формат файла описаний зависимостей модулей. Файл описаний зависимостей модулей представляет собой текстовый файл, содержащий последовательность строк, которые являются набором спецификаций взаимозависимостей, используемых командой make при ее выполнении. Спецификация взаимозависимостей имеет следующую структуру:

• имя целевого файла;

• последовательность имен файлов, от которых зависит целевой файл;

• последовательность команд UNIX, которая должна быть выполнена, если дата последней модификации хотя бы одного из файлов, от которых зависит целевой файл, старше даты модификации целевого файла.

Формат спецификации взаимозависимостей следующий:

targetl( target2 ... ]:[:][depend1 .. .][# ...]

[(tab)commands] [#]

где (квадратные скобки означают необязательность элементов)

target... - целевые файлы, имена которых разделяются пробелами;

: (или ::) - разделитель - в первом случае (для ':') последующая последовательность команд UNIX (commands) должна содержаться в одной строке файла описаний, а во втором она может располагаться в нескольких строках;

depend ... - последовательность имен файлов, от которых зависит целевой файл (разделяются пробелами);

(tab) - символ "Табуляция", которым предваряются командные строки UNIX;

commands - команды UNIX, с помощью которых должен быть получен целевой файл;

# - признак начала комментария (комментарий - часть строки от символа '#' до конца строки).

Примечание. Если список имен файлов, от которых зависит целевой файл, не умещается на одной строке, для обозначения переноса части списка на другую строку можно воспользоваться символом '\',

например:

tree: tree.o \

add_node.o \

new node.o\

print.o

команды UNIX