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 cdaus 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_dirdas Makefiledort mit dem Ziel "all" ändern und ausführen . Verwenden Sie als bewährte Methode, $(MAKE)anstatt makedirekt 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.
makewollte ich das Verzeichnis nie so ändern. Vielleicht sollten Sie einen anderen Ansatz für Ihre Lösung ausprobieren?