Problema de makefile con condicional usado en define usado en comandos parte de una regla
-
04-07-2019 - |
Pregunta
Tengo una sección de makefile que tiene este tipo de estructura:
bob:
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
bobit:
@echo "before"
@make bob
@echo "after"
Aquí estoy simplificando enormemente, todos los ecos son en realidad bloques de comandos no triviales y hay más cosas condicionales, pero esto captura la esencia de mi problema.
Por razones técnicas, no quiero entrar en este momento, necesito deshacerme de ese submake, pero debido a que los ecos representan cantidades de código no triviales, no solo quiero copiar y pasar el cuerpo de Bob lugar del submake.
Idealmente, lo que me gustaría hacer es algo como esto
define BOB_BODY
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
endef
bob:
$(BOB_BODY)
bobit:
@echo "before"
$(BOB_BODY)
@echo "after"
Desafortunadamente, los condicionales parecen estar haciéndome daño, producen "ifdef; comando no encontrado" errores, intenté solucionar esto con varias combinaciones de eval y call, pero parece que no puedo encontrar una manera de hacerlo funcionar.
¿Cómo hago para que esto funcione? ¿Y es incluso la forma correcta de abordar el problema?
Solución
La forma en que lo he solucionado es utilizar condicionales de bash en su lugar, lo que en realidad tiene cierto sentido, ya que jugamos con comandos y no hacemos reglas.
Así que mi solución ideal desde arriba se convierte en algo así como
define BOB_BODY
@if [[ -n "$(DEBUG)" ]]; then \
echo running; \
fi;
@echo chug chug chug
@if [[ -n "$(DEBUG)" ]]; then \
echo done; \
fi
endef
bob:
$(BOB_BODY)
bobit:
@echo "before"
$(BOB_BODY)
@echo "after"
Otros consejos
Puede simplemente cambiar el orden de ifdef / define:
ifdef DEBUG
define BOB_BODY
@echo running
@echo chug chug chug
@echo done
endef
else
define BOB_BODY
@echo chug chug chug
endef
endif
ACTUALIZAR
define CHUG
@echo chug chug chug
endef
ifdef DEBUG
define BOB_BODY
@echo running
$(CHUG)
@echo done
endef
else
define BOB_BODY
$(CHUG)
endef
endif