Чтение онлайн

ЖАНРЫ

Основы программирования в Linux
Шрифт:

$ make -f Makefile1

gcc -с 2.c

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

$

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

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

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

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

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

Макросы в 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-файл. В упражнении 9.3 вы добавите задание

clean
на удаление ненужных объектных файлов, и задание
install
, перемещающее окончательное приложение в другой каталог.

Далее приведена следующая версия make-файла с именем Makefile3:

all: myapp

Поделиться с друзьями: