Является ли make-файл тем же, что и командный файл? - PullRequest
14 голосов
/ 16 ноября 2009

Я знаю все о пакетных файлах и создавал их раньше, но мне неясно, что такое make-файл. Это похоже на командный файл. В чем сходства и различия?

Ответы [ 7 ]

14 голосов
/ 16 ноября 2009

Аналогично, да, за исключением зависимостей, топологической сортировки, обработки макросов и экспертной системы

Если вы ничего не делаете, но помещаете команды оболочки в Makefile , тогда он фактически очень похож на каталог "пакетных файлов" и выполняет каждую из них, когда ассоциируется с именем target * Указано 1006 *.

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

И для полноты я должен добавить, что make также является макропроцессором. Он ориентирован на системы сборки программного обеспечения, поэтому он предоставляет дескрипторы символических элементов в своей проблемной области, таких как имена источников и целей.

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

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


1. Это простая в использовании экспертная система. Skynet, вероятно, не выйдет из случайной опечатки в сложном Makefile.
13 голосов
/ 16 ноября 2009

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

Пакетный файл представляет собой последовательность команд и операторов управления.

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

7 голосов
/ 16 ноября 2009

Чтобы сделать на нем довольно абстрактное вращение:

  • Пакетные файлы написаны на императивном языке.
  • Make-файлы написаны на декларативном языке для обработки файлов (который предназначен и обычно используется для контроля сборки).
6 голосов
/ 16 ноября 2009

Makefiles перечисляет команды, которые выполняются, но они структурированы иначе, чем список последовательных команд. Вместо этого у них есть цели и команды для их создания. make затем проверяет перечисленные зависимости и видит, какие цели нужно обновить, чтобы выполнить то, что вы сказали. Существует много неявных правил (учитывая, что файл * .c make уже знает, как скомпилировать его в * .o и даже создать исполняемый файл!) И стандартные переменные (например, CFLAGS), поэтому вы можете использовать это в своих интересах. И, в отличие от справочной страницы, вы можете использовать эти неявные правила без Makefile.

Самый простой способ подумать об этом - это то, что make-файл говорит как сделать 'A' с учетом 'B', а затем вы говорите make что вы хотите сделать ( например make all), а не как это сделать. Он вычисляет отдельные шаги.

4 голосов
/ 16 ноября 2009

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

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

  1. всякий раз, когда вы видите файл с расширением .c, запускайте на нем программу "gcc", чтобы скомпилировать его в объектный файл ".o".
  2. всякий раз, когда у вас есть куча ".o", связывайте их в ".exe".

Конечно, это упрощенное описание.

Основное преимущество использования make («интерпретатора» для языка makefile) состоит в том, что вы получаете синтаксис, специально разработанный для такого рода вещей. Например, make обычно заботится о таких вещах, как проверка, изменился ли файл, чтобы вы не компилировали файл, в котором нет никаких изменений.

3 голосов
/ 16 ноября 2009

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

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

Два разных подхода к выполнению двух разных вещей.

1 голос
/ 16 ноября 2009

Makefiles - это данные для программы Make. Думайте о них как о том, что делали старые парни до того, как у них был XML :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...