Es führt den Befehl tatsächlich aus und ändert das Verzeichnis in some_directory
. Dies wird jedoch in einer Unterprozess-Shell ausgeführt und wirkt sich weder auf make noch auf die Shell aus, von der aus Sie arbeiten.
Wenn Sie mehr Aufgaben ausführen möchten some_directory
, müssen Sie ein Semikolon hinzufügen und auch die anderen Befehle anhängen. Beachten Sie, dass Sie keine Zeilenumbrüche verwenden können, da diese von make als Ende der Regel interpretiert werden. Daher müssen alle Zeilenumbrüche, die Sie aus Gründen der Übersichtlichkeit verwenden, durch einen Backslash maskiert werden.
Zum Beispiel:
all:
cd some_dir; echo "I'm in some_dir"; \
gcc -Wall -o myTest myTest.c
Beachten Sie auch, dass das Semikolon zwischen jedem Befehl erforderlich ist, obwohl Sie einen Backslash und eine Newline hinzufügen. Dies liegt an der Tatsache, dass die gesamte Zeichenfolge von der Shell als einzelne Zeile analysiert wird. Wie in den Kommentaren erwähnt, sollten Sie '&&' verwenden, um Befehle zu verbinden. Dies bedeutet, dass sie nur ausgeführt werden, wenn der vorhergehende Befehl erfolgreich war.
all:
cd some_dir && echo "I'm in some_dir" && \
gcc -Wall -o myTest myTest.c
Dies ist besonders wichtig, wenn Sie zerstörerische Arbeiten ausführen, z. B. Aufräumen, da Sie sonst das falsche Material zerstören, falls dies cd
aus irgendeinem Grund fehlschlägt.
Eine häufige Verwendung ist jedoch das Aufrufen von make im Unterverzeichnis, in das Sie möglicherweise schauen möchten. Hierfür gibt es eine Befehlszeilenoption, sodass Sie sich nicht selbst anrufen müssen cd
, sodass Ihre Regel so aussehen würde
all:
$(MAKE) -C some_dir all
das wird sich in some_dir
das Makefile
dort mit dem Ziel "all" ändern und ausführen . Verwenden Sie als bewährte Methode, $(MAKE)
anstatt make
direkt aufzurufen , da Sie die richtige make-Instanz aufrufen müssen (wenn Sie beispielsweise eine spezielle make-Version für Ihre Build-Umgebung verwenden) und beim Ausführen ein etwas anderes Verhalten bereitstellen mit bestimmten Schaltern, wie z -t
.
Machen Sie für den Datensatz immer den Befehl, den er ausführt (sofern er nicht ausdrücklich unterdrückt wird), auch wenn er keine Ausgabe hat, was Sie sehen.
make
wollte ich das Verzeichnis nie so ändern. Vielleicht sollten Sie einen anderen Ansatz für Ihre Lösung ausprobieren?