Problema makefile com condicional usado na definição usada em comandos parte de uma regra
-
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?
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