exit(EXIT_SUCCESS);
}
/* 2.c */
#include "a.h"
#include "b.h"
void function_two { }
/* 3.с */
#include "b.h"
#include "c.h"
void function_three { }
Теперь попробуйте выполнить команду make
еще раз:$ make -f Makefile1
gcc -с main.с gcc -с 2.с
gcc -с 3.с
gcc -о myapp main.о 2.о 3.о
$
На этот раз сборка прошла успешно.
Как это работает
Команда make
make определила правильный порядок создания файлов. Затем она запустила соответствующие команды для создания этих файлов, приведенные вами в секции правил. Команда make выводит на экран выполняемые ею команды. Теперь вы можете протестировать ваш make-файл, чтобы увидеть, корректно ли он обрабатывает изменения в файле b.h:$ touch b.h
$ make -f Makefile1
gcc -c 2.с gcc -с 3.c
gcc -o myapp main.о 2.о 3.o
$
Команда make
$ rm 2.o
$ make -f Makefile1
gcc -с 2.c
gcc -о myapp main.о 2.о 3.о
$
И снова команда make
Комментарии в make-файле
Комментарий в make-файле начинается со знака #
Макросы в make-файле
Даже если бы функциональные возможности команды make
Макросы в make-файле записываются в виде конструкции MAСRONAME=
$(MACRONAME) или ${MACRONAME}. Некоторые версии make могут также принимать $MACRONAME. Вы можете задать пустое значение макроса, оставив пустой часть строки после знака =.Макросы часто используют в make-файлах для задания опций компилятора. Обычно во время разработки приложение компилируется без оптимизации и с включенной отладочной информацией. Для окончательной версии приложения, как правило, нужны другие режимы: маленький двоичный файл без какой-либо отладочной информации, работающий как можно быстрее.
Еще одна проблема в файле Makefile1 — жестко заданное имя компилятора gcc
cc или c89. Если когда-нибудь вы захотите перенести ваш make-файл в другую версию UNIX или получите другой компилятор для имеющейся у вас системы, придется изменить несколько строк в вашем make-файле, чтобы заставить его работать. Макросы — хороший способ собрать все эти системнозависимые части и легко изменить их.Обычно макросы определяются в самом make-файле, но их можно задать и при вызове команды make
make CC=c89. Определения, подобные данному, приведенные в командной строке, переопределяют заданные в make-файле определения. Заданные вне make-файла определения макросов должны передаваться как один аргумент, поэтому исключите пробелы или применяйте кавычки следующим образом: "CC = с89".Выполните упражнение 9.2.
Далее приведена переработанная версия 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