Problème de makefile avec conditionnel utilisé dans define utilisé dans les commandes faisant partie d'une règle
-
04-07-2019 - |
Question
J'ai une section de makefile qui a ce genre de structure:
bob:
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
bobit:
@echo "before"
@make bob
@echo "after"
Je simplifie beaucoup ici, tous les échos sont en réalité des blocs de commandes non triviaux et il y a plus de choses conditionnelles, mais cela capture l'essence de mon problème.
Pour des raisons techniques, je ne veux pas en parler pour le moment, je dois me débarrasser de cet enchaînement, mais parce que les échos représentent des quantités non triviales de code, je ne veux pas simplement copier et coller le corps de Bob dans lieu de la soumission.
Idéalement, ce que j'aimerais faire est quelque chose comme ceci
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"
Malheureusement, les conditions me paraissent trop lourdes, elles produisent "ifdef: Command not found". erreurs, j’ai essayé de contourner le problème avec diverses combinaisons d’éval et d’appel, mais j’ai eu l’impression de ne pas trouver le moyen de le faire fonctionner.
Comment puis-je faire ce travail? et est-ce même la bonne façon d'aborder le problème?
La solution
La façon dont j'ai corrigé cela est d'utiliser plutôt des conditions bash, ce qui est tout à fait logique puisque nous jouons avec des commandes et non pas de règles.
Donc, ma solution idéale par le haut devient quelque chose comme:
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"
Autres conseils
Vous pouvez simplement changer l'ordre 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
MISE À JOUR
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