Make scheint mir einfach ein Shell-Skript mit etwas einfacherem Umgang mit Kommandozeilenargumenten zu sein.
Warum ist es Standard, make anstelle von ./make.sh auszuführen?
Make scheint mir einfach ein Shell-Skript mit etwas einfacherem Umgang mit Kommandozeilenargumenten zu sein.
Warum ist es Standard, make anstelle von ./make.sh auszuführen?
Antworten:
Die allgemeine Idee ist, dass make
(vernünftigerweise) minimale Neuerstellungen unterstützt werden - dh Sie sagen, welche Teile Ihres Programms von welchen anderen Teilen abhängen. Wenn Sie einen Teil des Programms aktualisieren, werden nur die Teile neu erstellt, die davon abhängen. Während Sie dies mit einem Shell-Skript tun könnten , wäre es viel mehr Arbeit (explizites Überprüfen der zuletzt geänderten Daten aller Dateien usw.). Die einzige offensichtliche Alternative mit einem Shell-Skript besteht darin, jedes Mal alles neu zu erstellen. Für kleine Projekte ist dies ein durchaus vernünftiger Ansatz, aber für ein großes Projekt kann ein vollständiger Umbau leicht eine Stunde oder länger dauern - mit make
können Sie das gleiche in ein oder zwei Minuten erreichen ...
Ich sollte wahrscheinlich auch hinzufügen, dass es einige Alternativen gibt, die zumindest weitgehend ähnliche Fähigkeiten aufweisen. Insbesondere in Fällen, in denen nur wenige Dateien in einem großen Projekt neu erstellt werden, sind einige von ihnen (z. B. Ninja ) häufig erheblich schneller als make.
Es gibt verschiedene Dinge, die mit Shell-Skripten schwer zu tun sind ...
Make stellt sicher, dass nur die erforderlichen Dateien neu kompiliert werden, wenn Sie Änderungen an Ihren Quelldateien vornehmen.
Beispielsweise:
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
Wenn ich 2.h
nur die Datei ändere make
und ausführe, werden alle 3 Befehle in umgekehrter Reihenfolge ausgeführt.
Wenn ich 1.c
nur die Datei ändere und ausführe make
, werden nur die ersten beiden Befehle in umgekehrter Reihenfolge ausgeführt.
Der Versuch, dies mit Ihrem eigenen Shell-Skript zu erreichen, erfordert viele if/else
Überprüfungen.
rsync -r -c -I $SOURCE $DEST_DIR
in der Shell.
Darüber hinaus ist Make eine deklarative (-ish) parallele Programmiersprache.
Angenommen, Sie müssen 4.000 Grafikdateien und 4 CPUs konvertieren. Versuchen Sie, ein 10-zeiliges Shell-Skript zu schreiben (ich bin hier großzügig), das dies zuverlässig tut, während Ihre CPUs gesättigt sind.
Vielleicht ist die eigentliche Frage, warum sich die Leute die Mühe machen, Shell-Skripte zu schreiben.
make behandelt Abhängigkeiten: Das Makefile beschreibt sie: Die Binärdatei hängt von Objektdateien ab, jede Objektdatei hängt von einer Quelldatei und Headern ab. Wenn make ausgeführt wird, wird das Datum der Dateien verglichen, um zu bestimmen, was neu kompiliert werden muss .
Man kann direkt ein Ziel aufrufen, um nicht alles zu erstellen, was im Makefile beschrieben ist.
Darüber hinaus bietet die make-Syntax die Substitution vpath
All dies kann in Shell-Skripten geschrieben werden, mit make haben Sie es bereits.