Make-Datei Problem mit bedingtem verwendet in define in Befehlen Teil einer Regel verwendet
-
04-07-2019 - |
Frage
Ich habe einen Abschnitt von Make-Datei, die diese Art von Struktur:
bob:
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
bobit:
@echo "before"
@make bob
@echo "after"
Ich bin vereinfacht stark hier, alle Echos sind tatsächlich nicht trivial Blöcke von Befehlen und es gibt mehr bedingte Sachen, aber das fängt die Essenz meines Problems.
Aus technischen Gründen möchte ich nicht in diesem Augenblick zu bekommen, muss ich dieses submake loszuwerden, sondern weil die Echos nicht triviale Mengen von Code darstellen möchte ich nicht nur kopieren und den Körper von Bob in anstelle des submake.
Im Idealfall, was ich möchte ist, etwas zu tun wie diese
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"
Leider scheinen die conditionals mich zu Wellenanlage, produzieren sie „ifdef: Befehl nicht gefunden“ Fehler habe ich versucht, um diese mit verschiedenen Kombinationen von eval bekommen und rufen, aber kann nicht scheinen, einen Weg, um herauszufinden, um es zu Arbeit.
Wie kann ich diese Arbeit machen? und ist es auch der richtige Weg, um das Problem zu nähern?
Lösung
So wie ich dieses Problem behoben haben, ist stattdessen bash conditionals zu verwenden, die tatsächlich eine bestimmte Menge an Sinn macht, da wir mit den Befehlen spielen und nicht die Regeln machen.
So ist meine ideale Lösung von oben wird so etwas wie
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"
Andere Tipps
Sie können einfach die Reihenfolge der ifdef ändern / definieren:
ifdef DEBUG
define BOB_BODY
@echo running
@echo chug chug chug
@echo done
endef
else
define BOB_BODY
@echo chug chug chug
endef
endif
UPDATE
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