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