Основы программирования в Linux - Страница 167

Изменить размер шрифта:

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

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

$ rm *.о myapp

$ make -f Makefile3

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

$ make -f Makefile3

make: Nothing to be done for 'all'.

$ rm myapp

$ make -f Makefile3 install

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

Installed in /usr/local/bin

make -f Makefile3 clean

rm main.о 2.о 3.о

$

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

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

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

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

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

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

#include <stdlib.h>

#include <stdio.h>

int main() {

 printf("Hello Worldn");

 exit(EXIT_SUCCESS);

}

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

make
:

$ make foo

сс foo.с -о foo

$

Как видите,

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

$ rm foo

$ make CC=gcc CFLAGS="-Wall -g" foo

gcc -Wall -g foo.с -o foo

$

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

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

OUTPUT_OPTION = -o [email protected]

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

%.о: %.с

# commands to execute (built-in) :

 $(COMPILE.с) $(OUTPUT_OPTION) $<

Теперь, принимая во внимание описанные встроенные правила, вы можете упростить ваш 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
применяет специальную синтаксическую запись

.<old_suffix>.<new_suffix>:

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

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

.SUFFIXES: .cpp

Оригинальный текст книги читать онлайн бесплатно в онлайн-библиотеке Knigger.com