Problème de makefile avec conditionnel utilisé dans define utilisé dans les commandes faisant partie d'une règle

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

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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top