Manchmal benötigen Sie ein Makefile, um auf verschiedenen Zielbetriebssystemen ausgeführt werden zu können, und Sie möchten, dass der Build frühzeitig fehlschlägt, wenn eine erforderliche ausführbare Datei nicht vorhanden ist, PATH
anstatt möglicherweise lange vor dem Ausfall ausgeführt zu werden.
Die hervorragende Lösung von Engineerchuan erfordert die Festlegung eines Ziels . Wenn Sie jedoch viele ausführbare Dateien testen müssen und Ihr Makefile viele unabhängige Ziele hat, für die jeweils Tests erforderlich sind, benötigt jedes Ziel das Testziel als Abhängigkeit. Dies bedeutet viel zusätzliche Eingabe- und Verarbeitungszeit, wenn Sie mehr als ein Ziel gleichzeitig erstellen.
Die von 0xf bereitgestellte Lösung kann auf eine ausführbare Datei testen, ohne ein Ziel zu erstellen . Dies spart viel Tipp- und Ausführungszeit, wenn mehrere Ziele separat oder zusammen erstellt werden können.
Meine Verbesserung gegenüber der letztgenannten Lösung besteht darin, die which
ausführbare Datei ( where
unter Windows) zu verwenden, anstatt sich darauf zu verlassen, dass --version
in jeder ausführbaren Datei direkt in der GNU Make- ifeq
Direktive eine Option vorhanden ist , anstatt eine neue Variable zu definieren und die GNU Make zu verwenden error
Funktion zum Stoppen des Builds, wenn eine erforderliche ausführbare Datei nicht vorhanden ist ${PATH}
. Zum Testen der lzop
ausführbaren Datei:
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
Wenn Sie mehrere ausführbare Dateien überprüfen müssen, möchten Sie möglicherweise eine foreach
Funktion mit der which
ausführbaren Datei verwenden:
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
Beachten Sie die Verwendung des :=
Zuweisungsoperators, der erforderlich ist, um eine sofortige Auswertung des RHS-Ausdrucks zu erzwingen. Wenn Ihr Makefile das ändert PATH
, benötigen Sie anstelle der letzten Zeile oben:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
Dies sollte eine Ausgabe ähnlich der folgenden ergeben:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.