Основы программирования в 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
– g -Wall -ansi -c main.c
gcc -I.
– g -Wall -ansi -c 2.c
– g -Wall -ansi -c 2.c
gcc -I.
– g -Wall -ansi -с 3.c
– 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");
Поделиться:
Популярные книги
Бастард Бога (Дилогия)
Фантастика:
альтернативная история
5.11
рейтинг книги
Старый, но крепкий 5
5. Культивация без насилия
Фантастика:
рпг
аниме
уся
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVI
36. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 6
6. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Золотой ворон
5. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Любовь Носорога
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Хозяин Стужи 7
7. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Диверсант
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Скажи миру – «нет!»
1. Путь домой
Фантастика:
фэнтези
героическая фантастика
попаданцы
7.61
рейтинг книги
Последний Паладин. Том 8
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Адвокат Империи 4
4. Адвокат империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный маг императора 3
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга II
2. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
юмористическое фэнтези
5.00