Основы программирования в Linux - Мэтью Нейл
- Дата:08.09.2024
- Категория: Компьютеры и Интернет / Интернет
- Название: Основы программирования в Linux
- Автор: Мэтью Нейл
- Просмотров:0
- Комментариев:0
Шрифт:
Интервал:
Закладка:
Есть еще два полезных специальных символа, которые можно увидеть перед командами в make-файле:
□ символ - заставляет команду make игнорировать любые ошибки. Например, если вы хотели бы создать каталог и при этом игнорировать любые ошибки, скажем, потому что такой каталог уже существует, вы просто ставите знак "минус" перед командой mkdir. Чуть позже в этой главе вы увидите применение символа -;
□ символ @ запрещает команде make выводить команду в стандартный файл вывода перед ее выполнением. Этот символ очень удобен, если вы хотите использовать команду echo для вывода некоторых инструкций.
Множественные задания
Часто бывает полезно создать вместо одного выходного файла несколько или собрать несколько групп команд в одном файле. Вы можете сделать это, расширив свой make-файл. В упражнении 9.3 вы добавите задание clean на удаление ненужных объектных файлов, и задание install, перемещающее окончательное приложение в другой каталог.
Далее приведена следующая версия make-файла с именем Makefile3:
all: myapp
# Какой компилятор
CC = gcc
<i># Куда установить</i>
<i># INSTDIR=/usr/local/bin</i>
# Где хранятся файлы include
INCLUDE = .
# Опции для разработки
CFLAGS = -g -Wall -ansi
# Опции для рабочей версии
# CFLAGS = -О -Wall -ansi
myapp: main.o 2.o 3.o
$(CC) -о myapp main.о 2.о 3.o
main.о: main.c a.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c
2.о: 2.c a.h b.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c
3.o: 3.c b.h c.h
$(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c
<i>clean:</i>
<i> -rm main.o 2.o 3.o</i>
<i>install: myapp</i>
<i> @if [ -d $(INSTDIR) ]; </i>
<i> then </i>
<i> cp myapp $(INSTDIR);</i>
<i> chmod a+x $(INSTDIR)/myapp;</i>
<i> chmod og-w $(INSTDIR)/myapp;</i>
<i> echo "Installed in $(INSTDIR)";</i>
<i> else </i>
<i> echo "Sorry, $(INSTDIR) does not exist";</i>
<i> fi</i>
В этом 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, благодаря которой выполнение последующей команды возможно лишь при успешном завершении предыдущей. В данном примере вас не слишком заботит успешное завершение предыдущих команд, поэтому можно придерживаться более простой формы.
- Вопросы истории: UNIX, Linux, BSD и другие - Федорчук Алексей Викторович "alv" - Прочая околокомпьтерная литература
- Linux Mint и его Cinnamon. Очерки применителя - Алексей Федорчук - Программное обеспечение
- Язык программирования C++. Пятое издание - Стенли Липпман - Программирование
- Аквариум. (Новое издание, исправленное и переработанное) - Виктор Суворов (Резун) - Шпионский детектив
- Интерфейс: новые направления в проектировании компьютерных систем - Джефф Раскин - Техническая литература