Makefile在目标中设置变量

tml*_*len 3 makefile

我有一个makefile,变量$DEBUG决定是否构建部署或调试.有一个主要的Makefile,以及包含的多个特定于平台的makefile.我希望在构建目标时自动将变量$DEBUG设置为.1test

主要的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
Run Code Online (Sandbox Code Playgroud)

并且特定于平台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)
Run Code Online (Sandbox Code Playgroud)

因此,有两个规则test:一个在主makefile中设置特定于目标的变量$DEBUG,另一个在Makefile.linux构建测试中.用于构建($CXXFLAGS,$BUILDDIR和其他)的变量在规则之前设置,并使用条件.

makefile中的所有内容都正常工作,但是调用make test不会改变变量$DEBUG:both $CXXFLAGS并且$BUILDDIR仍然设置为它们为构建的部署所具有的值.

有没有先设置的方式$DEBUG := 1Makefile当目标test,然后正常进行?或者是否有一个包含目标名称的特殊变量

ifeq ($(MAKEFILE_TARGET), test)
    ...
endif
Run Code Online (Sandbox Code Playgroud)

Ray*_*Ray 7

test : override DEBUG := 1不起作用,因为它声明了一个仅在该配方中可见的特定目标的变量.

确实存在包含在命令行中指定的目标名称的变量:MAKECMDGOALS.请注意,如果未在命令行中显式指定,则不包括默认目标.

示例makefile:

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

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

test:
    @echo test : $(MAKECMDGOALS) : $(DEBUG) : $(if $(DEBUG),1,0)
Run Code Online (Sandbox Code Playgroud)

用法:

$ 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
Run Code Online (Sandbox Code Playgroud)