Ключ -f указывает файл инструкций, который нужно использовать вместо Makefile. Если этот ключ не указан, то make
ищет в текущем каталоге файл Makefile и начинает собирать указанную цель. Если цель не указана, то выполняется первая встреченная в make-файле. Сборка выполняется рекурсивно: make сначала выполняет все цели, от которых зависит текущая цель. Если зависимость представляет собой файл, то make сравнивает его время последней модификации со временем целевого файла: если целевой файл старше или отсутствует, то будет выполнена указанная последовательность команд. Если целевой файл моложе, то текущая цель считается достигнутой.Если нужно избежать пересборки какого-то из файлов проекта, то можно искусственно «омолодить» его командой touch
, которая присвоит ему в качестве времени последней модификации текущее время. Если нужно, наоборот, принудительно пересобрать цель, то следует «омолодить» один из файлов, от которых она зависит.Работа программы make
заканчивается, когда достигнута цель, указанная в командной строке. Обычно это цель all, собирающая все результирующие файлы проекта. Другими распространенными целями являются install (установить собранную программу) и clean (удалить ненужные файлы, созданные в процессе сборки).В листинге 21.2 представлен make-файл, собирающий небольшой проект из двух программ client
и server, каждая из которых компилируется из одного файла исходного кода.Листинг 21.2. Примерный make-файл
CC=gcc
CFLAGS=-O
all: client server
client: client.с
$(CC) client.с -о client
server: server.с
$(CC) server.с -о server
Обычно при вызове утилиты make
не нужно задавать никаких ключей. Но иногда использование ключей бывает очень кстати (таблица 21.1).Ключи команды make
Таблица 21.1Ключ | Назначение |
---|---|
-C каталог | Перейти в указанный каталог перед началом работы |
-d | Вывод отладочной информации |
-e | Приоритет переменным окружения. Если у нас установлена переменная окружения CC и в Makefile есть переменная с таким же именем, то будет использована переменная окружения |
-f файл | Использовать указанный файл вместо Makefile |
-i | Игнорировать ошибки компилятора |
-I каталог | В указанном каталоге будет производиться поиск файлов, включаемых в Makefile |
-j n | Запускать не более n команд одновременно |
-k | Продолжить работу после ошибки, если это возможно |
-n | Вывести команды, которые должны были выполниться, но не выполнять их |
-о файл | Пропустить данный файл, даже если в Makefile указано, что он должен быть создан заново |
-r | Не использовать встроенные правила |
-s | Не выводить команды перед их выполнением |
-w | Вывод текущего каталога до и после выполнения команды |
21.3. Пакет binutils и другие полезные программы
Пакет binutils
♦ ld
— компоновщик: программа, связывающая объектные файлы и библиотеки в исполняемый файл;♦ ar
— работа с архивами (создания, модификация и извлечение);♦ nm
— вывод названий идентификаторов из двоичных файлов;♦ objcopy
— копирование и трансляция двоичных файлов;♦ objdump
— вывод информации из двоичных файлов;♦ ranlib
— генерирование индекса оглавления архива;♦ size
— вывод размеров секций архива или двоичного файла;♦ strings
— вывод строк, которые возможно прочитать, из двоичных файлов;♦ addr2line
— конвертирование адресов в памяти в строку в файле;♦ nlmconv
— конвертирует объектный код в NLM.А теперь перечислим несколько полезных вспомогательных программ.
21.3.1. ansi2knr
Утилита ansi2knr
предназначена для преобразования текстов программ, написанных в соответствии со стандартом ANSI С, в программы на «классическом» С Кернигана и Ричи. Формат вызова: