Nein. Die Signalverarbeitung von GNU make lässt schon einiges zu wünschen übrig. Von seinem Signalhandler aus ruft er Funktionen wie printf
auf, von denen nicht sicher aus einem Signalhandler aufgerufen werden kann. Ich habe diese Ursache Probleme gesehen, zum Beispiel .DELETE_ON_ERROR
Regeln werden nicht immer ausgeführt, wenn stderr
zu stdout
umgeleitet wird.
Zum Beispiel in einer CentOS 7.4-Box:
Erstellen Sie das folgende Makefile
:
Öffnen Sie es in vim
und führen Sie :make
,
Vim / make druckt
%Vor% Make wurde ein Interrupt-Signal gesendet, aber foo
existiert noch.
Zu diesem Zeitpunkt hat GNU make keine native Unterstützung.
Es gibt jedoch einen zuverlässigen Workaround:
%Vor%Dies fängt Unterbrechungen, Beendigungen UND alle Nicht-Null-Beendigungscodes ein.
Beachten Sie die $(MAKE)
, so dass Cmdline-Überschreibungen und make-Optionen an Submake übergeben werden.
Auf Falle:
DELETE_ON_ERROR funktioniert NICHT für Verzeichnisse, also ist dies der Schlüssel zum Aufräumen nach mktemp -d
, zum Beispiel
Ersetze <DO CLEANUP HERE>
durch gültiges CMD.
Eine vereinfachte Version von @ Kevinfs Antwort, die für grundlegende Fälle gut genug erscheint:
%Vor% (Dieses Beispiel hat einen Grund: docker-compose up
sagt
Wann Der Befehl wird beendet, alle Container werden gestoppt.
aber es ist nicht rm
die gestoppten Container wie docker run --rm
, so dass Sie sie immer noch mit docker ps -a
sehen können.)
Make unterstützt es nicht, aber mit BASH-Tricks können Sie etwas Ähnliches erreichen.
%Vor%Das "unmount" wird ausgeführt, nachdem "make" abgeschlossen wurde. Dies ist normalerweise eine befriedigende Lösung, wenn Sie versuchen, Vorgänge zu bereinigen, die während des Builds auftreten können, die aber beim Beenden von "make" nicht ordnungsgemäß bereinigt werden.