Modifier la valeur de la variable Makefile dans le corps cible

Existe-t-il un moyen de réaffecter la valeur de la variable Makefile à l’intérieur du corps cible?

Ce que j’essaie de faire est d’append des drapeaux supplémentaires pour la compilation de débogage:

%.erl: %.beam $(ERLC) $(ERLFLAGS) -o ebin $< test: clean debug_compile_flag compile compile_test debug_compile: $(ERLCFLAGS) += -DTEST 

Donc, si j’invoque une cible de test, je voudrais nettoyer mon environnement, append de nouveaux indicateurs (comme -DTEST aux existants), comstackr à nouveau le code complet (premières sources, puis modules de test).

Je ne veux pas copier / coller le code pour comstackr avec de nouveaux drapeaux, car il y a beaucoup de logique ici et là.

Existe-t-il un moyen simple de redéfinir la valeur de la variable afin de pouvoir réutiliser le code existant?

Edit : Comme expliqué par Beta dans l’ autre réponse , c’est possible.


Non, il n’y a aucun moyen de faire cela dans le Makefile. Vous pouvez toutefois modifier la valeur d’une variable sur la ligne de commande make . Si vous réécrivez votre Makefile comme suit:

 ERLCFLAGS += $(ERLCFLAGSADDED) %.erl: %.beam $(ERLC) $(ERLCFLAGS) -o ebin $< test: clean compile compile_test 

Ensuite, vous pouvez appeler make pour effectuer vos tests en utilisant:

 make ERLCFLAGSADDED=-DTEST test 

Oui, il existe un moyen facile de le faire, et sans relancer Make. Utilisez une valeur de variable spécifique à la cible :

 test: clean debug_comstack debug_comstack: ERLCFLAGS += -DTEST debug_comstack: comstack comstack_test; 

Une autre réponse est ici: Définir la variable make au moment de l’exécution de la règle .

Pour les fainéants, vous pouvez avoir des règles comme celles-ci ( FLAG et DEBUG sont mes variables):

 .DBG: $(eval FLAG += $(DEBUG)) 

Je voulais append une cible dans un fichier makefile pour exécuter des tests, ce qui impliquait de recomstackr le code source avec des indicateurs de débogage. La réponse de Ian: https://stackoverflow.com/a/15561911/ était la seule solution qui fonctionnait.

Voici le Makefile que j’ai créé, qui garantit l’ordre d’exécution lors de l’exécution de make tests :

 TARGET = a.out CC = g++ GENERIC_F = -Wall -Wextra -I. -Idoctest/doctest/ CFLAGS = -O0 -std=c++11 $(GENERIC_F) DEBUG_MODE = -DDEBUG LINKER = g++ LFLAGS = $(GENERIC_F) -lm SRCDIR = src OBJDIR = build BINDIR = bin SOURCES = $(wildcard $(SRCDIR)/*.cc) INCLUDES = $(wildcard $(SRCDIR)/*.h) OBJECTS = $(SOURCES:$(SRCDIR)/%.cc=$(OBJDIR)/%.o) rm = rm -f .PHONY: clear_screen tests extend_cflags $(BINDIR)/$(TARGET): $(OBJECTS) $(INCLUDES) $(LINKER) $(OBJECTS) $(LFLAGS) -o $@ @echo -e "Linking complete!\n" $(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.cc $(INCLUDES) @mkdir -p $(OBJDIR) $(BINDIR) $(CC) $(CFLAGS) -c $< -o $@ @echo -e "Compiled "$<" successfully!\n" .PHONY: clean clean: @$(rm) $(OBJECTS) @echo "Cleanup complete!" .PHONY: remove remove: clean @$(rm) $(BINDIR)/$(TARGET) @echo "Executable removed!" clear_screen: @clear extend_cflags: $(eval CFLAGS += $(DEBUG_MODE)) tests: | remove extend_cflags $(BINDIR)/$(TARGET) clear_screen @$(BINDIR)/$(TARGET)