Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

clean:

 -rm main.o 2.o 3.o

install: myapp

 @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";\

 fi

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

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

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

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

Задание

install
зависит от myapp, поэтому команда
make
знает, что должна создать myapp перед выполнением других команд задания
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
, благодаря которой выполнение последующей команды возможно лишь при успешном завершении предыдущей. В данном примере вас не слишком заботит успешное завершение предыдущих команд, поэтому можно придерживаться более простой формы.

Если вы — обычный пользователь, то у вас может не быть прав на установку новых команд в каталог /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 World\n");

Поделиться:
Популярные книги

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Очерки времен и событий из истории российских евреев. 1945 – 1970 гг. Книга 6

Кандель Феликс Соломонович
Научно-образовательная:
история
5.00
рейтинг книги
Очерки времен и событий из истории российских евреев. 1945 – 1970 гг. Книга 6

Кукловод

Злобин Михаил
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Кукловод

Сталин

Радзинский Эдвард Станиславович
3. Загадки жизни и смерти
Проза:
историческая проза
7.36
рейтинг книги
Сталин

Изгои

Владимиров Денис
5. Глэрд
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Изгои

Хозяин Стужи

Петров Максим Николаевич
1. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи

Кодекс Охотника. Книга XXVII

Винокуров Юрий
27. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXVII

Руководство по системной поведенченской психотерапии

Курпатов Андрей Владимирович
Научно-образовательная:
психотерапия и консультирование
5.00
рейтинг книги
Руководство по системной поведенченской психотерапии

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

Неучтенный элемент. Том 11

NikL
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 11

Газлайтер. Том 39

Володин Григорий Григорьевич
39. История Телепата
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 39

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Точка Бифуркации

Смит Дейлор
1. ТБ
Фантастика:
боевая фантастика
7.33
рейтинг книги
Точка Бифуркации