Parfois, il est nécessaire qu'un Makefile puisse fonctionner sur différents systèmes d'exploitation cibles et vous voulez que la construction échoue rapidement si un exécutable requis n'est pas dans le fichier PATH
plutôt que de fonctionner pendant un temps éventuellement long avant de tomber en panne.
L'excellente solution fournie par ingénieurchuan nécessite de faire un cible . Cependant, si vous avez beaucoup d'exécutables à tester et que votre Makefile a beaucoup de cibles indépendantes, chacune d'entre elles nécessitant les tests, alors chaque cible nécessite la cible de test comme dépendance. Cela entraîne beaucoup de saisie 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 permet d'économiser beaucoup de temps de saisie et d'exécution lorsqu'il y a plusieurs cibles qui peuvent être construites séparément ou ensemble.
L'amélioration que j'ai apportée à cette dernière solution consiste à utiliser l'option which
exécutable ( where
dans Windows), plutôt que de compter sur l'existence d'une --version
dans chaque exécutable, directement dans le programme GNU Make ifeq
plutôt que de définir une nouvelle variable, et d'utiliser la directive GNU Make error
pour arrêter la construction si l'exécutable requis ne se trouve pas dans le répertoire de l'utilisateur. ${PATH}
. Par exemple, pour tester le 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, il est préférable d'utiliser un fichier foreach
avec la fonction 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 du :=
qui est nécessaire afin de forcer l'évaluation immédiate de l'expression RHS. Si votre Makefile change l'opérateur PATH
alors à la place 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 un résultat similaire à :
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.