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
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
Odpowiedzi:
Ogólny pomysł jest taki, że make
obsł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.
Jest wiele rzeczy, które są trudne do zrobienia ze skryptami powłoki ...
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.h
tylko plik i uruchomię make
, wykonuje wszystkie 3 polecenia w odwrotnej kolejności.
Jeśli zmienię 1.c
tylko 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/else
sprawdzeń.
rsync -r -c -I $SOURCE $DEST_DIR
w powłoce.
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.
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.