Czasami potrzebujesz Makefile, aby móc działać na różnych docelowych systemach operacyjnych i chcesz, aby kompilacja zakończyła się niepowodzeniem, jeśli nie ma wymaganego pliku wykonywalnego, PATHzamiast działać przez możliwie długi czas, zanim ulegnie awarii.
Doskonałe rozwiązanie dostarczone przez inżyniera wymaga wyznaczenia celu . Jeśli jednak masz wiele plików wykonywalnych do przetestowania, a Twój plik Makefile ma wiele niezależnych celów, z których każdy wymaga testów, to każdy cel wymaga celu testowego jako zależności. To powoduje dużo dodatkowego pisania, a także czas przetwarzania, gdy tworzysz więcej niż jeden cel naraz.
Rozwiązanie dostarczone przez 0xf może testować plik wykonywalny bez tworzenia celu. Oszczędza to dużo czasu na pisanie i wykonywanie, gdy istnieje wiele celów, które można zbudować oddzielnie lub razem.
Moim ulepszeniem tego ostatniego rozwiązania jest użycie whichpliku wykonywalnego ( wherew systemie Windows), zamiast polegać na --versionopcji w każdym pliku wykonywalnym, bezpośrednio w ifeqdyrektywie GNU Make , zamiast definiować nową zmienną i używać GNU Make errorfunkcji, aby zatrzymać kompilację, jeśli nie ma wymaganego pliku wykonywalnego ${PATH}. Na przykład, aby przetestować lzopplik wykonywalny:
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
Jeśli masz kilka plików wykonywalnych do sprawdzenia, możesz chcieć użyć foreachfunkcji z whichplikiem wykonywalnym:
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
Zwróć uwagę na użycie :=operatora przypisania, który jest wymagany w celu wymuszenia natychmiastowej oceny wyrażenia RHS. Jeśli twój plik Makefile zmieni PATH, to zamiast ostatniej linii powyżej będziesz potrzebować:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
Powinno to dać wynik podobny do:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.