Эффективное использование GNU Make

Нотариус Химки часы работы. Система от протечек

Эффективное использование GNU Make


Оглавление
0. Предисловие 1. Моя методика использования GNU Make 1.1. Пример проекта 1.2. "Традиционный" способ построения make-файлов 1.3. Автоматическое построение списка объектных файлов 1...
Предисловие
В этой книге я описываю свой опыт работы с утилитой GNU Make и, в частности, мою методику подготовки make-файлов. Я считаю свою методику довольно удобной, поскольку она предполагает: Автоматическо...
Моя методика использования GNU Make
В этой главе я описываю свой способ построения make-файлов для сборки проектов с использование программы GNU Make и компилятора GCC (GNU Compiler Collection) . Предполагается, что вы хорошо знаком...
Пример проекта
В качестве примера я буду использовать "гипотический" проект - текстовой редактор. Он состоит из нескольких файлов с исходным текстом на языке C++ (main.cpp, Editor.cpp, TextLine.cpp) и...
"Традиционный" способ построения make-файлов
В первом примере make-файл построен "традиционным" способом. Все исходные файлы собираемой программы находятся в одном каталоге: example_1-traditional / main.cpp main.h Editor.cpp Edito...
Автоматическое построение списка объектных файлов
"Ручное" перечисление всех объектных файлов, входящих в программу - достаточно нудная работа, которая, к счастью, может быть автоматизирована. Разумеется "простой трюк" вроде:...
Автоматическое построение зависимостей от заголовочных файлов
"Ручное" перечисления зависимостей объектных файлов от заголовочных файлов - занятие еще более утомительное и неприятное, чем "ручное" перечисление объектных файлов. Указывать...
"Разнесение" файлов с исходными текстами по директориям
Приведенный в предыдущем параграфе make-файл вполне работоспособен и с успехом может быть использован для сборки небольших программ. Однако, с увеличением размера программы, становится не очень уд...
Сборка программы с разными параметрами компиляции
Часто возникает необходимость в получении нескольких вариантов программы, которые были скомпилированы по-разному. Типичный пример - отладочная и рабочая версии программы. В таких случаях я использ...
"Разнесение" разных версий программы по отдельным директориям
В том случае если я собираю несколько вариантов одной и той же программы (например, отладочную и рабочую версию), становится неудобным помещать результаты компиляции в один и тот же каталог. При п...
GNU Make
В этой главе я кратко опишу некоторые возможности программы GNU Make, которыми я пользуюсь при написании своих make-файлов, а также укажу на ее отличия от "традиционных" версий make. Пре...
Две разновидности переменных
GNU Make поддерживает два способа задания переменных, которые несколько различаются по смыслу. Первый способ - традиционный, с помощью оператора '=': compile_flags = -O3 -funroll-loops -fomit-fram...
Функции манипуляции с текстом
Утилита GNU Make содержит большое число полезных функций, манипулирующих текстовыми строками и именами файлов. В частности в своих make-файлах я использую функции addprefix, addsuffix, wildcard,...
Новый способ задания шаблонных правил
В "традиционных" вариантах make шаблонное правило задается с помощью конструкций, наподобие: .cpp.o: gcc $^ -o $@ То есть под действие правила попадают файлы с определенными расширениями...
Переменная VPATH
С помощью переменной VPATH можно задать список каталогов, где шаблонные правила будут искать зависимости. В следующем примере: VPATH := Editor TextLine %.o: %.cpp gcc -c $< make будет искать фа...
Директива override
Переменные в GNU Make могут создаваться и получать свое значение разными способами: Задаваться внутри make-файла "Автоматически" создаваться программой make из переменных среды Задаватьс...
Добавление текста в строку
Часто возникает необходимость добавить текст к существующей переменной. Для этой цели служит оператор "+=". Добавляемый текст может быть как текстовой константой, так и иметь ссылки на д...
Директива include
С помощью директивы include можно включать в обрабатываемый make-файл другие файлы. Работает она аналогично директиве #include в языках C и C++. Когда встречается эта директива, обработка "те...
Автоматические переменные
Программа GNU Make поддерживает большое число автоматических переменных. В своих make-файлах я использую следующие автоматические переменные: Имя автоматической переменной Значение $@ Имя цели обр...
"Комбинирование" правил
В make-файле могут встречаться несколько правил, имеющих одинаковую цель. В таком случае они как бы "комбинируются вместе". Например, следующие два правила: TextLine.o: TextLine.cpp gcc...
Make-файл, используемый по умолчанию
Если при вызове программы GNU Make не указывать явно, какой make-файл следует обрабатывать, то она пытается найти и обработать файлы GNUmakefile, makefile и Makefile (именно в таком порядке). Руко...
Специальная цель .PHONY
В традиционных реализациях, у программы make нет надежного способа узнать, чем именно является цель, указанная в правиле. Цель может быть как именем действия, так и именем файла. Исходя только из...
Утилита make
Утилита make, входящая в состав практически всех Unix-подобных операционных систем - это традиционное средство, применяемое для сборки программных проектов. Она является универсальной программой д...
Правила
Основным "строительным элементом" make-файла являются правила (rules). В общем виде правило выглядит так: ... : ... ... Цель (target) - это некий желаемый результат, способ достижен...
Алгоритм работы make
Типичный make-файл проекта содержит несколько правил. Каждое из правил имеет некоторую цель и некоторые зависимости. Смыслом работы make является достижение цели, которую она выбрала в качестве гл...
1 Выбор главной цели
Главная цель может быть прямо указана в командной строке при запуске make. В следующем примере make будет стремиться достичь цели iEdit (получить новую версию файла iEdit): make iEdit А в этом пр...
2 Достижение цели
После того как главная цель выбрана, make запускает "стандартную" процедуру достижения цели. Сначала в make-файле ищется правило, которое описывает способ достижения этой цели (функция Н...
3 Обработка правил
Обработка правила разделяется на два основных этапа. На первом этапе обрабатываются все зависимости, перечисленные в правиле (функция ОбработатьЗависимости). На втором этапе принимается решение -...
4 Обработка зависимостей
Функция ОбработатьЗависимости поочередно проверяет все перечисленные в правиле зависимости. Некоторые из них могут оказаться целями каких-нибудь правил. Для этих зависимостей выполняется обычная п...
5 Обработка команд
На стадии обработки команд решается вопрос - нужно ли выполнять описанные в правиле команды или нет. Считается, что нужно выполнять команды если: Цель является именем действия (абстрактной целью)...
Абстрактные цели и имена файлов
Каким образом make отличает имена действий от имен файлов? Традиционные варианты make поступают просто. Сначала ищется файл с таким именем. Если файл найден, то считается что цель или зависимость...
Пример работы make
Рассмотрим, как утилита make будет обрабатывать такой make-файл: iEdit: main.o Editor.o TextLine.o gcc main.o Editor.o TextLine.o -o iEdit main.o: main.cpp gcc -c main.cpp Editor.o: Editor.cpp gcc...
Еще один пример работы make
Рассмотрим, как будет действовать утилита make, если для обработки описанного в предыдущей главе make-файла, она будет вызвана следующим образом: make clean Цель явно указана в командной строке, п...
Переменные
Возможность использования переменных внутри make-файла - очень удобное и часто используемое свойство make. В традиционных версиях утилиты, переменные ведут себя подобно макросам языка Си. Для зада...
Автоматические переменные
Автоматические переменные - это переменные со специальными именами, которые "автоматически" принимают определенные значения перед выполнением описанных в правиле команд. Автоматические п...
Шаблонные правила
Шаблонные правила (implicit rules или pattern rules) - это правила, которые могут быть применены к целой группе файлов. В этом их отличие от обычных правил - описывающих отношения между конкретным...
Приложение A. Редактирование make-файлов в разных операционных системах
Если, наряду с операционной системой Linux, вы работаете с операционными системами фирмы Microsoft (DOS, Windows), то при редактировании make-файлов в разных системах могут возникнуть определенные...
Приложение B. Организация иерархии каталогов в сложных проектах
Для сложных проектов, состоящих из большого количества файлов, я предпочитаю более сложную организацию каталогов, чем та, которая приводилась в качестве примера в разделе 1.7. "Разнесение раз...
Приложение C. Компилятор GCC
GNU Compiler Collection (GCC) - это семейство компиляторов с языков C, C++ и Object-C, которые объединены общей технологией и распространяются в рамках проекта GNU. Домашняя страничка компилятора...
Версии компилятора
Компилятор GCC развивается весьма динамично - программа улучшается, исправляются обнаруженные ошибки, добавляются новые возможности. Всегда желательно знать с какой версией компиляторы вы в данный...
Отладка
"Стандартным" средством для отладки программ, скомпилированных компилятором GCC, является отладчик GDB. Этот отладчик свободно распространяется в рамках проекта GNU. Домашняя страничка о...
Рабочий вариант
При компиляции рабочего варианта программы, я включаю максимальную оптимизацию по скорости. Возможно это приводит к некоторому увеличению размера программы, но я считаю это не слишком важным. Вряд...
Обработка исключений
Если вы используете механизм исключений (exceptions) языка C++, то при компиляции должна быть включена соответствующая опция: Ключ компиляции Назначение -fexceptions Включить поддержку механизма и...
Статическая и динамическая компоновка
По умолчанию компилятор компонует собранную программу с динамическими версиями стандартных библиотек. Это не всегда удобно. Для того чтобы стандартные библиотеки компоновались статически, нужно ис...
Получение листинга
Часто бывает полезным иметь ассемблерный листинг кода, генерируемого компилятором. С помощью такого листинга можно: Посмотреть, как те или иные опции оптимизации отражаются на генерируемом коде По...
Переназначение ошибок в файл
По умолчанию, компилятор GCC выдает ошибки в стандартный поток сообщений об ошибках (файл с дескриптором 2). Иногда это не очень удобно - сообщения об ошибках могут быть очень длинными и подробным...
Опция -pipe
Компилятор GCC обрабатывает программу за несколько проходов, помещая промежуточные результаты компиляции во временные файлы. Процесс компиляцию можно ускорить, если воспользоваться опцией -pipe. П...
Тексты с символом "возврат каретки"
В отличие от утилиты GNU Make, компилятор GCC вполне "лояльно" относится к наличию символов "возврат каретки" в компилируемых текстах - такие символы попросту игнорируются. Поэ...
Приложение D. "Гипотический" проект - текстовой редактор
В первой главе "Моя методика использования GNU Make" в качестве примера рассматривается "гипотический" проект - текстовой редактор. Он состоит из трех файлов с исходным текстом...








Начало    


Книжный магазин