makefile учебник
Начало работы с makefile
Поиск…
замечания
Makefile - это текстовый файл, который контролирует работу программы make
. Программа make
обычно используется для управления созданием программ из их исходных файлов, но ее можно более широко использовать для обработки любого процесса, в котором файлы (или целевые объекты ) необходимо восстановить после того, как другие файлы (или предпосылки ) были изменены. Файл makefile описывает взаимосвязь между целями и предварительными условиями, а также указывает команды, необходимые для обновления цели, когда одно или несколько предварительных условий были изменены. Единственный способ make
«устаревшим» - это сравнить время модификации целевых файлов и их предварительные условия.
Makefiles несколько уникальны несколькими способами, которые могут быть запутаны изначально.
Во-первых, make-файл состоит из двух совершенно разных языков программирования в одном файле. Основная часть файла написано на языке , который make
может понять: это обеспечивает назначение переменного и расширение, некоторые возможности препроцессора (включая другие файлы, условный разбор секций файла и т.д.), а также определение целей и их предпосылки. Кроме того, у каждой цели может быть связанный с ней рецепт, который указывает, какие команды следует вызывать, чтобы заставить эту цель обновляться. Рецепт написан как сценарий оболочки (по умолчанию POSIX sh). Программа make
не анализирует этот скрипт: он запускает оболочку и передает сценарий в оболочку для запуска. Тот факт, что рецепты не анализируются make
, а обрабатывается отдельным процессом оболочки, занимает центральное место в понимании make-файлов.
Во-вторых, make-файл не является процедурным языком, как скрипт: поскольку make
анализирует makefile, он конструирует ориентированный граф внутри, где цели являются узлами графика, а обязательные отношения - это ребра. Только после того, как все Makefiles были полностью разобраны и график завершения будет make
выбор один узел (цель) и попытаться довести его до настоящего времени. Чтобы гарантировать, что цель обновлена, она должна сначала обеспечить, чтобы каждый из предварительных условий этой цели обновлялся и т. Д. Рекурсивно.
Версии
название | Также известен как | Первоначальная версия | Версия | Дата выхода |
---|---|---|---|---|
POSIX сделать | 1992 | Издание IEEE Std 1003.1-2008, 2016 | 2016-09-30 | |
NetBSD | BУбедитесь , | 1988 | 20160926 | 2016-09-26 |
GNU make | gmake | 1988 | 4.2.1 | 2016-06-10 |
SunPro сделать | dmake | 2006 | 2015-07-13 | |
MSVS nmake | 2003 | 2015p3 | 2016-06-27 |
Основной Makefile
Подумайте о написании «привет мир!». программа в c. Допустим, наш исходный код находится в файле source.c, теперь, чтобы запустить нашу программу, нам нужно ее скомпилировать, как правило, на Linux (с использованием gcc) нам нужно будет ввести $> gcc source.c -o output
где вывод это имя исполняемого файла. Для базовой программы это работает хорошо, но по мере того, как программы становятся более сложными, наша команда компиляции также может усложняться. Здесь появляется Makefile , make- файлы позволяют нам выписывать довольно сложный набор правил для того, как скомпилировать программу, а затем просто скомпилировать ее, набрав make в командной строке. Например, вот пример Makefile для примера hello wold выше.
Основной Makefile
Давайте сделаем базовый Makefile и сохраним его в нашей системе в том же каталоге, что и наш исходный код с именем Makefile . Обратите внимание, что этот файл должен быть назван Makefile, однако Capitol M является необязательным. Тем не менее, относительно условно использовать капитолий М.
output: source.c
gcc source.c -o output
Обратите внимание, что перед командой gcc на второй строке есть ровно одна вкладка (это важно в make-файлах). Как только этот Makefile будет написан каждый раз, когда пользовательские типы make (в том же каталоге, что и Makefile) make, проверит, изменил ли source.c (проверяет метку времени), если он был изменен совсем недавно, чем вывод, который он будет запускать правило компиляции в следующей строке.
Переменные в Make-файлах
В зависимости от проекта вы можете ввести некоторые переменные в ваш файл make. Вот пример Makefile с присутствующими переменными.
CFLAGS = -g -Wall
output: source.c
gcc $< $(CFLAGS) -o $@
Теперь рассмотрим, что здесь произошло. В первой строке мы объявили переменную с именем CFLAGS, которая содержит несколько общих флагов, которые вы, возможно, захотите передать компилятору, обратите внимание, что вы можете хранить столько флагов, сколько хотите в этой переменной. Затем мы имеем ту же строку, что и перед тем, как сообщать make, чтобы проверить source.c, чтобы увидеть, было ли это изменено совсем недавно, чем вывод, если это так, что оно запускает правило компиляции. Правило нашей компиляции в основном такое же, как и раньше, но оно было сокращено с помощью переменных, переменная $<
встроена в make (называемая автоматической переменной, см. Https://www.gnu.org/software/make/manual/ html_node / Automatic-Variables.html ), и это всегда означает источник, поэтому в данном случае source.c . $(CFLAGS)
- это наша переменная, которую мы определили ранее, но обратите внимание, что нам пришлось поставить переменную в круглую скобку с $ front, как этот $(someVariable)
. Это синтаксис для указания Make, чтобы расширить переменную до того, что вы набрали ранее. Наконец, мы имеем символ $ @, еще раз это переменная, встроенная в make, и она просто обозначает цель этапа компиляции, поэтому в этом случае это означает вывод .
чистый
Очистить это еще одна полезная концепция, чтобы узнать о файлах. Позволяет модифицировать Makefile сверху
CFLAGS = -g -Wall
TARGETS = output
output: source.c
gcc $< $(CFLAGS) -o $@
clean:
rm $(TARGETS)
Как вы можете видеть, мы просто добавили еще одно правило в наш Makefile и одну дополнительную переменную, которая содержит все наши цели. Это довольно распространенное правило в make-файлах, поскольку оно позволяет быстро удалить все созданные вами двоичные файлы, просто набрав $> make clean
. Набрав make clean, вы сообщите программе make о запуске чистого правила, а затем make запустит команду rm, чтобы удалить все ваши цели.
Я надеюсь, что этот краткий обзор использования make поможет вам ускорить ваш рабочий процесс, Makefiles может стать очень сложным, но с этими идеями вы сможете начать использовать make и лучше понять, что происходит в других программистах Makefiles . Для получения дополнительной информации об использовании сделать отличный ресурс https://www.gnu.org/software/make/manual/ .
Определение правил
Быстрый старт
Правило описывает, когда и как создаются определенные файлы ( цели правил). Он также может служить для обновления целевого файла, если любой из файлов, необходимых для его создания ( предварительные требования к цели), новее, чем цель.
Правила следуют синтаксису ниже: (Обратите внимание, что команды, следующие за правилом, отступаются от вкладки )
targets: prerequisites
<commands>
где цели и предварительные условия - это имена файлов или специальные зарезервированные имена и команды (если они есть), выполняются оболочкой для создания / перестройки целей , устаревших.
Чтобы выполнить правило, можно просто запустить команду make
в терминале из того же каталога, где находится Makefile . Запуск make
без указания цели, выполнит первое правило, определенное в Makefile . По соглашению первое правило в Makefile часто называется всем или по умолчанию , обычно перечисляя все допустимые цели сборки в качестве предварительных условий.
make
выполняет только правило, если цель устарела, то есть либо она не существует, либо время ее модификации старше любого из ее предварительных условий. Если список предварительных условий пуст, правило будет выполняться только при первом вызове для создания целей. Однако, когда правило не создает файл, а цель - фиктивная переменная, правило всегда будет выполняться.
Правила шаблонов
Правила шаблонов используются для указания нескольких целей и создания имен требуемых имен из целевых имен. Они более общие и более мощные по сравнению с обычными правилами, поскольку каждая цель может иметь свои собственные предпосылки. В правилах шаблонов связь между целью и предварительным условием строится на основе префиксов, включая имена и суффиксы путей, или и то, и другое.
Представьте, что мы хотим создать цели foo.o
и bar.o
, скомпилировав C-скрипты, foo.c
и bar.c
, соответственно. Это можно сделать, используя обычные правила:
foo.o: foo.c
cc -c $< -o $@
bar.o: bar.c
cc -c $< -o $@
где автоматическая переменная $<
- это имя первого предпосылки и $@
имя цели (полный список автоматических переменных можно найти здесь ).
Однако, поскольку цели имеют один и тот же суффикс, приведенные выше два правила теперь могут быть заменены следующим шаблоном:
%.o: %.c
cc -c $< -o $@
Неявные правила
Неявные правила говорят о make
как использовать обычные методы для создания определенных типов целевых файлов, которые используются очень часто. make
использует имя целевого файла, чтобы определить, какое неявное правило вызывается.
Пример правила шаблона, который мы видели в предыдущем разделе, на самом деле не должен быть объявлен в Makefile, поскольку make
имеет неявное правило для компиляции C. Таким образом, в следующем правиле предварительные условия foo.o
и bar.o
будут построены с использованием неявного правила для компиляции C, прежде чем строить foo
.
foo : foo.o bar.o
cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
Каталог неявных правил и используемых им переменных можно найти здесь .
Общее правило для gzip файла
если каталог содержит 2 файла:
$ ls
makefile
example.txt
и makefile
содержат следующий текст
%.gz: %
gzip $<
то вы можете получить example.txt.gz
, введя в оболочку
$ make -f makefile example.txt.gz
Makefile , состоит только из одного правила , которое инструктирует сделать , как создать файл, имя которого оканчивается .gz , если есть файл с таким же именем , но .gz суффиксом.
makefile Hello World
C: \ Makefile:
helloWorld :
[TAB]echo hello world
результаты:
C:\>make
echo hello world
hello world
Примечание: [TAB] следует заменить фактической вкладкой, stackoverflow заменяет вкладки пробелами, а пробелы не используются так же, как вкладки в make-файле.