2016-03-23 5 views
0

У меня есть файл 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 
+0

Вы можете обрабатывать условными более изящным способом в гриме: http://stackoverflow.com/a/35893827/412080 –

ответ

1

test : override DEBUG := 1 не работает, потому что он объявляет target-specific variable, который виден только в пределах этого рецепта.

Там имеет существует переменная, содержащая имена целей, указанные в командной строке: MAKECMDGOALS. Обратите внимание, что он не включает цель по умолчанию, если она явно не указана в командной строке.

Пример Makefile:

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

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

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

Использование:

$ 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