Основы программирования в Linux
Есть еще два полезных специальных символа, которые можно увидеть перед командами в make-файле:
□ символ
заставляет команду-игнорировать любые ошибки. Например, если вы хотели бы создать каталог и при этом игнорировать любые ошибки, скажем, потому что такой каталог уже существует, вы просто ставите знак "минус" перед командойmake. Чуть позже в этой главе вы увидите применение символаmkdir;-□ символ
запрещает команде@выводить команду в стандартный файл вывода перед ее выполнением. Этот символ очень удобен, если вы хотите использовать командуmakeдля вывода некоторых инструкций.echoМножественные задания
Часто бывает полезно создать вместо одного выходного файла несколько или собрать несколько групп команд в одном файле. Вы можете сделать это, расширив свой make-файл. В упражнении 9.3 вы добавите задание
на удаление ненужных объектных файлов, и заданиеclean, перемещающее окончательное приложение в другой каталог.installДалее приведена следующая версия make-файла с именем Makefile3:
all: myapp# Какой компиляторCC = gcc<i># Куда установить</i><i># INSTDIR=/usr/local/bin</i># Где хранятся файлы includeINCLUDE = .# Опции для разработкиCFLAGS = -g -Wall -ansi# Опции для рабочей версии# CFLAGS = -О -Wall -ansimyapp: main.o 2.o 3.o$(CC) -о myapp main.о 2.о 3.omain.о: main.c a.h$(CC) -I$(INCLUDE) $(CFLAGS) -c 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<i>clean:</i><i> -rm main.o 2.o 3.o</i><i>install: myapp</i><i> @if [ -d $(INSTDIR) ]; \</i><i> then \</i><i> cp myapp $(INSTDIR);\</i><i> chmod a+x $(INSTDIR)/myapp;\</i><i> chmod og-w $(INSTDIR)/myapp;\</i><i> echo "Installed in $(INSTDIR)";\</i><i> else \</i><i> echo "Sorry, $(INSTDIR) does not exist";\</i><i> fi</i>В этом make-файле есть несколько вещей, на которые следует обратить внимание. Во-первых, специальная цель
, которая задает только один выходной файл myapp. Следовательно, если вы выполняетеallбез указания задания, поведение по умолчанию — сборка файла myapp.makeСледующая важная особенность относится к двум дополнительным заданиям:
иclean. В заданииinstallдля удаления объектных файлов применяется командаclean. Команда начинается со знакаrm, тем самым сообщая команде-о необходимости игнорировать результат команды, поэтомуmakeвыполнится успешно, даже если объектных файлов нет и командаmakeвернет ошибку. Правила для заданияrmни от чего не зависят, остаток строки послеcleanпуст. Таким образом, задание всегда считается измененным со времени последнего выполнения, и его правило всегда выполняется, еслиclean:указывается в качестве задания.cleanЗадание
зависит от myapp, поэтому командаinstallзнает, что должна создать myapp перед выполнением других команд заданияmake. Правила выполненияinstallсостоят из нескольких команд сценария командной оболочки. Поскольку командаinstallзапускает командную оболочку для выполнения правил и применяет новую командную оболочку для каждого правила, следует добавлять обратные слэши, чтобы все команды сценария были в одной логической строке и передавались для выполнения все вместе одному сеансу командной оболочки. Эта команда начинается со знака отменяющего вывод команды в стандартный файл вывода перед выполнением правила.makeЗадание
выполняет несколько команд одну за другой для установки приложения в указанное расположение. Оно не проверяет успешность выполнения предыдущей команды перед выполнением следующей. Если очень важно, чтобы последующие команды выполнялись только в случае успешного завершения предыдущей, можно написать команды, объединенные с помощью операцииinstallкак показано далее:&&,@if [ -d $(INSTDIR) ]; \then \cp myapp $(INSTDIR) &&\chmod a+x $(INSTDIR)/myapp && \chmod og-w $(INSTDIR/myapp && \echo "Installed in $(INSTDIR)" ; \else \echo "Sorry, $(INSTDIR) does not exist"; false ; \fiКак вы, вероятно, помните из главы 2, у командной оболочки есть команда
, благодаря которой выполнение последующей команды возможно лишь при успешном завершении предыдущей. В данном примере вас не слишком заботит успешное завершение предыдущих команд, поэтому можно придерживаться более простой формы.and