Parfois, vous avez besoin d'un Makefile pour pouvoir s'exécuter sur différents OS cibles et vous voulez que la construction échoue tôt si un exécutable requis n'est pas dans PATH
plutôt que de s'exécuter pendant une période éventuellement longue avant d'échouer.
L'excellente solution fournie par engineerchuan nécessite de faire une cible . Cependant, si vous avez de nombreux exécutables à tester et que votre Makefile a de nombreuses cibles indépendantes, dont chacune nécessite les tests, alors chaque cible nécessite la cible de test en tant que dépendance. Cela entraîne beaucoup de frappe supplémentaire ainsi que du temps de traitement lorsque vous créez plus d'une cible à la fois.
La solution fournie par 0xf peut tester un exécutable sans faire de cible. Cela économise beaucoup de temps de frappe et d'exécution lorsqu'il y a plusieurs cibles qui peuvent être construites séparément ou ensemble.
Mon amélioration de cette dernière solution est d'utiliser l' which
exécutable ( where
sous Windows), plutôt que de compter sur l'existence d'une --version
option dans chaque exécutable, directement dans la ifeq
directive GNU Make , plutôt que de définir une nouvelle variable, et d'utiliser le GNU Make error
pour arrêter la construction si un exécutable requis n'est pas dans ${PATH}
. Par exemple, pour tester l' lzop
exécutable:
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
Si vous avez plusieurs exécutables à vérifier, vous pouvez utiliser une foreach
fonction avec l' which
exécutable:
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
Notez l'utilisation de l' :=
opérateur d'affectation qui est requis pour forcer l'évaluation immédiate de l'expression RHS. Si votre Makefile change le PATH
, alors au lieu de la dernière ligne ci-dessus, vous aurez besoin de:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
Cela devrait vous donner une sortie similaire à:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.