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, PATHanstatt 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 whichausführbare Datei ( whereunter Windows) zu verwenden, anstatt sich darauf zu verlassen, dass --versionin jeder ausführbaren Datei direkt in der GNU Make- ifeqDirektive eine Option vorhanden ist , anstatt eine neue Variable zu definieren und die GNU Make zu verwenden errorFunktion zum Stoppen des Builds, wenn eine erforderliche ausführbare Datei nicht vorhanden ist ${PATH}. Zum Testen der lzopausfü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 foreachFunktion mit der whichausfü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.