Make мне кажется просто оболочкой script с немного более простой обработкой аргументов командной строки.
Почему стандартно запускать make вместо./make.sh
Make мне кажется просто оболочкой script с немного более простой обработкой аргументов командной строки.
Почему стандартно запускать make вместо./make.sh
Общая идея заключается в том, что make
поддерживает (разумно) минимальные перестройки - то есть вы рассказываете, какие части вашей программы зависят от других частей. Когда вы обновляете часть программы, она восстанавливает только те части, которые зависят от этого. Хотя вы могли бы сделать это с помощью оболочки script, было бы намного больше работать (явно проверяя даты последнего изменения во всех файлах и т.д.). Единственной очевидной альтернативой с оболочкой script является перестройка всего время. Для крошечных проектов это вполне разумный подход, но для большого проекта полная перестройка может легко пройти час или больше - используя make
, вы можете легко выполнить одно и то же через минуту или две...
Есть разные вещи, которые трудно сделать с помощью сценариев оболочки...
Как и выше, Make - это декларативный (-иш) параллельный язык программирования.
Скажем, у вас есть 4000 графических файлов для конвертирования и 4 процессора. Попробуйте написать 10-строчную оболочку script (я щедрую здесь), которая сделает это надежно, насыщая ваши процессоры.
Возможно, реальный вопрос заключается в том, почему люди пишут сценарии оболочки.
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
.
make зависимости от дескрипторов: make файл описывает их: двоичный файл зависит от объектных файлов, каждый объектный файл зависит от исходного файла и заголовков... когда make запущен, дата файлов сравнивается, чтобы определить, что должно быть перекомпилировано.
Можно вызвать непосредственно одну цель, чтобы не создавать все, что описано в Makefile.
Кроме того, синтаксис make обеспечивает подстановку, vpath
Все это может быть написано в сценариях оболочки, и вы уже имеете его.