Литмир - Электронная Библиотека
Содержание  
A
A

$ <b>touch b.h</b>

$ <b>make -f Makefile1</b>

gcc -c 2.с gcc -с 3.c

gcc -o myapp main.о 2.о 3.o

$

Команда

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

$ <b>rm 2.o</b>

$ <b>make -f Makefile1</b>

gcc -с 2.c

gcc -о myapp main.о 2.о 3.о

$

И снова команда

make
правильно определяет нужные действия.

Комментарии в make-файле

Комментарий в make-файле начинается со знака

#
и продолжается до конца строки. Как и в исходных файлах на языке С, комментарии в make-файлах могут помочь как автору, так и другим пользователям понять, что имелось в виду во время написания данного файла.Sta

Макросы в make-файле

Даже если бы функциональные возможности команды

make
и make-файлов ограничивались тем, что уже описано, они были бы мощным средством управления проектами с множеством исходных файлов. Но эти средства становятся громоздкими и неповоротливыми в проектах, содержащих большое количество файлов. Поэтому make-файлы предоставляют возможность использовать макросы, позволяющие писать эти файлы в более обобщенном виде.

Макросы в make-файле записываются в виде конструкции

MAСRONAME=<i>значение</i>
, затем ссылаться на значение можно, указав
$(MACRONAME)
или
${MACRONAME}
. Некоторые версии
make
могут также принимать
$MACRONAME
. Вы можете задать пустое значение макроса, оставив пустой часть строки после знака
=
.

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

Еще одна проблема в файле Makefile1 — жестко заданное имя компилятора

gcc
. В других UNIX-системах вы, возможно, будете использовать
cc
или
c89
. Если когда-нибудь вы захотите перенести ваш make-файл в другую версию UNIX или получите другой компилятор для имеющейся у вас системы, придется изменить несколько строк в вашем make-файле, чтобы заставить его работать. Макросы — хороший способ собрать все эти системнозависимые части и легко изменить их.

Обычно макросы определяются в самом make-файле, но их можно задать и при вызове команды

make
, если добавить определение макроса, например,
make CC=c89
. Определения, подобные данному, приведенные в командной строке, переопределяют заданные в make-файле определения. Заданные вне make-файла определения макросов должны передаваться как один аргумент, поэтому исключите пробелы или применяйте кавычки следующим образом:
&quot;CC = с89&quot;
.

Выполните упражнение 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-файла, вы получите следующее:

$ <b>rm *.о myapp</b>

$ <b>make -f Makefile2</b>

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

Макрос Определение
$?
Список необходимых условий (файлов, от которых зависит выходной файл), измененных позже, чем текущий выходной файл
$@
Имя текущего задания
$&lt;
Имя текущего файла, от которого зависит выходной
$*
Имя без суффикса текущего файла, от которого зависит выходной
165
{"b":"285844","o":1}