我有一个 makefile 文件,其中变量 $DEBUG
决定是构建部署版本还是调试版本。有一个主要的 Makefile,以及多个平台特定的 makefile 被包含在其中。我希望当编译目标 test
时,变量 $DEBUG
自动设置为 1
。
主要的 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
和其他变量)在规则之前设置,使用条件语句。
所有Makefile中的内容都正常工作,但调用make test
不会改变变量$DEBUG
:无论如何$CXXFLAGS
和$BUILDDIR
仍然被设置为部署构建的值。
是否有一种方法可以在目标为test
时先在Makefile
中设置$DEBUG := 1
,然后正常进行?或者是否有一个特殊的变量包含了目标名称,例如?
ifeq ($(MAKEFILE_TARGET), test)
...
endif