Problema makefile com condicional usado na definição usada em comandos parte de uma regra

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

  •  04-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma seção de makefile que tem esse tipo de estrutura:


bob:
ifdef DEBUG
    @echo running
endif
    @echo chug chug chug
ifdef DEBUG
    @echo done
endif    

bobit:
    @echo "before"
    @make bob
    @echo "after"

Estou simplificando muito aqui, todos os eco são na verdade blocos de comandos não triviais e há coisas mais condicionais, mas isso captura a essência do meu problema.

Por razões técnicas em que não quero entrar no momento, preciso me livrar desse submato, mas porque os eco representam quantidades não triviais de código, não quero apenas copiar e passar do corpo de Bob no lugar do submarino.

Idealmente, o que eu gostaria de fazer é algo assim


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"

Infelizmente, os condicionais parecem estar me transformando, eles produzem erros "ifdef: comando não encontrados", tentei contornar isso com várias combinações de avaliação e chamada, mas não consigo descobrir uma maneira de fazê -lo funcionar.

Como faço para fazer isso funcionar? E é mesmo a maneira certa de abordar o problema?

Foi útil?

Solução

A maneira como corrigi isso é usar condicionais de bash, o que realmente faz uma certa quantidade de sentido, pois estamos jogando com comandos e não fazemos regras.

Portanto, minha solução ideal de cima se torna algo 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 "antes" $ (bob_body) @echo "depois"

Outras dicas

Você pode simplesmente alterar a ordem de ifdef/definir:

ifdef DEBUG
  define BOB_BODY 
    @echo running
    @echo chug chug chug
    @echo done
  endef
else 
  define BOB_BODY 
    @echo chug chug chug
  endef
endif

ATUALIZAR

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top