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







Содержание