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

Если вы — обычный пользователь, то у вас может не быть прав на установку новых команд в каталог /usr/local/bin. Можно изменить в make-файле каталог установки, изменить права доступа к этому каталогу или заменить пользователя (с помощью команды

su
) на root перед запуском
make install
.

$ <b>rm *.о myapp</b>

$ <b>make -f Makefile3</b>

gcc -I. -g -Wall -ansi -c main.c

gcc -I. -g -Wall -ansi -c 2.c

gcc -I. -g -Wall -ansi -с 3.c

gcc -o myapp main.о 2.o 3.o

$ <b>make -f Makefile3</b>

make: Nothing to be done for 'all'.

$ <b>rm myapp</b>

$ <b>make -f Makefile3 install</b>

gcc -o myapp main.o 2.o 3.o

Installed in /usr/local/bin

$ <b>make -f Makefile3 clean</b>

rm main.о 2.о 3.о

$

Как это работает

Сначала вы удаляете файл myapp и все объектные файлы. Команда

make
самостоятельно выбирает задание
all
, которое приводит к сборке myapp. Затем вы снова запускаете команду
make
, но т.к. у файла myapp свежая версия,
make
не делает ничего. Далее вы удаляете файл myapp и выполняете
make install
. Эта команда создает заново двоичный файл и копирует его в каталог установки. В заключение выполняется команда
make clean
, удаляющая объектные файлы.

Встроенные правила

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

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

#include &lt;stdlib.h&gt;

#include &lt;stdio.h&gt;

int main() {

 printf(&quot;Hello World\n&quot;);

 exit(EXIT_SUCCESS);

}

He задавая make-файла, попробуйте откомпилировать ее с помощью команды

make
:

$ <b>make foo</b>

сс foo.с -о foo

$

Как видите,

make
знает, как запустить компилятор, хотя в данном случае она выбирает
сс
вместо
gcc
(в ОС Linux это нормально, потому что
cc
— обычно ссылка на
gcc
). Иногда эти встроенные правила называют подразумеваемыми правилами. Стандартные правила используют макросы, поэтому задавая некоторые новые значения для макросов, вы можете изменить стандартное поведение.

$ <b>rm foo</b>

$ <b>make CC=gcc CFLAGS=&quot;-Wall -g&quot; foo</b>

gcc -Wall -g foo.с -o foo

$

С помощью опции

-p
можно попросить команду
make
вывести на экран встроенные правила. Их так много, что мы не можем привести в книге все встроенные правила, ограничимся коротким фрагментом вывода команды
make -p
версии GNU, демонстрирующим часть этих правил:

OUTPUT_OPTION = -o $@

COMPILE.с = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -с

%.о: %.с

# commands to execute (built-in) :

 $(COMPILE.с) $(OUTPUT_OPTION) $&lt;

Теперь, принимая во внимание описанные встроенные правила, вы можете упростить ваш make-файл, удалив правила для создания объектных файлов и оставив только зависимости, таким образом, соответствующая секция make-файла читается просто:

main.о: main.c a.h

2.о: 2.с a.h b.h

3.o: 3.c b.h c.h

Эту версию можно найти в загружаемом из Интернета программном коде, в файле Makefile4.

Суффиксы и шаблоны правил

Встроенные правила, которые вы видели, действуют, используя суффиксы (подобные расширениям файлов в системах Windows и MS-DOS), поэтому команда

make
, получая файл с одним окончанием, знает, какое правило применять для создания файла с другим окончанием. Чаще всего используется правило для создания файла, заканчивающегося .о, из файла с окончанием .c. Это правило для применения компилятора, компилирующего исходный файл, но не компонующего.

Порой возникает потребность в создании новых правил. Авторы приучили себя работать с исходными файлами, которые необходимо компилировать несколькими разными компиляторами: двумя в среде MS-DOS и

gcc
в ОС Linux. Для того чтобы осчастливить один из компиляторов MS-DOS, исходные файлы на языке С++, а не С должны иметь расширение cpp. К сожалению, у версии команды
make
, применяемой в Linux, в то время не было встроенного правила для компиляции файлов с окончанием .cpp. (Существовало правило для суффикса .cc, более распространенного расширения файла на C++ в среде UNIX.)

Следовательно, нужно было либо задавать правило для каждого отдельного исходного файла, либо научить

make
новому правилу для создания объектных файлов из файлов с расширением cpp. Учитывая, что в том проекте было довольно большое количество исходных файлов, определение нового правила сэкономило бы много времени на наборе и существенно облегчило бы добавление новых исходных файлов в проект.

Для вставки правила с новым суффиксом сначала добавьте строку в make-файл, информирующую команду

make
о новом суффиксе; далее можно написать правило, используя новый суффикс. Команда
make
применяет специальную синтаксическую запись

.&lt;old_suffix&gt;.&lt;new_suffix&gt;:

для определения общего правила создания файлов с новым суффиксом из файлов с тем же основным именем, но старым суффиксом.

Далее приведен фрагмент make-файла с новым общим правилом для компиляции файлов с суффиксом .срр в файлы с суффиксом .о:

.SUFFIXES: .cpp

167
{"b":"285844","o":1}