Makefile在目标中设置变量

10

我有一个 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

2
你可以在make中以更优雅的方式处理条件:http://stackoverflow.com/a/35893827/412080 - Maxim Egorushkin
2个回答

13

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)

使用方法:

$ 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

1
一个简单的选择是让你的test目标递归地使用DEBUG=1调用make。这也适用于包含的makefile。例如:
DEBUG := 0

test:
  make DEBUG=1

DIST_DIR := dist/
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接