Зачем использовать make поверх сценария оболочки? - PullRequest
95 голосов
/ 26 сентября 2010

Make мне кажется просто сценарием оболочки с немного более легкой обработкой аргументов командной строки.

Почему стандартно запускать make вместо ./make.sh

Ответы [ 5 ]

105 голосов
/ 26 сентября 2010

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

56 голосов
/ 26 сентября 2010

Make - это экспертная система

Существуют различные вещи, которые трудно сделать со скриптами оболочки ...

  • Конечно, он проверяет, что устарело, чтобы построить только то, что нужно для сборки
  • Он выполняет топологическую сортировку или какой-либо другой вид анализа дерева, который определяет, что зависит от того, что и в каком порядке строить устаревшие такие вещи, что каждое предварительное условие создается перед каждой зависимостью и создается только один раз.
  • Это язык для декларативного программирования . Новые элементы могут быть добавлены без необходимости объединения их в поток обязательного управления.
  • Он содержит механизм логического вывода для обработки правил, шаблонов и дат, и это то, что в сочетании с правилами в вашем конкретном Makefile - вот что превращения превращаются в экспертную систему .
  • Имеет макропроцессор.
  • См. Также: более ранняя сводка по марке .
7 голосов
/ 01 октября 2010

Как и выше, Make является декларативным (-ish) языком параллельного программирования.

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

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

7 голосов
/ 26 сентября 2010

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

Например:

final : 1.o 2.o
    gcc -o final 1.o 2.o

1.o : 1.c 2.h
    gcc -c 1.c

2.o : 2.c 2.h
    gcc -c 2.c

Если я изменяю файл 2.h only & run make, он выполняет все 3 команды в обратном порядке.

Если я изменяю файл 1.c only & run make, он выполняет только первые две команды в обратном порядке.

Попытка добиться этого с помощью собственного сценария оболочки потребует много if/else проверки.

3 голосов
/ 26 сентября 2010

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

Можно напрямую вызывать одну цель, чтобы не создавать все, что описано в Makefile.

Кроме того, синтаксис make обеспечивает подстановку, vpath

Все это может быть написано в сценариях оболочки, с тем, что у вас уже есть.

...