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'ajouter quelques indicateurs 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'appelle test target, je souhaite nettoyer mon environnement, ajouter de nouveaux indicateurs (comme -DTEST aux existants), compiler à nouveau le code complet (sources, puis tester les modules ).
Je ne veux pas copier/coller le code pour la compilation avec de nouveaux drapeaux, car il y a beaucoup de logique mise 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?
Oui, il existe un moyen facile de le faire, et sans réexécuter Make. Utilisez une variable spécifique à la cible :
test: clean debug_compile
debug_compile: ERLCFLAGS += -DTEST
debug_compile: compile compile_test;
Une autre réponse est la suivante: Définir la variable make au moment de l’exécution de la règle .
Pour les paresseux, vous pouvez avoir des règles du type suivant (FLAG
et DEBUG
sont mes variables):
.DBG:
$(eval FLAG += $(DEBUG))
Je voulais ajouter une cible dans un fichier makefile pour exécuter des tests, ce qui impliquait la recompilation du 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)