Make

Материал из Википедии — свободной энциклопедии
Перейти к навигацииПерейти к поиску
Make
Класс языкаутилита UNIX[вд], сценарный, язык, использующий отступы[вд], система сборки[вд] и язык программирования
Появился в1976; 50 лет назад (1976)[1][2]
АвторСтюарт Фельдман
ДиалектыBSD make, GNU make, Microsoft nmake
Повлиял наAnt,Rake,MSBuild идругие
ЛицензияGPLv3+ (GNU make)
ОСUnix-like

Make (МФА [meɪk]; с англ. — «сделать», «изготовить») —утилита, автоматизирующая процесс преобразования файлов из одной формы в другую. Чаще всего это компиляцияисходного кода вобъектные файлы и последующаякомпоновка висполняемые файлы илибиблиотеки.

Утилита использует специальныеmake-файлы, в которых указаны зависимости файлов друг от друга и правила для их удовлетворения. На основе информации о времени последнего изменения каждого файлаMake определяет и запускает необходимые программы.

Содержание

Происхождение

[править |править код]

До созданияMake системы сборки (компиляции)ПО Unix обычно состояли изshell-скриптов сборки, сопровождавших исходный код программ.

Make была создана Стюартом Фельдманом (англ. Stuart Feldman) в 1976 году вBell Labs. В 1977 году программа стала доступна пользователям[3].

В настоящее время существует множество утилит для отслеживания зависимостей, ноMake — одна из самых широко распространённых, в первую очередь благодаря тому, что она включена вUnix, начиная с версии PWB/UNIX (англ.Programmer’s Workbench), которая содержала инструменты для разработки программного обеспечения.

Современные реализации

[править |править код]

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

  • BSDMake, основанная на работе Адама де Бура (Adam de Boor) над версиейMake, с возможностью параллельной сборки; в той или иной форме перешла вFreeBSD,NetBSD иOpenBSD.
  • GNUMake — входит в большинстводистрибутивов Linux и часто используется в сочетании сGNU toolchain.

POSIX включает в себя стандарт основных возможностей утилитыMake, с той или иной степенью совместимости реализованный в различных версияхMake. Как правило, простые make-файлы могут быть успешно обработаны различными версиямиMake.

Использование

[править |править код]
make[-fmake-файл][цель...]

Файл ищется в текущем каталоге. Если ключ-f не указан, используется имя по умолчанию для make-файла —Makefile (однако в разных реализацияхMake, кроме этого, могут проверяться и другие файлы, напримерGNUmakefile).

Make открывает make-файл, считывает правила и выполняет команды, необходимые для создания указаннойцели.

Стандартные цели для сборкидистрибутивов GNU:

  • all — выполнить сборку пакета;
  • install — установить пакет из дистрибутива (производит копирование исполняемых файлов, библиотек и документации в системные каталоги);
  • uninstall — удалить пакет (производит удаление исполняемых файлов и библиотек из системных каталогов);
  • clean — очистить дистрибутив (удалить из дистрибутива объектные и исполняемые файлы, созданные в процессе компиляции);
  • distclean — очистить все созданные при компиляции файлы и все вспомогательные файлы, созданные утилитой./configure в процессе настройки параметров компиляции дистрибутива.

По умолчанию Make использует самую первую цель в make-файле.

В процессе сборки приложений BSD часто применяют:

  • depend — выполнить компиляцию/выстраивание зависимостей.

Make-файл

[править |править код]

ПрограммаMake выполняет команды согласно правилам, указанным в специальном файле. Этот файл называется make-файл (makefile, мейкфайл). Как правило, make-файл описывает, каким образом нужно компилировать и компоновать программу.

make-файл состоит из правил и переменных. Правила имеют следующий синтаксис:

цель1 цель2 ...:зависимость1 зависимость2 ...команда1команда2...

Правило представляет собой набор команд, выполнение которых приведёт к сборке файлов-целей из файлов-зависимостей.

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

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

Строки, в которых записаныкоманды, должны начинаться с символатабуляции.

