Зачем использовать make поверх оболочки script?

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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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 и запускаю make, он выполняет все 3 команды в обратном порядке.

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

Попытка выполнить это с вашей собственной оболочкой script будет включать в себя множество проверок if/else.

Ответ 5

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

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

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

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