Wie kann ich Fehler und Interrupts in GNU make einfangen?

8

Ich frage mich, ob es eine Möglichkeit gibt, trap in GNU make zu implementieren, ähnlich wie in BASH ?

Wenn der Benutzer CTRL-C drückt oder wenn make selbst fehlschlägt (Nicht-Null-Exit), möchte ich ein bestimmtes Ziel oder Makro aufrufen.

    
Cyrus 10.06.2009, 07:06
quelle

6 Antworten

2

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:

  1. Erstellen Sie das folgende Makefile :

    %Vor%
  2. Öffnen Sie es in vim und führen Sie :make ,

  3. aus
  4. Während Sie schlafen, drücken Sie Strg - C

Vim / make druckt

%Vor%

Make wurde ein Interrupt-Signal gesendet, aber foo existiert noch.

    
andrewdotn 22.07.2009, 14:54
quelle
5

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:

  • Clear Trap Handler (mit -)
  • mache die Säuberung
  • Beenden Sie mit einem Nicht-Null-Exit-Status, damit Build-Automatisierungstools den fehlgeschlagenen Build melden.

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.

    
kevinf 25.09.2015 18:33
quelle
3

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.)

    
Jesse Glick 02.09.2016 21:15
quelle
2

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.

    
PSpiller 13.04.2010 18:32
quelle
1

Nein. Soweit ich weiß, gibt es keine solche Funktionalität.

    
JesperE 10.06.2009 07:31
quelle
1

make erzeugt Rückgabecodes. Soweit ich mich im Moment erinnern kann, gibt es 0 für Erfolg, 2 für Fehler (bitte überprüfen Sie die Dokumentation). Wäre es also genug für Sie, make zum Beispiel in ein Shell-Skript einzubinden?

    
jbatista 10.06.2009 07:38
quelle