Рассмотрим несложную программу на Си. Пусть программа program состоит из пары файлов кода — main.c и lib.c, а также из одногозаголовочного файла — defines.h, который подключён в обоихфайлахкода. Поэтому для создания program необходимо из пар (main.c defines.h) и (lib.c defines.h) создать объектные файлы main.o и lib.o, а затемскомпоновать их в program. При сборке вручную требуется исполнить следующие команды:

cc-cmain.ccc-clib.ccc-oprogrammain.olib.o

Если в процессе разработки программы в файл defines.h будут внесены изменения, потребуетсяперекомпиляция обоих файлов илинковка, а если изменим lib.c, то повторную компиляцию main.c можно не выполнять.

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

  • собирает из этой информации правильную последовательность команд для получения требуемых результирующих файлов;
  • и инициирует создание требуемого файла только в случае, если такого файла не существует или он старше, чем файлы, от которых он зависит.

Если при запускеMake явно не указать цель, то будет обрабатываться первая цель в make-файле, имя которой не начинается с символа «.».

Для программы program достаточно написать следующий make-файл:

program:main.olib.occ-oprogrammain.olib.omain.o lib.o:defines.h

В имени второй цели указаны два файла и для этой же цели не указана команда компиляции. Кроме того, нигде явно не указана зависимость объектных файлов от «*.c»-файлов. Дело в том, что программаMake имеет предопределённые правила для получения файлов с определённымирасширениями. Так, для цели-объектного файла (расширение «.o») при обнаружении соответствующего файла с расширением «.c» будет вызван компилятор «сс -с» с указанием в параметрах этого «.c»-файла и всех файлов-зависимостей.

Синтаксис для определенияпеременных:

переменная=значение

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

OBJ=main.olib.oprogram:$(OBJ)cc-oprogram$(OBJ)$(OBJ):defines.h

Вычисление значений переменных происходит только в момент использования (используется так называемоеленивое вычисление). Например, при сборке цели all из следующего make-файла на экран будет выведена строка «Huh?».

foo=$(bar)bar=$(ugh)ugh=Huh?all:echo$(foo)

Предположим, что к проекту добавился второй заголовочный файл lib.h, который включается только в lib.c. Тогда make-файл увеличится ещё на одну строчку:

lib.o:lib.h

Таким образом, один целевой файл может указываться в нескольких целях. При этом полный список зависимостей для файла будет составлен из списков зависимостей всех целей, в которых он участвует, создание файла будет производиться только один раз.

Многопоточное исполнение

[править |править код]

Для ускорения длительных задач используютраспараллеливание вычислений внутри make-программы. Распараллеливание делается автоматически make-интерпретатором. Для запуска make-файла в многопоточном режиме необходимо передать опцию -j <число потоков>.

make[-j<числопотоков>][цель]

См. также

[править |править код]

Примечания

[править |править код]
  1. Fowler G. S. The Fourth Generation Make // Proc. USENIX Summer Conference. — 1985. — P. 159—174.
  2. Curtsinger C., Barowy D. W. RIKER: Always-Correct and Fast Incremental Builds from Simple Specifications :[англ.] // 2022 USENIX Annual Technical Conference. — 2022. — P. 885-898.
  3. Akhlaghi M., Infante-Sainz R., Roukema B. F., Khellat M., Valls-Gabaud D., Baena-Gallé R. Toward Long-Term and Archivable Reproducibility // Computing in Science & Engineering. — Vol. 23, no. 3. — P. 82-91. —doi:10.1109/MCSE.2021.3072860.

Литература

[править |править код]

Ссылки

[править |править код]
ВВикисловаре есть статья «make»
Перейти к шаблону «Системы автоматизации сборки»
Перейти к шаблону «Команды Unix»
Команды Unix
Перейти к шаблону «POSIX.1-2008»
УтилитыPOSIX.1-2008
Источник —https://ru.wikipedia.org/w/index.php?title=Make&oldid=149825058
Категории:
Скрытые категории: