Problema di makefile con condizionale utilizzato in define utilizzato nella parte comandi di una regola
-
04-07-2019 - |
Domanda
Ho una sezione di makefile che ha questo tipo di struttura:
bob:
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
bobit:
@echo "before"
@make bob
@echo "after"
Sto semplificando molto qui, tutti gli echi sono in realtà blocchi di comandi non banali e c'è più roba condizionale, ma questo cattura l'essenza del mio problema.
Per motivi tecnici non voglio entrare in questo momento, ho bisogno di sbarazzarmi di quella sottomissione, ma poiché l'eco rappresenta quantità non banali di codice non voglio solo copiare e incollare il corpo di bob in luogo della sottomissione.
Idealmente quello che mi piacerebbe fare è qualcosa del genere
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"
Sfortunatamente i condizionali sembrano stancarmi, producono "ifdef: comando non trovato" errori, ho cercato di aggirare questo problema con varie combinazioni di eval e call, ma non riesco a trovare un modo per farlo funzionare.
Come posso farlo funzionare? ed è anche il modo giusto di affrontare il problema?
Soluzione
Il modo in cui ho risolto questo problema è usare invece i condizionali bash, il che in realtà ha un certo senso dato che stiamo giocando con i comandi e non creando regole.
Quindi la mia soluzione ideale dall'alto diventa qualcosa di simile
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"
Altri suggerimenti
Puoi semplicemente cambiare l'ordine di 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
Aggiorna
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