Make-Datei Problem mit bedingtem verwendet in define in Befehlen Teil einer Regel verwendet

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

  •  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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top