Добавить в корзинуПозвонить
Найти в Дзене
Сделай игру

Про сборку больших проектов

Сам по себе процесс сборки, чаще всего, довольно прост и понятен (особенно, когда это касается чего-то наподобие webpack). Обычно, он описывается только один раз и далее, к нему почти никогда не возвращаются. Но это для простых проектов; ситуация кардинально меняется, когда надо собрать нечто большое. Make на все времена Утилита make появилась с первой версией Unix (если читать историческую справку, то она появилась раньше, а вот распространяться стала с версии 1.0) и сразу стала очень популярной. Делала она только одно дело: управляла сборкой проектов, т.е. делала из набора файлов с исходниками - исполняемый файл. Она оказалась довольно полезной, в связи с чем на сегодняшний день существует уже несколько различных вариантов данной утилиты и при попытке собрать какой-нибудь большой открытый проект - вы с высокой вероятностью наткнётесь на необходимость её использования. Откуда такая популярность? Почему бы не скрипт сборки И действительно, поначалу сборка проекта осуществлялось силами
Оглавление

Сам по себе процесс сборки, чаще всего, довольно прост и понятен (особенно, когда это касается чего-то наподобие webpack). Обычно, он описывается только один раз и далее, к нему почти никогда не возвращаются. Но это для простых проектов; ситуация кардинально меняется, когда надо собрать нечто большое.

ИИ видит GNU make как-то так
ИИ видит GNU make как-то так

Make на все времена

Утилита make появилась с первой версией Unix (если читать историческую справку, то она появилась раньше, а вот распространяться стала с версии 1.0) и сразу стала очень популярной. Делала она только одно дело: управляла сборкой проектов, т.е. делала из набора файлов с исходниками - исполняемый файл.

Она оказалась довольно полезной, в связи с чем на сегодняшний день существует уже несколько различных вариантов данной утилиты и при попытке собрать какой-нибудь большой открытый проект - вы с высокой вероятностью наткнётесь на необходимость её использования.

Откуда такая популярность?

Почему бы не скрипт сборки

И действительно, поначалу сборка проекта осуществлялось силами самописных скриптов (скажем, ./build и ./install - не забывайте, это про unix системы). Но в какой-то момент появилась одна неприятная проблема: сборка начала занимать слишком много времени.

При этом, чаще всего, любой проект состоял из нескольких объектных файлов, которые собирались уже в исполняемый файл, а каждый объектный файл - генерировался на основании нескольких файлов исходного кода, например, на С. Получалась печальная история: изменения затрагивали всего один объектный файл, а пересобирать приходилось все. И это могло, во-первых, занимать довольно много времени, а, во-вторых, неучтённые изменения могли привести к крушению ещё недавно работающих программ.

Так что скрипт сборки хотя и годился, но не отвечал всем запросам.

И так, на сцену выходит главный герой сегодняшнего повествования: make. Он делал весьма простое действие: отслеживал актуальность даты и времени файлов и запускал пересборку лишь тех целей (в терминологии утилиты и в данном контексте - это те файлы, которые надо собрать), которые надо было пересобрать, а не всех подряд.

А что сегодня

Если вы пробовали собирать какие-то достаточно большие проекты (да хоть бы последнюю версию node.js или какие-нибудь приложения из исходников под свою ОС), то, наверняка заметили, что это, даже несмотря на современные технологии, всегда требует довольно много времени.

Притом, нередко сборка заваливается из-за того, что в системе не хватает какой-нибудь библиотеки. И если для случая, когда цель сборки была только одна - то тут мало что можно изменить, а когда их было несколько - возникает вполне оправданное желание сэкономить хотя бы то время, которое было потрачено на успешную сборку соседних целей (иногда это несколько минут, а иногда - несколько часов).

Так что утилита не только не утратила своей актуальности, но и, напротив, живее всех живых.

Как с ней работать

Вообще, я хотел лишь популяризовать данную утилиту, но не учить с ней работать. Однако, в двух словах, опишу, что там к чему:

  • Утилита требует Makefile с описанием действий;
  • Есть цели, а есть зависимости: цель - это либо файл, который должен быть собран из зависимостей, либо команда - по сути, небольшой скрипт;
  • Каждую запись в файле я буду условно называть секцией;
  • Кстати, если цель - файл, то всё равно потребуется скрипт - как этот файл надо собирать (фактически, в объявлении секции определяются те файлы, которые надо отслеживать);
  • Если цель - команда, надо об этом сообщить утилите в специальной секции .PHONY
  • Можно объявлять ещё и переменные вида ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ для последующего использования (например, получить текущую версию ОС и использовать её в именах файлов);
  • Цели-файлы отлично превращаются в цели-зависимости: то есть, выходной файл может зависеть от файлов, которые ещё нет и появятся в результате сборки;
  • При запуске make - утилита берёт данные из Makefile и, если не задано никаких дополнительных условий, выполняет первую секцию;
  • Есть и другие возможности, о которых я ничего не сказал.

Если хотите освоиться с утилитой - вот простое изложение или официальная документация GNU версии утилиты (есть и другие).