2016-03-23 17 views
0

Ich habe ein Makefile, wo eine Variable $DEBUG entscheidet, ob für die Bereitstellung oder das Debuggen zu erstellen. Es gibt ein Haupt-Makefile und mehrere plattformspezifische Makefiles, die enthalten sind. Ich möchte, dass die Variable $DEBUG automatisch auf 1 gesetzt wird, wenn das Ziel test erstellt wird.Makefile Set Variable in Ziel

Die Haupt Make-Datei:

DEBUG := 0 

test : override DEBUG := 1 

DIST_DIR := dist/ 
ifeq ($(DEBUG), 1) 
    BUILD_DIR := build/debug 
else 
    BUILD_DIR := build/deploy 
endif 


# detect operating system 
ifeq ($(OS), Windows_NT) 
    UNAME := Windows 
else 
    UNAME := $(shell uname -s) 
endif 

# include platform-specific Makefile 
export 
ifeq ($(UNAME), Darwin) 
    include Makefile.darwin 
endif 
ifeq ($(UNAME), Linux) 
    include Makefile.linux 
endif 

Und die plattformspezifische Makefile.linux:

... 
CXX := clang++-3.8 
CXXFLAGS := -std=c++14 -fPIC -I./external/include -fcolor-diagnostics 
LDFLAGS := 
LDLIBS := -lpthread -lm 


ifeq ($(DEBUG), 1) 
    CXXFLAGS += -g 
else 
    CXXFLAGS += -O3 -DNDEBUG 
endif 

... 

all : $(TARGET) 


test : $(TEST_TARGET) 
    $(TEST_TARGET) 

So gibt es zwei Regeln für test: Ein in der Haupt Make-Datei setzen die zielspezifische Variable $DEBUG, und der in Makefile.linux baut den Test. Die für das Erstellen verwendeten Variablen ($CXXFLAGS, $BUILDDIR und andere) werden vor den Regeln festgelegt und verwenden Bedingungen.

Alles in den Makefiles arbeitet jedoch richtig, ruft make test verändert nicht die Variable $DEBUG: beide $CXXFLAGS und $BUILDDIR noch erhalten auf die Werte, die sie für einen Einsatz gebaut haben würde.

Gibt es eine Möglichkeit, zuerst $DEBUG := 1 in Makefile zu setzen, wenn das Ziel test ist, und dann normal fortfahren? Oder gibt es eine spezielle Variable, die die Zielnamen enthalten, zum Beispiel

ifeq ($(MAKEFILE_TARGET), test) 
    ... 
endif 
+0

Sie conditionals in eleganter Art und Weise in Make umgehen kann: http://stackoverflow.com/a/35893827/412080 –

Antwort

1

test : override DEBUG := 1 nicht funktioniert, weil es ein target-specific variable erklärt, die innerhalb dieses Rezepts nur sichtbar ist.

Dort gibt does eine Variable mit den Zielnamen, die an der Befehlszeile angegeben wurden: MAKECMDGOALS. Beachten Sie, dass das Standardziel nicht enthalten ist, wenn es nicht explizit in der Befehlszeile angegeben wurde.

Beispiel Make-Datei:

DEBUG := $(filter test,$(MAKECMDGOALS)) 

all: 
    @echo all : $(MAKECMDGOALS) : $(DEBUG) : $(if $(DEBUG),1,0) 

test: 
    @echo test : $(MAKECMDGOALS) : $(DEBUG) : $(if $(DEBUG),1,0) 

Verbrauch:

$ make 
all : : : 0 
$ make all 
all : all : : 0 
$ make test 
test : test : test : 1 
$ make all test 
all : all test : test : 1 
test : all test : test : 1