$(CC) $(MODFLAGS) -c proga.c
Чтобы обратиться к макроопределению в команде или в другом макроопределении, нужно использовать конструкцию $(имя). Макроопределение может включать в себя другое, ранее определенное, макроопределение.
Формат запуска утилиты make:
make [-f файл] [ключи] [цель]
Ключ -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 |