Po co używać make over a shell script?

129

Make wydaje mi się po prostu skryptem powłoki z nieco łatwiejszą obsługą argumentów wiersza poleceń.

Dlaczego standardowo uruchamia się make zamiast ./make.sh

HoboBen
źródło
odwrotne pytanie: po co używać skryptu powłoki zamiast make (ze względu na pozornie łatwiejszą obsługę argumentów wiersza poleceń), szczególnie w przypadku zadań administratora systemu, przeczytaj tutaj: unix.stackexchange.com/a/497601/1170
lesmana

Odpowiedzi:

126

Ogólny pomysł jest taki, że makeobsługuje (rozsądnie) minimalne przebudowy - tj. Mówisz mu, które części programu zależą od innych części. Kiedy aktualizujesz jakąś część programu, odbudowuje on tylko te części, które od tego zależą. Chociaż można by to zrobić za pomocą skryptu powłoki, wymagałoby to znacznie więcej pracy (jawne sprawdzenie dat ostatniej modyfikacji we wszystkich plikach itp.). Jedyną oczywistą alternatywą dla skryptu powłoki jest przebudowa wszystkiego za każdym razem. W przypadku małych projektów jest to całkowicie rozsądne podejście, ale w przypadku dużego projektu całkowita przebudowa może z łatwością zająć godzinę lub więcej - używając make, możesz łatwo osiągnąć to samo w minutę lub dwie ...

Powinienem też chyba dodać, że jest sporo alternatyw, które mają co najmniej ogólnie podobne możliwości. Zwłaszcza w przypadkach, gdy odbudowywanych jest tylko kilka plików w dużym projekcie, niektóre z nich (np. Ninja ) są często znacznie szybsze niż make.

Jerry Coffin
źródło
67

Marka to system ekspercki

Jest wiele rzeczy, które są trudne do zrobienia ze skryptami powłoki ...

  • Oczywiście sprawdza, co jest nieaktualne, aby zbudować tylko to, czego potrzebuje
  • Wykonuje sortowanie topologiczne lub inny rodzaj analizy drzewa, która określa, co zależy od tego, od czego iw jakiej kolejności budować nieaktualne rzeczy, tak że każdy warunek wstępny jest budowany przed każdą zależnością i tylko raz.
  • To język do programowania deklaratywnego . Nowe elementy można dodawać bez konieczności łączenia ich w niezbędny przepływ sterowania.
  • Zawiera mechanizm wnioskowania do przetwarzania reguł, wzorców i dat, a to, w połączeniu z regułami w twoim konkretnym pliku Makefile, zamienia make w system ekspercki .
  • Posiada procesor makr.
  • Zobacz także: wcześniejsze podsumowanie marki .
DigitalRoss
źródło
2
Jednak jako system ekspercki jest dość ograniczony. Np. Każde wnioskowanie może używać tej samej reguły tylko raz.
reinierpost
1
Aby rozwinąć punkt 2) w bardziej laickich terminach inżynierskich, skrypt powłoki wymusza uporządkowanie liniowe, podczas gdy plik makefile jest podobny do drzewa. Usuwa niepotrzebne zależności chronologiczne (choć w praktyce proces tworzenia byłby wykonywany liniowo).
Sridhar Sarnobat
2
... Myślę, że problem z plikami Makefiles zamiast skryptów powłoki jest analogiczny do problemu z CSS w porównaniu z javascriptem. Nie jest tak oczywiste, w jakim porządku chronologicznym każdy węzeł jest wykonywany. Chociaż przynajmniej w przypadku plików Makefiles nadal można zobaczyć rzeczywistą komendę powłoki. Dzięki CSS nawet to jest oderwane.
Sridhar Sarnobat
Mam kilka komentarzy, które doceniam, jeśli ktoś je wyjaśni. 1 / czy twój pierwszy i dwa punkty nie są ze sobą powiązane, w tym sensie, że to sortowanie topologiczne polega na implementacji budowania przyrostowego? 2 / Czy nie możesz wskazać nr 3 zaimplementowanego również przy użyciu kompozycji funkcji. 3 / Chciałbym dowiedzieć się więcej o zaletach 4 i 5 dla końcowego użytkownika MakeFile i dlaczego tych zalet nie można zaimplementować poprzez wspólne komponowanie poleceń powłoki
Amine Hajyoussef
Po raz pierwszy zetknąłem się z Make opisanym jako system ekspercki. Jako ktoś, kto buduje systemy eksperckie, nie rozważałbym tego. Make oczywiście ma mechanizm wnioskowania, który pozwala wywnioskować, jak zbudować program za pomocą zasad deklaratywnych określonych w pliku makefile, ale mniej oczywiste jest, że jest to system oparty na wiedzy, ponieważ reguły (liści) są poleceniami powłoki, a nie faktami. Termin „system ekspercki” jest używany w odniesieniu do systemu, który z powodzeniem wykorzystał doświadczenie światowej klasy eksperta, co nie ma miejsca. Jury wciąż mnie nie interesuje.
Dennis,
9

Make zapewnia, że ​​tylko wymagane pliki zostaną ponownie skompilowane podczas wprowadzania zmian w plikach źródłowych.

Na przykład:

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

Jeśli zmienię 2.htylko plik i uruchomię make, wykonuje wszystkie 3 polecenia w odwrotnej kolejności.

Jeśli zmienię 1.ctylko plik i uruchomię make, wykonuje tylko pierwsze 2 polecenia w odwrotnej kolejności.

Próba osiągnięcia tego za pomocą własnego skryptu powłoki będzie wymagała wielu if/elsesprawdzeń.

Chris Dodd
źródło
lub użyj czegoś takiego rsync -r -c -I $SOURCE $DEST_DIRw powłoce.
Spartacus 9
9

Oprócz powyższego, Make jest deklaratywnym (-ish) językiem programowania równoległego.

Powiedzmy, że masz 4000 plików graficznych do konwersji i 4 procesory. Spróbuj napisać 10-liniowy skrypt powłoki (jestem tutaj hojny), który zrobi to niezawodnie podczas nasycania procesorów.

Być może prawdziwe pytanie brzmi: dlaczego ludzie zawracają sobie głowę pisaniem skryptów powłoki.

bobbogo
źródło
1
Tak, rozluźniasz całkowite uporządkowanie liniowe w bardziej drzewiaste uporządkowanie.
Sridhar Sarnobat
4

tworzyć zależności uchwytów: plik makefile opisuje je: plik binarny zależy od plików obiektowych, każdy plik obiektowy zależy od pliku źródłowego i nagłówków ... po uruchomieniu make, data plików jest porównywana w celu określenia, co należy ponownie skompilować .

Można bezpośrednio wywołać jeden cel, aby nie budować wszystkiego, co opisano w pliku Makefile.

Ponadto składnia make zapewnia podstawianie, vpath

Wszystko to można napisać w skryptach powłoki, dzięki czemu już to masz.

filant
źródło