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 PATH
lugar 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 which
ejecutable ( where
en Windows), en lugar de confiar en que haya una --version
opción en cada ejecutable, directamente en la ifeq
directiva GNU Make , en lugar de definir una nueva variable y usar GNU Make error
función para detener la compilación si un ejecutable requerido no está en ${PATH}
. Por ejemplo, para probar el lzop
ejecutable:
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 foreach
función con el which
ejecutable:
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.