5.4 Утилита make
Утилита make, как известно, используется для сборки сравнительно
больших проектов. Раньше, когда компьютеры не обладали такими
вычислительными мощностями как сейчас, время компиляции исходных
текстов было настолько велико, что возникла необходимость в раздельной и
выборочной компиляции. В чём суть этой раздельной компиляции? Процесс
разбивался на два этапа: превращение исходных текстов в объектные модули и
сборка этих объектных модулей в загрузочный модуль. Далее, если
производить компиляцию выборочно, то есть если не компилировать все
исходные тексты подряд, а компилировать только те, которые претерпели
изменения, можно получить существенную экономию времени сборки всего
проекта.
Для того, чтобы прочувствовать необходимость такой выборочной
компиляции
сейчас,
пожалуй,
необходимо
скомпилировать
что-то
действительно большое. К примеру, ядро операционной системы Linux, или
собрать из исходных текстов Open Office. Правда, помня о такой
маркетинговой уловке производителей железа как закон Мура, я полагаю, с
неуклонным ростом вычислительных ресурсов этот пример станет не очень
удачным уже достаточно скоро.
Зачем же нам тогда make, спросите вы? Ведь большинство проектов для
встроенных систем весьма аскетичны, а скомпилировать три десятка модулей
на C или C++ современный компьютер может за считанные секунды?
237
Ответ очень прост: make достаточно мощный, специализированный
инструмент для работы с проектами.
Со специализацией инструментов я столкнулся в полной мере, когда
попробовал использовать язык Perl для обработки текстов вместо обычного на
тот момент для меня C++. Результат меня тогда поразил. За три дня на язке Perl
был выполнен объем работы, которые потребовал от меня две недели на C++!
Это при том, что C++ я уже использовал давно, а Perl видел в первый раз в
жизни. Perl специально создавали как средство для обработки текстов. C++ не
помогла библиотека STL, хотя вроде как набор механизмов у инструментов был
примерно одинаковый. Разве что в C++ у меня не использовались библиотеки
для разбора регулярных выражений.
В чём же оказалась сила Perl? В первую очередь – в простоте. Краткая
синтакическая конструкция, вызывающая у новичка головную боль и мысли о
распечатке дампа памяти, делает то, что на C++ потребует написания полутора
десятков строк текста. Нам известно, что уровень языка не влияет на
количество ошибок. Влияние оказывает количество строк, то есть чем больше
строк, тем больше ошибок и наоборот. В программе на Perl строк было мало и я
продвигался к завершению проекта быстрыми темпами.
Итак, вернемся к make. Основная цель утилиты – сократить время,
необходимое для описания того, что надо сделать с проектом. Предполагается
при этом, что вы работаете с проектом самостоятельно, без каких либо IDE.
Что нужно делать с проектом во время сборки?
• Убрать старые и ненужные файлы, объектные модули, всякий мусор,
исполняемые файлы и т.д. Это полезно делать перед архивацией
проекта или перед отдачей проекта системе контроля версий.
• Запаковать проект в архив, при этом желательно переписать его в пару-
тройку мест, а чтобы не запутаться – назвать архив так же, как
называется проект.
• Скомпилировать исходные тексты.
• Собрать загрузочный модуль.
• Вызвать необходимые конвертеры для получения формата,
удобоваримого для доставки в контроллер.
• Вызвать программу для доставки загрузочного модуля в контроллер.
Ко всему этому хочется добавить, что проектов у вас много, а вы один.
Большинство описанных выше действий вполне себе стандартно и хочется
вынести их за скобки. Утилита make позволяет описать параметры сборки
проекта в виде переменных, а из этих переменных задать последовательность
действий. Получается, что переменные от проекта к проекту практически не
меняются, а вот их содержимое может изменяться.
Что мы можем указать в виде таких переменных? Попробуем привести
список.
238
• Имя проекта. Это имя можно использовать как имя архива, а также как
имя исполняемого или загрузочного модуля.
• Дополнительные части для имени проекта, такие как дата и время
компиляции, порядковый номер сборки, тип проекта.
• Имя компилятора. В области встроенных систем считается вполне
нормальным частый переход на разные микроконтроллеры и,
соответственно, использование разных компиляторов раз в несколько
месяцев.
• Опции компилятора. Флаги оптимизации, специфические опции,
местоположение заголовочных файлов и т.п.
• Опции линкера. Наименование библиотек, адреса памяти программ и
кода и т.д.
• Архиватор и ключи для архивации.
• Имя программы и ее ключи для доставки ПО в контроллер.
• Список этот далеко не полный, его можно продолжать.
Do'stlaringiz bilan baham: |