У меня есть файл makefile, где переменная $DEBUG
решает, следует ли строить для развертывания или отладки. Существует один основной Makefile и несколько связанных с платформой make-файлов, которые входят в комплект. Я хочу, чтобы переменная $DEBUG
была установлена на 1
автоматически, когда цель test
построена.Makefile set variable in target
Основной Makefile:
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
И платформозависимый 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)
Итак, есть два правила test
: один в главном Makefile устанавливает целевой конкретной переменной $DEBUG
, и один в Makefile.linux
строит тест. Переменные, используемые для построения ($CXXFLAGS
, $BUILDDIR
и другие), устанавливаются перед правилами и используют условные обозначения.
Все в Makefiles работает правильно, однако вызов make test
не изменяет переменную $DEBUG
: как $CXXFLAGS
и $BUILDDIR
еще приготовьтесь к значениям, которые они имели бы для развертывания построено.
Есть ли способ установить $DEBUG := 1
в Makefile
, когда цель test
, а затем нормально продолжить? Или есть специальная переменная, которая содержит имя цели, например
ifeq ($(MAKEFILE_TARGET), test)
...
endif
Вы можете обрабатывать условными более изящным способом в гриме: http://stackoverflow.com/a/35893827/412080 –