Основы программирования в Linux
Если вы — обычный пользователь, то у вас может не быть прав на установку новых команд в каталог /usr/local/bin. Можно изменить в make-файле каталог установки, изменить права доступа к этому каталогу или заменить пользователя (с помощью команды
) на root перед запускомsu.make install$ <b>rm *.о myapp</b>$ <b>make -f Makefile3</b>gcc -I. -g -Wall -ansi -c main.cgcc -I. -g -Wall -ansi -c 2.cgcc -I. -g -Wall -ansi -с 3.cgcc -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.oInstalled in /usr/local/bin$ <b>make -f Makefile3 clean</b>rm main.о 2.о 3.о$Как это работает
Сначала вы удаляете файл myapp и все объектные файлы. Команда
самостоятельно выбирает заданиеmake, которое приводит к сборке myapp. Затем вы снова запускаете командуall, но т.к. у файла myapp свежая версия,makeне делает ничего. Далее вы удаляете файл myapp и выполняетеmake. Эта команда создает заново двоичный файл и копирует его в каталог установки. В заключение выполняется командаmake install, удаляющая объектные файлы.make cleanВстроенные правила
До сих пор вы описывали в make-файле подробно, как выполнять каждый шаг. В действительности у команды
есть много встроенных правил, которые существенно упрощают make-файлы, особенно если у вас много исходных файлов. Для того чтобы проверить это, создайте традиционную программу, приветствующую мир:make#include <stdlib.h>#include <stdio.h>int main() {printf("Hello World\n");exit(EXIT_SUCCESS);}He задавая make-файла, попробуйте откомпилировать ее с помощью команды
:make$ <b>make foo</b>сс foo.с -о foo$Как видите,
знает, как запустить компилятор, хотя в данном случае она выбираетmakeвместосс(в ОС Linux это нормально, потому чтоgcc— обычно ссылка наcc). Иногда эти встроенные правила называют подразумеваемыми правилами. Стандартные правила используют макросы, поэтому задавая некоторые новые значения для макросов, вы можете изменить стандартное поведение.gcc$ <b>rm foo</b>$ <b>make CC=gcc CFLAGS="-Wall -g" foo</b>gcc -Wall -g foo.с -o foo$С помощью опции
можно попросить команду-pвывести на экран встроенные правила. Их так много, что мы не можем привести в книге все встроенные правила, ограничимся коротким фрагментом вывода командыmakeверсии GNU, демонстрирующим часть этих правил:make -pOUTPUT_OPTION = -o [email protected]COMPILE.с = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -с%.о: %.с# commands to execute (built-in) :$(COMPILE.с) $(OUTPUT_OPTION) $<Теперь, принимая во внимание описанные встроенные правила, вы можете упростить ваш make-файл, удалив правила для создания объектных файлов и оставив только зависимости, таким образом, соответствующая секция make-файла читается просто:
main.о: main.c a.h2.о: 2.с a.h b.h3.o: 3.c b.h c.hЭту версию можно найти в загружаемом из Интернета программном коде, в файле Makefile4.
Суффиксы и шаблоны правил
Встроенные правила, которые вы видели, действуют, используя суффиксы (подобные расширениям файлов в системах Windows и MS-DOS), поэтому команда
, получая файл с одним окончанием, знает, какое правило применять для создания файла с другим окончанием. Чаще всего используется правило для создания файла, заканчивающегося .о, из файла с окончанием .c. Это правило для применения компилятора, компилирующего исходный файл, но не компонующего.makeПорой возникает потребность в создании новых правил. Авторы приучили себя работать с исходными файлами, которые необходимо компилировать несколькими разными компиляторами: двумя в среде MS-DOS и
в ОС Linux. Для того чтобы осчастливить один из компиляторов MS-DOS, исходные файлы на языке С++, а не С должны иметь расширение cpp. К сожалению, у версии командыgcc, применяемой в Linux, в то время не было встроенного правила для компиляции файлов с окончанием .cpp. (Существовало правило для суффикса .cc, более распространенного расширения файла на C++ в среде UNIX.)makeСледовательно, нужно было либо задавать правило для каждого отдельного исходного файла, либо научить
новому правилу для создания объектных файлов из файлов с расширением cpp. Учитывая, что в том проекте было довольно большое количество исходных файлов, определение нового правила сэкономило бы много времени на наборе и существенно облегчило бы добавление новых исходных файлов в проект.makeДля вставки правила с новым суффиксом сначала добавьте строку в make-файл, информирующую команду
о новом суффиксе; далее можно написать правило, используя новый суффикс. Командаmakeприменяет специальную синтаксическую записьmake.<old_suffix>.<new_suffix>:для определения общего правила создания файлов с новым суффиксом из файлов с тем же основным именем, но старым суффиксом.
Далее приведен фрагмент make-файла с новым общим правилом для компиляции файлов с суффиксом .срр в файлы с суффиксом .о:
.SUFFIXES: .cpp