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
Sie conditionals in eleganter Art und Weise in Make umgehen kann: http://stackoverflow.com/a/35893827/412080 –