Frage

Ich habe ein Makefile, das mit dem Ausführen eines Tools vor dem Anwenden der Build -Regeln (das dieses Tool für mich schreibt) ausführt. Wenn dieses Tool, das ein Python-Skript ist, mit einem Nicht-Null-Statuscode ausgeht, möchte ich, dass GNU genau dort anhalten und nicht mit dem Erstellen des Programms fortgesetzt wird.

Derzeit mache ich so etwas (oberes Level, dh Spalte 1):

$(info Generating build rules...)
$(shell python collect_sources.py)
include BuildRules.mk

Aber das hört nicht auf, wenn collect_sources.py Beendet mit einem Statuscode von 1. Dies erfasst auch die Standardausgabe von collect_sources.py Drucken Sie es aber nicht aus, also habe ich das Gefühl, dass ich in die falsche Richtung schaue.

Wenn möglich, sollte die Lösung sogar funktionieren, wenn eine einfache MS-DOS-Schale die Standard-Systemhülle ist.

Irgendein Vorschlag?

War es hilfreich?

Lösung 2

OK, hier ist meine eigene Lösung, die leider nicht auf dem Statuscode des Skripts collect_sources.py basiert, aber für mich (TM) funktioniert, und lässt mich jede Ausgabe sehen, die das Skript erzeugt:

SHELL_OUTPUT := $(shell python collect_sources.py 2>&1)
ifeq ($(filter error: [Errno %],$(SHELL_OUTPUT)),)
  $(info $(SHELL_OUTPUT))
else
  $(error $(SHELL_OUTPUT))
endif

Das Skript ist so geschrieben, dass jeder Fehler eine Ausgabe erzeugt "collect_sources: error:". Wenn Python das angegebene Skript nicht finden oder ausführen kann, gibt es außerdem eine Fehlermeldung aus, die die Nachricht enthält "[Errno 2]" oder ähnliches. Dieses kleine Code erfasst also nur die Ausgabe (umleiten Stderr zu STDOut) und sucht nach Fehlermeldungen. Wenn keiner gefunden wird, verwendet es einfach einfach $(info) Um die Ausgabe zu drucken, verwendet es ansonsten $(error), was effektiv zum Stoppen macht.

Beachten Sie, dass die Eindrücke in der ifeq ... endif wird mit Räumen gemacht. Wenn Registerkarten verwendet werden, denken Sie, dass Sie versuchen, einen Befehl aufzurufen, und beschweren sich darüber.

Andere Tipps

Es mag einen besseren Weg geben, aber ich habe Folgendes ausprobiert und es funktioniert:

$(if $(shell if your_command; then echo ok; fi), , $(error your_command failed))

Hier habe ich das angenommen your_command gibt keine Ausgabe, aber es sollte nicht schwierig sein, eine solche Situation zu umgehen.

Bearbeiten: Damit es mit der Standard -Windows -Shell (und wahrscheinlich jeder anständigen Shell) funktioniert, können Sie schreiben, die Sie schreiben können your_command && echo ok anstelle von if innerhalb der shell Funktion. Ich denke nicht, dass dies für (ältere) DoS -Shells möglich ist. Für diese möchten Sie sich wahrscheinlich anpassen your_command Oder schreiben Sie ein Wrapper -Skript, um etwas auf Fehler (oder Erfolg) zu drucken.

Sie sollten ein reguläres Ziel verwenden, um Buildrules.mk zu erstellen:

BuildRules.mk: collect_sources.py
        python $< >$@

include BuildRules.mk

Dies ist der Standard -Trick, der bei automatischer Generierung von Abhängigkeiten verwendet werden kann.

Festsetzung https://stackoverflow.com/a/226974/192373

.PHONY: BuildRules.mk

BuildRules.mk: collect_sources.py
        echo Generating build rules...)
        python $< >$@
        $(MAKE) -f BuildRules.mk

Stellen Sie sicher, dass Sie mit der Option -k nicht aufrufen/gmelden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top