Литмир - Электронная Библиотека
ЛитМир: бестселлеры месяца
Содержание  
A
A

Есть еще два полезных специальных символа, которые можно увидеть перед командами в make-файле:

□ символ

-
заставляет команду
make
игнорировать любые ошибки. Например, если вы хотели бы создать каталог и при этом игнорировать любые ошибки, скажем, потому что такой каталог уже существует, вы просто ставите знак "минус" перед командой
mkdir
. Чуть позже в этой главе вы увидите применение символа
-
;

□ символ

@
запрещает команде
make
выводить команду в стандартный файл вывода перед ее выполнением. Этот символ очень удобен, если вы хотите использовать команду
echo
для вывода некоторых инструкций.

Множественные задания

Часто бывает полезно создать вместо одного выходного файла несколько или собрать несколько групп команд в одном файле. Вы можете сделать это, расширив свой make-файл. В упражнении 9.3 вы добавите задание

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

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

all: myapp

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

CC = gcc

<i># Куда установить</i>

<i># INSTDIR=/usr/local/bin</i>

# Где хранятся файлы 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

<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 &quot;Installed in $(INSTDIR)&quot;;\</i>

<i> else \</i>

<i>  echo &quot;Sorry, $(INSTDIR) does not exist&quot;;\</i>

<i> fi</i>

В этом make-файле есть несколько вещей, на которые следует обратить внимание. Во-первых, специальная цель

all
, которая задает только один выходной файл myapp. Следовательно, если вы выполняете
make
без указания задания, поведение по умолчанию — сборка файла myapp.

Следующая важная особенность относится к двум дополнительным заданиям:

clean
и
install
. В задании
clean
для удаления объектных файлов применяется команда
rm
. Команда начинается со знака
-
, тем самым сообщая команде
make
о необходимости игнорировать результат команды, поэтому
make
выполнится успешно, даже если объектных файлов нет и команда
rm
вернет ошибку. Правила для задания
clean
ни от чего не зависят, остаток строки после
clean:
пуст. Таким образом, задание всегда считается измененным со времени последнего выполнения, и его правило всегда выполняется, если
clean
указывается в качестве задания.

Задание

install
зависит от myapp, поэтому команда
make
знает, что должна создать myapp перед выполнением других команд задания
install
. Правила выполнения
install
состоят из нескольких команд сценария командной оболочки. Поскольку команда
make
запускает командную оболочку для выполнения правил и применяет новую командную оболочку для каждого правила, следует добавлять обратные слэши, чтобы все команды сценария были в одной логической строке и передавались для выполнения все вместе одному сеансу командной оболочки. Эта команда начинается со знака отменяющего вывод команды в стандартный файл вывода перед выполнением правила.

Задание

install
выполняет несколько команд одну за другой для установки приложения в указанное расположение. Оно не проверяет успешность выполнения предыдущей команды перед выполнением следующей. Если очень важно, чтобы последующие команды выполнялись только в случае успешного завершения предыдущей, можно написать команды, объединенные с помощью операции
&amp;&amp;,
как показано далее:

@if [ -d $(INSTDIR) ]; \

 then \

 cp myapp $(INSTDIR) &amp;&amp;\

 chmod a+x $(INSTDIR)/myapp &amp;&amp; \

 chmod og-w $(INSTDIR/myapp &amp;&amp; \

 echo &quot;Installed in $(INSTDIR)&quot; ; \

else \

 echo &quot;Sorry, $(INSTDIR) does not exist&quot;; false ; \

fi

Как вы, вероятно, помните из главы 2, у командной оболочки есть команда

and
, благодаря которой выполнение последующей команды возможно лишь при успешном завершении предыдущей. В данном примере вас не слишком заботит успешное завершение предыдущих команд, поэтому можно придерживаться более простой формы.

166
{"b":"285844","o":1}
ЛитМир: бестселлеры месяца