Problema de makefile con condicional usado en define usado en comandos parte de una regla

StackOverflow https://stackoverflow.com/questions/228567

  •  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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top