我有一个makefile,变量$DEBUG
决定是否构建部署或调试。有一个主要的Makefile,以及包含的多个特定于平台的makefile。我希望在构建目标$DEBUG
时自动将变量1
设置为test
。
主要的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
仍设置为他们将拥有的值用于部署。
当目标为$DEBUG := 1
时,有没有办法在Makefile
中首先设置test
,然后正常进行?
或者是否有包含目标名称的特殊变量,例如
ifeq ($(MAKEFILE_TARGET), test)
...
endif
答案 0 :(得分:5)
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