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, PATH
zamiast 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 which
pliku wykonywalnego ( where
w systemie Windows), zamiast polegać na --version
opcji w każdym pliku wykonywalnym, bezpośrednio w ifeq
dyrektywie GNU Make , zamiast definiować nową zmienną i używać GNU Make error
funkcji, aby zatrzymać kompilację, jeśli nie ma wymaganego pliku wykonywalnego ${PATH}
. Na przykład, aby przetestować lzop
plik 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ć foreach
funkcji z which
plikiem 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.