Книга: Основы программирования в Linux
Макросы в make-файле
Макросы в make-файле
Даже если бы функциональные возможности команды make
и make-файлов ограничивались тем, что уже описано, они были бы мощным средством управления проектами с множеством исходных файлов. Но эти средства становятся громоздкими и неповоротливыми в проектах, содержащих большое количество файлов. Поэтому make-файлы предоставляют возможность использовать макросы, позволяющие писать эти файлы в более обобщенном виде.
Макросы в make-файле записываются в виде конструкции MAСRONAME=значение
, затем ссылаться на значение можно, указав $(MACRONAME)
или ${MACRONAME}
. Некоторые версии make
могут также принимать $MACRONAME
. Вы можете задать пустое значение макроса, оставив пустой часть строки после знака =
.
Макросы часто используют в make-файлах для задания опций компилятора. Обычно во время разработки приложение компилируется без оптимизации и с включенной отладочной информацией. Для окончательной версии приложения, как правило, нужны другие режимы: маленький двоичный файл без какой-либо отладочной информации, работающий как можно быстрее.
Еще одна проблема в файле Makefile1 — жестко заданное имя компилятора gcc
. В других UNIX-системах вы, возможно, будете использовать cc
или c89
. Если когда-нибудь вы захотите перенести ваш make-файл в другую версию UNIX или получите другой компилятор для имеющейся у вас системы, придется изменить несколько строк в вашем make-файле, чтобы заставить его работать. Макросы — хороший способ собрать все эти системнозависимые части и легко изменить их.
Обычно макросы определяются в самом make-файле, но их можно задать и при вызове команды make
, если добавить определение макроса, например, make CC=c89
. Определения, подобные данному, приведенные в командной строке, переопределяют заданные в make-файле определения. Заданные вне make-файла определения макросов должны передаваться как один аргумент, поэтому исключите пробелы или применяйте кавычки следующим образом: "CC = с89"
.
Выполните упражнение 9.2.
Упражнение 9.2. Make-файл с макросом
Далее приведена переработанная версия make-файла с именем Makefile2, в которой применяются макросы:
all: myapp
# Какой компилятор
СС = gcc
# Где хранятся файлы include
INCLUDE = .
# Опции для процесса разработки
СFLAGS = -g -Wall -ansi
# Опции для окончательной версии
# СFLAGS = -О -Wall -ansi
myapp: main.о 2.o 3.o
$(CC) -о myapp main.о 2.o 3.o
main.о: main.c a.h
$(CC) -I$(INCLUDE) $(CFLAGS) -с main.c
2.о: 2.c a.h b.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
Если удалить прошлую версию приложения и создать новую с помощью только что приведенного нового make-файла, вы получите следующее:
$ rm *.о myapp
$ make -f Makefile2
gcc -I. -g -Wall -ansi -c main.c
gcc -I. -g -Wall -ansi -c 2.c
gcc -I. -g -Wall -ansi -c 3.c
gcc -o myapp main.о 2.o 3.o
$
Как это работает
Программа make заменяет ссылки на макросы $(CC)
, $(CFLAGS)
и $(INCLUDE)
соответствующими определениями так же, как компилятор С поступает с директивами #define
. Теперь, если вы захотите изменить команду компиляции, вам придется изменить только одну строку make-файла.
У команды make
есть несколько специальных внутренних макросов, которые можно применять для того, чтобы еще более сократить make-файлы. В табл. 9.1 мы перечислили наиболее часто используемые из них; в последующих примерах вы увидите их в действии. Подстановка каждого из этих макросов выполняется только перед его использованием, поэтому значение макроса может меняться по мере обработки make-файла. На самом деле в этих макросах было бы очень мало пользы, если бы они действовали иначе.
Таблица 9.1
Макрос | Определение |
---|---|
$? |
Список необходимых условий (файлов, от которых зависит выходной файл), измененных позже, чем текущий выходной файл |
$@ |
Имя текущего задания |
$< |
Имя текущего файла, от которого зависит выходной |
$* |
Имя без суффикса текущего файла, от которого зависит выходной |
Есть еще два полезных специальных символа, которые можно увидеть перед командами в make-файле:
? символ -
заставляет команду make
игнорировать любые ошибки. Например, если вы хотели бы создать каталог и при этом игнорировать любые ошибки, скажем, потому что такой каталог уже существует, вы просто ставите знак "минус" перед командой mkdir
. Чуть позже в этой главе вы увидите применение символа -
;
? символ @
запрещает команде make
выводить команду в стандартный файл вывода перед ее выполнением. Этот символ очень удобен, если вы хотите использовать команду echo
для вывода некоторых инструкций.
- Команда make и make-файлы
- Комментарии в make-файле
- Более сложная тема: make-файлы и подкаталоги
- 4.3.3. Makefile Targets
- Правда ли, что можно хранить несколько документов в одном файле?
- Листинг 9.1. Список acl-правил, описанных по умолчанию в конфигурационном файле
- Scaling makes your object darker?
- 1.3. Автоматизация процесса с помощью GNU-утилиты make
- 15.4. Утилита make: автоматизация процедур
- 5.1.1 Make Targets
- The Master Algorithm: How the Quest for the Ultimate Learning Machine Will Remake Our World
- Модуль RobotTaskMaker