A veces, necesita un archivo Makefile para poder ejecutarse en diferentes sistemas operativos de destino y desea que la compilación falle antes si un ejecutable requerido no está en PATHlugar de ejecutarse durante un tiempo posiblemente largo antes de fallar.
La excelente solución proporcionada por Engineerchuan requiere hacer un objetivo . Sin embargo, si tiene muchos ejecutables para probar y su Makefile tiene muchos objetivos independientes, cada uno de los cuales requiere las pruebas, entonces cada objetivo requiere el objetivo de prueba como una dependencia. Eso genera una gran cantidad de escritura adicional, así como tiempo de procesamiento cuando crea más de un objetivo a la vez.
La solución proporcionada por 0xf puede probar un ejecutable sin hacer un objetivo. Eso ahorra mucho tiempo de escritura y ejecución cuando hay varios objetivos que se pueden construir por separado o juntos.
Mi mejora con respecto a la última solución es usar el whichejecutable ( whereen Windows), en lugar de confiar en que haya una --versionopción en cada ejecutable, directamente en la ifeqdirectiva GNU Make , en lugar de definir una nueva variable y usar GNU Make errorfunción para detener la compilación si un ejecutable requerido no está en ${PATH}. Por ejemplo, para probar el lzopejecutable:
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
Si tiene varios ejecutables para verificar, entonces es posible que desee usar una foreachfunción con el whichejecutable:
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
Tenga en cuenta el uso del :=operador de asignación que se requiere para forzar la evaluación inmediata de la expresión RHS. Si su Makefile cambia PATH, entonces en lugar de la última línea de arriba necesitará:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
Esto debería darle un resultado similar a:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.