<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://wikihandbk.com/ruwiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F%3AMake</id>
	<title>Русская Википедия:Make - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://wikihandbk.com/ruwiki/index.php?action=history&amp;feed=atom&amp;title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F%3AMake"/>
	<link rel="alternate" type="text/html" href="http://wikihandbk.com/ruwiki/index.php?title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:Make&amp;action=history"/>
	<updated>2026-09-24T13:53:13Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>http://wikihandbk.com/ruwiki/index.php?title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:Make&amp;diff=8720735&amp;oldid=prev</id>
		<title>EducationBot: Новая страница: «{{Русская Википедия/Панель перехода}} {{много внутренних ссылок|дата=2022-12-10}} {{Язык программирования  | название             =  | логотип              =  | семантика            =  | класс                =  | тип                  =  | дата выпуска         = {{Start date and age|1976|04}}  | автор                = Stuart Feldman...»</title>
		<link rel="alternate" type="text/html" href="http://wikihandbk.com/ruwiki/index.php?title=%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B0%D1%8F_%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:Make&amp;diff=8720735&amp;oldid=prev"/>
		<updated>2023-07-15T20:45:02Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «{{Русская Википедия/Панель перехода}} {{много внутренних ссылок|дата=2022-12-10}} {{Язык программирования  | название             =  | логотип              =  | семантика            =  | класс                =  | тип                  =  | дата выпуска         = {{Start date and age|1976|04}}  | автор                = &lt;a href=&quot;/ruwiki/index.php?title=Stuart_Feldman&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Stuart Feldman (страница не существует)&quot;&gt;Stuart Feldman&lt;/a&gt;...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Русская Википедия/Панель перехода}}&lt;br /&gt;
{{много внутренних ссылок|дата=2022-12-10}}&lt;br /&gt;
{{Язык программирования&lt;br /&gt;
 | название             =&lt;br /&gt;
 | логотип              =&lt;br /&gt;
 | семантика            =&lt;br /&gt;
 | класс                =&lt;br /&gt;
 | тип                  =&lt;br /&gt;
 | дата выпуска         = {{Start date and age|1976|04}}&lt;br /&gt;
 | автор                = [[Stuart Feldman]]&lt;br /&gt;
 | разработчик          =&lt;br /&gt;
 | расширение           =&lt;br /&gt;
 | последняя версия     =&lt;br /&gt;
 | дата выпуска последней версии          =&lt;br /&gt;
 | последняя тестовая версия              =&lt;br /&gt;
 | дата выпуска последней тестовой версии =&lt;br /&gt;
 | система типов        =&lt;br /&gt;
 | реализации           =&lt;br /&gt;
 | диалекты             = BSD make, GNU make, Microsoft nmake&lt;br /&gt;
 | испытал влияние      =&lt;br /&gt;
 | повлиял на           = [[Apache Ant|Ant]], [[Rake]], [[MSBuild]], and ''[[List of build automation software#Non-Make-based tools|другие]]''&lt;br /&gt;
 | лицензия             =&lt;br /&gt;
 | платформа            =&lt;br /&gt;
 | операционная система = [[Unix-like]]&lt;br /&gt;
 | сайт                 =&lt;br /&gt;
}}&lt;br /&gt;
'''Make''' (&amp;lt;small&amp;gt;[[МФА]]&amp;lt;/small&amp;gt; {{МФА2|m|e|ɪ|k}}; {{tr-en|сделать|изготовить}}) — [[утилита]], автоматизирующая процесс преобразования [[файл]]ов из одной формы в другую. Чаще всего это компиляция [[Исходный код|исходного кода]] в [[Объектный файл|объектные файлы]] и последующая [[Компоновщик|компоновка]] в [[Исполняемый файл|исполняемые файлы]] или [[Библиотека (программирование)|библиотеки]].&lt;br /&gt;
&lt;br /&gt;
Утилита использует специальные [[Makefile|make-файлы]], в которых указаны зависимости файлов друг от друга и правила для их удовлетворения. На основе информации о времени последнего изменения каждого файла &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; определяет и запускает необходимые программы.&lt;br /&gt;
&lt;br /&gt;
== Происхождение ==&lt;br /&gt;
До создания &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; системы сборки (компиляции) [[Программное обеспечение|ПО]] Unix обычно состояли из [[Командный интерпретатор|shell]]-[[скрипт]]ов сборки, сопровождавших исходный код программ.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; была создана Стюартом Фельдманом (''Stuart Feldman'') в апреле [[1976 год]]а в [[Bell Labs]].&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество утилит для отслеживания зависимостей, но &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; — одна из самых широко распространённых, в первую очередь благодаря тому, что она включена в [[Unix]], начиная с версии PWB/UNIX (англ. ''Programmer’s Workbench''), которая содержала инструменты для разработки [[программное обеспечение|программного обеспечения]].&lt;br /&gt;
&lt;br /&gt;
== Современные версии ==&lt;br /&gt;
Существует несколько версий &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt;, основанных на оригинальной &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; или написанных с нуля, использующих те же самые форматы файлов и базовые принципы и алгоритмы, а также содержащие некоторые улучшения и расширения. Например:&lt;br /&gt;
* [[BSD]] &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt;, основанная на работе Адама де Бура (''Adam de Boor'') над версией &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt;, с возможностью параллельной сборки; в той или иной форме перешла в [[FreeBSD]], [[NetBSD]] и [[OpenBSD]].&lt;br /&gt;
* [[GNU]] &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; — входит в большинство [[дистрибутив Linux|дистрибутивов Linux]] и часто используется в сочетании с [[GNU build system]].&lt;br /&gt;
&lt;br /&gt;
[[POSIX]] включает в себя стандарт основных возможностей утилиты &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt;, с той или иной степенью совместимости реализованный в различных версиях &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt;. Как правило, простые make-файлы могут быть успешно обработаны различными версиями &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Использование ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
make [ -f make-файл ] [ цель ] ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Файл ищется в текущем каталоге. Если ключ &amp;lt;tt&amp;gt;-f&amp;lt;/tt&amp;gt; не указан, используется имя по умолчанию для make-файла — &amp;lt;tt&amp;gt;Makefile&amp;lt;/tt&amp;gt; (однако в разных реализациях &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt;, кроме этого, могут проверяться и другие файлы, например &amp;lt;tt&amp;gt;GNUmakefile&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; открывает make-файл, считывает правила и выполняет команды, необходимые для создания указанной ''цели''.&lt;br /&gt;
&lt;br /&gt;
Стандартные цели для сборки [[дистрибутив]]ов GNU:&lt;br /&gt;
&lt;br /&gt;
* all — выполнить сборку пакета;&lt;br /&gt;
* install — установить пакет из дистрибутива (производит копирование исполняемых файлов, библиотек и документации в системные каталоги);&lt;br /&gt;
* uninstall — удалить пакет (производит удаление исполняемых файлов и библиотек из системных каталогов);&lt;br /&gt;
* clean — очистить дистрибутив (удалить из дистрибутива объектные и исполняемые файлы, созданные в процессе компиляции);&lt;br /&gt;
* distclean — очистить все созданные при компиляции файлы и все вспомогательные файлы, созданные утилитой &amp;lt;tt&amp;gt;./configure&amp;lt;/tt&amp;gt; в процессе настройки параметров компиляции дистрибутива.&lt;br /&gt;
&lt;br /&gt;
По умолчанию Make использует самую первую цель в make-файле.&lt;br /&gt;
&lt;br /&gt;
В процессе сборки приложений BSD часто применяют:&lt;br /&gt;
* depend — выполнить компиляцию/выстраивание зависимостей.&lt;br /&gt;
&lt;br /&gt;
== Make-файл ==&lt;br /&gt;
Программа &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; выполняет команды согласно правилам, указанным в специальном файле. Этот файл называется make-файл (makefile, мейкфайл). Как правило, make-файл описывает, каким образом нужно компилировать и компоновать программу.&lt;br /&gt;
&lt;br /&gt;
make-файл состоит из правил и переменных. Правила имеют следующий синтаксис:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
цель1 цель2 ...: реквизит1 реквизит2 ...&lt;br /&gt;
    	команда1&lt;br /&gt;
    	команда2&lt;br /&gt;
    	...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Правило'' представляет собой набор команд, выполнение которых приведёт к сборке файлов-''целей'' из файлов-''реквизитов''.&lt;br /&gt;
&lt;br /&gt;
Правило сообщает &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt;, что файлы, получаемые в результате работы команд (''цели''), являются зависимыми от соответствующих файлов-реквизитов. &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; никак не проверяет и не использует содержимое файлов-реквизитов, однако указание списка файлов-реквизитов требуется только для того, чтобы &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; убедилась в наличии этих файлов перед началом выполнения команд и для отслеживания зависимостей между файлами.&lt;br /&gt;
&lt;br /&gt;
Обычно цель представляет собой имя файла, который генерируется в результате работы указанных команд. Целью также может служить название некоторого действия, которое будет выполнено в результате выполнения команд (например, цель clean в make-файлах для компиляции программ обычно удаляет все файлы, созданные в процессе [[Компилятор|компиляции]]).&lt;br /&gt;
&lt;br /&gt;
Строки, в которых записаны ''команды'', должны начинаться с символа [[Табуляция|табуляции]].&lt;br /&gt;
&lt;br /&gt;
Рассмотрим несложную программу на Си. Пусть программа program состоит из пары файлов кода — main.c и lib.c, а также из одного [[Заголовочный файл|заголовочного файла]] — defines.h, который подключён в обоих [[файл]]ах [[Исходный код|кода]]. Поэтому для создания program необходимо из пар (main.c defines.h) и (lib.c defines.h) создать объектные файлы main.o и lib.o, а затем [[Компоновщик|скомпоновать]] их в program. При сборке вручную требуется исполнить следующие команды:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
cc -c main.c&lt;br /&gt;
cc -c lib.c&lt;br /&gt;
cc -o program main.o lib.o&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если в процессе разработки программы в файл defines.h будут внесены изменения, потребуется [[Компиляция (программирование)|перекомпиляция]] обоих файлов и [[Компоновщик|линковка]], а если изменим lib.c, то повторную компиляцию main.c можно не выполнять.&lt;br /&gt;
&lt;br /&gt;
Таким образом, для каждого файла, который мы должны получить в процессе [[Компилятор|компиляции]], нужно указать, на основе каких файлов и с помощью какой команды он создаётся. Программа &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; на основе этих данных выполняет следующее:&lt;br /&gt;
* собирает из этой информации правильную последовательность команд для получения требуемых результирующих файлов;&lt;br /&gt;
* и инициирует создание требуемого файла только в случае, если такого файла не существует или он старше, чем файлы, от которых он зависит.&lt;br /&gt;
&lt;br /&gt;
Если при запуске &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; явно не указать цель, то будет обрабатываться первая цель в make-файле, имя которой не начинается с символа «.».&lt;br /&gt;
&lt;br /&gt;
Для программы program достаточно написать следующий make-файл:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
program: main.o lib.o&lt;br /&gt;
        cc -o program main.o lib.o&lt;br /&gt;
main.o lib.o: defines.h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Стоит отметить ряд особенностей. В имени второй цели указаны два файла и для этой же цели не указана команда компиляции. Кроме того, нигде явно не указана зависимость объектных файлов от «*.c»-файлов. Дело в том, что программа &amp;lt;tt&amp;gt;Make&amp;lt;/tt&amp;gt; имеет предопределённые правила для получения файлов с определёнными [[Расширение имени файла|расширениями]]. Так, для цели-[[Объектный модуль|объектного файла]] (расширение «.o») при обнаружении соответствующего файла с расширением «.c» будет вызван [[компилятор]] «сс -с» с указанием в параметрах этого «.c»-файла и всех файлов-зависимостей.&lt;br /&gt;
&lt;br /&gt;
Синтаксис для определения [[Переменная (программирование)|переменных]]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
переменная = значение&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Значением'' может являться произвольная последовательность [[Символьный тип|символов]], включая [[пробел]]ы и обращения к значениям других [[Переменная (программирование)|переменных]]. С учётом сказанного, можно модифицировать наш make-файл следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
OBJ = main.o lib.o&lt;br /&gt;
program: $(OBJ)&lt;br /&gt;
        cc -o program $(OBJ)&lt;br /&gt;
$(OBJ): defines.h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Нужно отметить, что вычисление значений переменных происходит только в момент использования (используется так называемое [[Ленивые вычисления|ленивое вычисление]]). Например, при сборке цели all из следующего make-файла на экран будет выведена строка «Huh?».&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
foo = $(bar)&lt;br /&gt;
bar = $(ugh)&lt;br /&gt;
ugh = Huh?&lt;br /&gt;
all:&lt;br /&gt;
        echo $(foo)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предположим, что к проекту добавился второй заголовочный файл lib.h, который включается только в lib.c. Тогда make-файл увеличится ещё на одну строчку:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
lib.o: lib.h&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, один целевой файл может указываться в нескольких целях. При этом полный список зависимостей для файла будет составлен из списков зависимостей всех целей, в которых он участвует, создание файла будет производиться только один раз.&lt;br /&gt;
&lt;br /&gt;
== Многопоточное исполнение ==&lt;br /&gt;
Для ускорения длительных задач используют [[Распараллеливание программ|распараллеливание]] вычислений внутри make-программы. Распараллеливание делается автоматически make-интерпретатором. Для запуска make-файла в многопоточном режиме необходимо передать опцию -j &amp;lt;число потоков&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
make [ -j &amp;lt;число потоков&amp;gt; ] [ цель ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Autotools]]&lt;br /&gt;
* [[CMake]]&lt;br /&gt;
* [[Ninja (система сборки)|Ninja]]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* [http://www.gnu.org/software/make/manual/ Руководство по GNU make] {{Wayback|url=http://www.gnu.org/software/make/manual/ |date=20060924065222 }} и его переводы — не единственные документы, подходящие для обучения. Для того, чтобы изучить данный инструмент, можно воспользоваться и другими информационными источниками:&lt;br /&gt;
* [https://github.com/roman-kashitsyn/managing_progects_with_GNUmake_ru Управление проектами с GNU Make (эта книга — русский перевод «Managing Projects with GNU Make, Third Edition»)] {{Wayback|url=https://github.com/roman-kashitsyn/managing_progects_with_GNUmake_ru |date=20180611021737 }}&lt;br /&gt;
* [http://www.oreilly.com/openbook/make3/book/index.csp Managing Projects with GNU Make, Third Edition] {{Wayback|url=http://www.oreilly.com/openbook/make3/book/index.csp |date=20160709221625 }}&lt;br /&gt;
* [https://habrahabr.ru/post/321468/ Как создавать, собирать, устанавливать и использовать пакеты с программами и библиотеками для UNIX-подобных систем] {{Wayback|url=https://habrahabr.ru/post/321468/ |date=20170209060942 }}&lt;br /&gt;
* [https://habrahabr.ru/post/211751/ Просто о make] {{Wayback|url=https://habrahabr.ru/post/211751/ |date=20170211080301 }}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
{{Викисловарь|make}}&lt;br /&gt;
* [http://www.gnu.org/software/make/manual/ Руководство по GNU make на gnu.org] {{Wayback|url=http://www.gnu.org/software/make/manual/ |date=20060924065222 }}{{ref-en}}&lt;br /&gt;
* [http://linuxlib.ru/prog/make_379_manual.html Руководство по GNU make (версия 3.79)] {{Wayback|url=http://linuxlib.ru/prog/make_379_manual.html |date=20110612004946 }}{{ref-ru}}&lt;br /&gt;
* [http://www.freebsd.org/cgi/man.cgi?query=make&amp;amp;sektion=1 Руководство по FreeBSD make] {{Wayback|url=http://www.freebsd.org/cgi/man.cgi?query=make&amp;amp;sektion=1 |date=20131222124443 }}{{ref-en}}&lt;br /&gt;
* [http://ylsoftware.com/?action=news&amp;amp;na=viewfull&amp;amp;news=238 Решение проблем, возникающих при выполнении команд &amp;lt;code&amp;gt;./configure&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;make install&amp;lt;/code&amp;gt;] {{Wayback|url=http://ylsoftware.com/?action=news&amp;amp;na=viewfull&amp;amp;news=238 |date=20070923003611 }}&lt;br /&gt;
* [http://www.citforum.ru/operating_systems/gnumake/index.shtml Эффективное использование GNU Make] {{Wayback|url=http://www.citforum.ru/operating_systems/gnumake/index.shtml |date=20090224190205 }}{{ref-ru}}&lt;br /&gt;
&lt;br /&gt;
{{Системы автоматизации сборки}}&lt;br /&gt;
{{Команды Unix}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Автоматизация сборки]]&lt;br /&gt;
[[Категория:Свободные системы автоматизации сборки]]&lt;br /&gt;
[[Категория:Утилиты Unix]]&lt;br /&gt;
{{Навигационная таблица/Портал/Русская Википедия}}&lt;br /&gt;
[[Категория:Русская Википедия]]&lt;br /&gt;
[[Категория:Википедия]]&lt;br /&gt;
[[Категория:Статья из Википедии]]&lt;br /&gt;
[[Категория:Статья из Русской Википедии]]&lt;/div&gt;</summary>
		<author><name>EducationBot</name></author>
	</entry>
</feed>