Навіщо використовувати сценарій make over shell?


129

Зробити мені здається просто скриптом оболонки з трохи простішим керуванням аргументами командного рядка.

Чому стандартно запускати make замість ./make.sh


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

Відповіді:


126

Загальна ідея полягає в тому, що makeпідтримується (розумно) мінімальна перебудова, тобто ви кажете йому, які частини вашої програми залежать від інших частин. Коли ви оновлюєте частину програми, вона лише відновлює ті частини, які залежать від цього. Хоча ви могли це зробити зі скриптом оболонки, було б набагато більше роботи (явно перевіряючи останні змінити дати на всіх файлах тощо). Єдиною очевидною альтернативою сценарію оболонки є щоразу відновлювати все. Для крихітних проектів це цілком розумний підхід, але для великого проекту повна перебудова може зайняти годину або більше - використовуючи make, ви можете легко виконати те саме за хвилину-дві ...

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


67

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

Існують різні речі, які важко зробити із скриптами оболонки ...

  • Звичайно, він перевіряє, чи не застаріло, щоб будувати лише те, що потрібно для побудови
  • Він виконує топологічний сортування або якийсь інший аналіз дерева, який визначає, що залежить від того, що і в якому порядку будувати застарілі речі, такі, що кожна передумова будується перед кожною залежністю, і будується лише один раз.
  • Це мова декларативного програмування . Нові елементи можна додавати, не потребуючи об'єднання їх у необхідний керуючий потік.
  • Він містить механізм виводу для обробки правил, шаблонів та дат, і це, у поєднанні з правилами у вашому конкретному Makefile, - це те, що перетворюється на експертну систему .
  • У ньому є макропроцесор.
  • Дивіться також: попередній підсумок виготовлення .

2
Він досить обмежений як експертна система. Наприклад, кожен висновок може використовувати одне і те ж правило лише один раз.
reinierpost

1
Просто для детальної розробки точки 2) в більш інженерному плані, скрипт оболонки виконує лінійне впорядкування, тоді як makefile є деревоподібним. Це усуває непотрібні хронологічні залежності (хоча на практиці процес make виконуватиметься лінійно).
Шрідхар Сарнобат

2
... Я думаю, що проблема з Makefiles над скриптами оболонки аналогічна проблемі з CSS через JavaScript. Це не так очевидно, в якому хронологічному порядку виконується кожен вузол. Хоча принаймні за допомогою Makefiles ви все ще можете побачити фактичну команду оболонки. З CSS навіть це абстрагується.
Шрідхар Сарнобат

У мене є кілька коментарів, які я ціную, якщо хтось їх уточнить. 1 / не пов’язані ваш перший і два пункти, в тому сенсі, що цей топологічний сорт - це те, як наростає нарощення? 2 / чи не можна вказати номер 3, реалізований також за допомогою функції функції. 3 / Хотілося б дізнатися більше про переваги 4 та 5 для кінцевого користувача MakeFile, і чому ці переваги неможливо реалізувати, склавши команди оболонок разом
Amine Hajyoussef

Це перший раз, коли я натрапив на Make, описаний як Експертна система. Як хтось, хто будує експертні системи, я б не вважав це. У Make очевидно є механізм виводу, щоб вивести, як скласти свою програму за допомогою декларативних правил, зазначених у makefile, але менш очевидно, що це система, заснована на знаннях, оскільки (leaf) правила - це командні оболонки, а не факти. Термін "експертна система" використовується для позначення системи, яка успішно захопила досвід експертів світового класу, що не так. Журі все ще не для мене.
Денніс

9

Переконайтесь, що під час внесення змін у вихідні файли перекомпілюються лише необхідні файли.

Наприклад:

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в оболонці.
Спартак9

9

Як і вище сказане, Make є декларативною (-іш) паралельною мовою програмування.

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

Можливо, справжнє питання полягає в тому, чому люди турбують написання скриптів оболонок.


1
Так, ви розширюєте загальне лінійне впорядкування на впорядкування, що більше нагадує дерево.
Шрідхар Сарнобат

4

зробити залежність ручок: makefile описує їх: двійковий файл залежить від об'єктних файлів, кожен об’єктний файл залежить від вихідного файлу та заголовків ... при запуску make порівнюється дата файлів для визначення того, що потрібно повторно компілювати .

Можна звернутися безпосередньо до однієї цілі, щоб не будувати все, що описано в Makefile.

Більше того, синтаксис make забезпечує заміну, vpath

Все це можна записати в сценарії оболонки, змусити вас це вже мати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.