Шрифт:
Интервал:
Закладка:
цель1: список_необходимых_файлов
последовательность_команд
...
цельN: список_необходимых_файлов
последовательностъ_команд
Цель — это метка для некоторой последовательности команд (например, install) или результирующий файл, который нужно «построить» — скомпилировать или скомпоновать.
Цели должны отделяться друг от друга хотя бы одной пустой строкой. Список необходимых файлов — это перечень файлов или других целей, которые нужны для достижения данной цели; он может быть и пустым.
Последовательность команд — это команды, которые нужно выполнить для достижения цели. Последовательность команд должна отделяться от начала строки символом табуляции, иначе вы получите ошибку «missing separator» (нет разделителя).
Make-файл может содержать комментарии — они начинаются символом #.
В make-файлах вы можете использовать макроопределения:
CC=gcc
PATH=/usr/include /usr/src/linux/include
MODFLAGS:= -O3 -Wall -DLINUX -I$(PATH)
...
$(CC) $(MODFLAGS) -c proga.c
Чтобы обратиться к макроопределению в команде или в другом макроопределении, нужно использовать конструкцию $(имя). Макроопределение может включать в себя другое, ранее определенное, макроопределение.
Формат запуска утилиты make:
make [-f файл] [ключи] [цель]
Ключ -f указывает файл инструкций, который нужно использовать вместо Makefile. Если этот ключ не указан, то make ищет в текущем каталоге файл Makefile и начинает собирать указанную цель. Если цель не указана, то выполняется первая встреченная в make-файле. Сборка выполняется рекурсивно: make сначала выполняет все цели, от которых зависит текущая цель. Если зависимость представляет собой файл, то make сравнивает его время последней модификации со временем целевого файла: если целевой файл старше или отсутствует, то будет выполнена указанная последовательность команд. Если целевой файл моложе, то текущая цель считается достигнутой.
ПримечаниеЕсли нужно избежать пересборки какого-то из файлов проекта, то можно искусственно «омолодить» его командой touch, которая присвоит ему в качестве времени последней модификации текущее время. Если нужно, наоборот, принудительно пересобрать цель, то следует «омолодить» один из файлов, от которых она зависит.
Работа программы make заканчивается, когда достигнута цель, указанная в командной строке. Обычно это цель all, собирающая все результирующие файлы проекта. Другими распространенными целями являются install (установить собранную программу) и clean (удалить ненужные файлы, созданные в процессе сборки).
В листинге 21.2 представлен make-файл, собирающий небольшой проект из двух программ client и server, каждая из которых компилируется из одного файла исходного кода.
Листинг 21.2. Примерный make-файл
CC=gcc
CFLAGS=-O
all: client server
client: client.с
$(CC) client.с -о client
server: server.с
$(CC) server.с -о server
Обычно при вызове утилиты make не нужно задавать никаких ключей. Но иногда использование ключей бывает очень кстати (таблица 21.1).
Ключи команды make Таблица 21.1
Ключ Назначение -C каталог Перейти в указанный каталог перед началом работы -d Вывод отладочной информации -e Приоритет переменным окружения. Если у нас установлена переменная окружения CC и в Makefile есть переменная с таким же именем, то будет использована переменная окружения -f файл Использовать указанный файл вместо Makefile -i Игнорировать ошибки компилятора -I каталог В указанном каталоге будет производиться поиск файлов, включаемых в Makefile -j n Запускать не более n команд одновременно -k Продолжить работу после ошибки, если это возможно -n Вывести команды, которые должны были выполниться, но не выполнять их -о файл Пропустить данный файл, даже если в Makefile указано, что он должен быть создан заново -r Не использовать встроенные правила -s Не выводить команды перед их выполнением -w Вывод текущего каталога до и после выполнения команды21.3. Пакет binutils и другие полезные программы
Пакет binutils содержит утилиты для работы с бинарными файлами:
♦ ld — компоновщик: программа, связывающая объектные файлы и библиотеки в исполняемый файл;
♦ ar — работа с архивами (создания, модификация и извлечение);
♦ nm — вывод названий идентификаторов из двоичных файлов;
♦ objcopy — копирование и трансляция двоичных файлов;
♦ objdump — вывод информации из двоичных файлов;
♦ ranlib — генерирование индекса оглавления архива;
♦ size — вывод размеров секций архива или двоичного файла;
♦ strings — вывод строк, которые возможно прочитать, из двоичных файлов;
♦ addr2line — конвертирование адресов в памяти в строку в файле;
♦ nlmconv — конвертирует объектный код в NLM.
А теперь перечислим несколько полезных вспомогательных программ.
21.3.1. ansi2knr
Утилита ansi2knr предназначена для преобразования текстов программ, написанных в соответствии со стандартом ANSI С, в программы на «классическом» С Кернигана и Ричи. Формат вызова:
ansi2knr oldfile.c newfile.c
21.3.2. as
Программа as — это GNU-версия ассемблера, предназначенная для создания объектных файлов из программ, написанных на языке ассемблера. Формат вызова:
as [ключи] файл1 [файл2 ... файлN]
Ключи программы as Таблица 21.2
Ключ Назначение -а Вывод листинга -ad He выводить отладочные сообщения -ad Включение в листинг текста программы, написанной на языке высокого уровни, если компиляций проводилась с ключом -g -al Вывод листинга на ассемблере -an Не обрабатывать форм -as Вывод списка символов программы -aфайл Вывести листинг в указанный файл -f Быстрый режим. Директивы препроцессора не обрабатываются -iпуть Добавить указанный путь к Include-пути -MRI Обеспечить MRI-совместимость -о файл Создание объектного файла с указанным именем -R Поместить сегмент данных в сегмент кода -v Вывод версии -W Не выводить предупреждения21.3.3. bison
Программа bison — это грамматический разборщик (парсер): она создает C-программу, предназначенную для разбора определенной грамматики. Данная программа вам не понадобится до тех пор, пока вы не захотите написать собственный компилятор. Ключи программы представлены в таблице 21.3. Формат вызова:
bison [ключи] файл
Ключи программы bison Таблица 21.3
Ключ Назначение -b префикс Использовать указанный префикс для имени входящего файла -d Создать заголовочный файл, содержащий информацию о типах грамматических образцов (токенов), которые определены в вашей грамматике -I Не вставлять код в существующие файлы -о файл Установить файл результата -t Включить отладочную информацию -v Записать созданную программу в файл у.out put21.3.4. flex
- Операционная система UNIX - Андрей Робачевский - Программное обеспечение
- Разработка приложений в среде Linux. Второе издание - Майкл Джонсон - Программное обеспечение
- Искусство программирования для Unix - Эрик Реймонд - Программное обеспечение
- Linux - Алексей Стахнов - Программное обеспечение
- Fedora 8 Руководство пользователя - Денис Колисниченко - Программное обеспечение
- Недокументированные и малоизвестные возможности Windows XP - Роман Клименко - Программное обеспечение
- Изучаем Windows Vista. Начали! - Дмитрий Донцов - Программное обеспечение
- Windows Vista - Виталий Леонтьев - Программное обеспечение
- Архитектура операционной системы UNIX - Морис Бах - Программное обеспечение
- Windows Vista. Трюки и эффекты - Юрий Зозуля - Программное обеспечение