Эффективное использование 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" в качестве примера рассматривается "гипотический" проект - текстовой редактор. Он состоит из трех файлов с исходным текстом...








Начало    


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