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

129

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

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

HoboBen
источник
на обратный вопрос: зачем использовать сценарий оболочки вместо make (из-за очевидной более простой обработки аргументов командной строки), особенно для задач системного администратора, читайте здесь: unix.stackexchange.com/a/497601/1170
lesmana

Ответы:

126

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

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

Джерри Гроб
источник
67

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

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

  • Конечно, он проверяет, что устарело, чтобы построить только то, что ему нужно.
  • Он выполняет топологическую сортировку или какой-либо другой вид анализа дерева, который определяет, что зависит от чего и в каком порядке нужно строить устаревшие вещи, так что каждое предварительное условие создается перед каждой зависимостью и создается только один раз.
  • Это язык декларативного программирования . Новые элементы можно добавлять без необходимости их объединения в обязательный поток управления.
  • Он содержит механизм вывода для обработки правил, шаблонов и дат, и это в сочетании с правилами в вашем конкретном Makefile превращает make в экспертную систему .
  • Имеет макропроцессор.
  • См. Также: более раннее описание make .
DigitalRoss
источник
2
Однако как экспертная система она довольно ограничена. Например, каждый вывод может использовать одно и то же правило только один раз.
Reinierpost
1
Чтобы уточнить пункт 2) в терминах непрофессиональной инженерии, сценарий оболочки обеспечивает линейный порядок, тогда как make-файл имеет древовидный вид. Он удаляет ненужные хронологические зависимости (хотя на практике процесс make будет выполняться линейно).
Шридхар Сарнобат
2
... Я думаю, что проблема с Makefiles поверх сценариев оболочки аналогична проблеме с CSS над javascript. Не так очевидно, в каком хронологическом порядке выполняется каждый узел. Хотя, по крайней мере, с Makefile вы все равно можете увидеть фактическую команду оболочки. С помощью CSS даже это абстрагируется.
Шридхар Сарнобат
У меня есть несколько комментариев, которые я ценю, если кто-то их прояснит. 1 / разве ваш первый и два пункта не связаны в том смысле, что эта топологическая сортировка заключается в том, как осуществляется инкрементная сборка? 2 / разве вы не можете указать номер 3, также реализованный с использованием композиции функций. 3 / Я хотел бы больше узнать о преимуществах 4 и 5 для конечного пользователя MakeFile, а также о том, почему эти преимущества не могут быть реализованы путем объединения команд оболочки
Амин Хаджюссеф
Я впервые сталкиваюсь с Make, описанным как экспертная система. Как человек, создавший экспертные системы, я бы не подумал об этом. Очевидно, что Make имеет механизм логического вывода, позволяющий сделать вывод о том, как построить вашу программу с помощью декларативных правил, указанных в make-файле, но менее очевидно, что это система, основанная на знаниях, поскольку (конечные) правила - это команды оболочки, которые должны выполняться, а не факты. И термин «экспертная система» используется для обозначения системы, которая успешно использовала опыт эксперта мирового класса, что не так. Жюри все еще не в порядке.
Деннис
9

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 команды в обратном порядке.

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

Крис Додд
источник
или используйте что-то подобное rsync -r -c -I $SOURCE $DEST_DIRв оболочке.
Spartacus9
9

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

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

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

bobbogo
источник
1
Да, вы ослабляете общий линейный порядок до более древовидного.
Шридхар Сарнобат
4

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

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

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

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

philant
источник