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

на главную - закладки

Жанры

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

Обычно макросы определяются в самом 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

# Какой компилятор

CC = gcc

# Куда установить

# INSTDIR=/usr/local/bin

# Где хранятся файлы include

INCLUDE = .

# Опции для разработки

CFLAGS = -g -Wall -ansi

# Опции для рабочей версии

# CFLAGS = -О -Wall -ansi

myapp: main.o 2.o 3.o

 $(CC) -о myapp main.о 2.о 3.o

main.о: main.c a.h

 $(CC) -I$(INCLUDE) $(CFLAGS) -c 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

Поделиться:
Популярные книги

Телохранитель Цесаревны

Зот Бакалавр
5. Герой Империи
Фантастика:
фэнтези
боевая фантастика
5.25
рейтинг книги
Телохранитель Цесаревны

Наследие Маозари 9

Панежин Евгений
9. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
сказочная фантастика
6.25
рейтинг книги
Наследие Маозари 9

Память

Буджолд Лоис Макмастер
10. Сага о Форкосиганах
Фантастика:
научная фантастика
9.41
рейтинг книги
Память

Эволюционер из трущоб. Том 10

Панарин Антон
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 10

Анти-Ксенонская Инициатива

Вайс Александр
7. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Анти-Ксенонская Инициатива

Мы друг друга не выбирали

Кистяева Марина
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
5.00
рейтинг книги
Мы друг друга не выбирали

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Идеальный мир для Лекаря 21

Сапфир Олег
21. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 21

Я Гордый часть 2

Машуков Тимур
2. Стальные яйца
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я Гордый часть 2

Мастер 8

Чащин Валерий
8. Мастер
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Мастер 8

Воин-Врач

Дмитриев Олег
1. Воин-Врач
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
6.00
рейтинг книги
Воин-Врач

Войсковые разведчики в Афгане. Записки начальника разведки дивизии

Кузьмин Николай Павлович
1. Афган: Последняя война СССР
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Войсковые разведчики в Афгане. Записки начальника разведки дивизии

Неудержимый. Книга XXX

Боярский Андрей
30. Неудержимый
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXX