Основы программирования в Linux - Мэтью Нейл
$ <b>touch b.h</b>$ <b>make -f Makefile1</b>gcc -c 2.с gcc -с 3.cgcc -o myapp main.о 2.о 3.o$Команда
make$ <b>rm 2.o</b>$ <b>make -f Makefile1</b>gcc -с 2.cgcc -о myapp main.о 2.о 3.о$И снова команда
makeКомментарии в make-файле
Комментарий в make-файле начинается со знака
#Макросы в make-файле
Даже если бы функциональные возможности команды
makeМакросы в make-файле записываются в виде конструкции
MAСRONAME=<i>значение</i>$(MACRONAME)${MACRONAME}make$MACRONAME=Макросы часто используют в make-файлах для задания опций компилятора. Обычно во время разработки приложение компилируется без оптимизации и с включенной отладочной информацией. Для окончательной версии приложения, как правило, нужны другие режимы: маленький двоичный файл без какой-либо отладочной информации, работающий как можно быстрее.
Еще одна проблема в файле Makefile1 — жестко заданное имя компилятора
gccccc89Обычно макросы определяются в самом make-файле, но их можно задать и при вызове команды
makemake CC=c89"CC = с89"Выполните упражнение 9.2.
Далее приведена переработанная версия make-файла с именем Makefile2, в которой применяются макросы:
all: myapp# Какой компиляторСС = gcc# Где хранятся файлы includeINCLUDE = .# Опции для процесса разработкиСFLAGS = -g -Wall -ansi# Опции для окончательной версии# СFLAGS = -О -Wall -ansimyapp: main.о 2.o 3.o $(CC) -о myapp main.о 2.o 3.omain.о: main.c a.h $(CC) -I$(INCLUDE) $(CFLAGS) -с main.c2.о: 2.c a.h b.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c3.o: 3.c b.h c.h $(CC) -I$(INCLUDE) $(CFLAGS) -c 3.cЕсли удалить прошлую версию приложения и создать новую с помощью только что приведенного нового make-файла, вы получите следующее:
$ <b>rm *.о myapp</b>$ <b>make -f Makefile2</b>gcc -I. -g -Wall -ansi -c main.cgcc -I. -g -Wall -ansi -c 2.cgcc -I. -g -Wall -ansi -c 3.cgcc -o myapp main.о 2.o 3.o$Как это работает
Программа make заменяет ссылки на макросы
$(CC)$(CFLAGS)$(INCLUDE)#defineУ команды
makeТаблица 9.1
| Макрос | Определение |
|---|---|
$? | Список необходимых условий (файлов, от которых зависит выходной файл), измененных позже, чем текущий выходной файл |
[email protected] | Имя текущего задания |
$< | Имя текущего файла, от которого зависит выходной |
$* | Имя без суффикса текущего файла, от которого зависит выходной |