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