web-dev-qa-db-fra.com

Changer 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'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?

47
paulgray

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;
64
Beta

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))
41
Ian Ooi

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)
0
Alberto Chiusole