【发布时间】:2015-05-12 03:25:32
【问题描述】:
我有一个项目的生成文件,我想将其用于调试和发布版本。对于调试版本,我必须包含一个包含所有单元测试的额外 cpp 文件。我在 makefile 中添加了一个调试选项,除了一行之外,一切似乎都可以正常工作。
我的 makefile 很长,但有问题的行在这个块中:
debug: CXXFLAGS+=-DDEBUG_TEST
debug: CXXFLAGS+=-DTEST_DIRECTORY='"$(subst /makefile,,$(abspath $(lastword $(MAKEFILE_LIST))))/tests"'
debug: SRCS+=src/test.cpp
debug: flex bison $(SRCS) $(EXE)
添加到 CXXFLAGS 的前两行已成功解析,最后一行进行编译。但是,似乎无论我做什么,SRCS 都不会将测试文件附加到它上面。我什至打印了之前和之后的内容,它没有显示任何变化。我做错了什么?
我在 Windows 上使用 GNU Make 3.81。
编辑:我决定添加整个 makefile 来帮助回答。
CXX=g++
CXXFLAGS+=-std=c++11 -U__STRICT_ANSI__
FLEX=win_flex.exe
BISON=win_bison.exe
FLEXBISONSRCS=src/parser.cpp src/tokens.cpp src/math_parser.cpp src/math_tokens.cpp
SRCS=$(FLEXBISONSRCS) src/main.cpp src/assembler.cpp src/instruction.cpp src/util.cpp
OBJS=$(SRCS:.cpp=.o)
EXE=bin/yasa
debug: CXXFLAGS+=-DDEBUG_TEST
debug: CXXFLAGS+=-DTEST_DIRECTORY='"$(subst /makefile,,$(abspath $(lastword $(MAKEFILE_LIST))))/tests"'
debug: SRCS+=src/test.cpp
all debug: flex bison $(SRCS) $(EXE)
@echo ' $$^: $^'
@echo ' $$(SRCS): $(SRCS)'
$(EXE): $(OBJS)
$(CXX) $(OBJS) -o $@
.cpp.o:
$(CXX) $(CXXFLAGS) $< -c -o $@
flex:
$(FLEX) -o src/tokens.cpp src/65c816.l
$(FLEX) -o src/math_tokens.cpp src/math.l
bison:
$(BISON) -d -o src/parser.cpp src/65c816.y
$(BISON) -d -o src/math_parser.cpp src/math.y
rebuild: clean all
clean:
rm src/*.o
【问题讨论】:
-
你如何测试这个?该分配仅对该目标和作为该目标的先决条件的任何目标有效。 (更具体地说,当您在那里尝试时,它不对目标本身的先决条件有效。所以使用中间假
debug目标而不是让debug拥有构建配方(或实时事实上,对该测试文件的更改不会触发debug二进制文件的 make 重建)。 -
如果测试是指调用,那么我在进行发布构建时使用常规“make”,在进行调试构建时使用“make debug”,当我使用“make clean”或“make rebuild”时从一个切换到另一个。如果这不是您的意思,请澄清。
-
我的意思是你如何测试作业没有做任何事情。它绝对改变了
SRCS的值,但这种改变的范围是有限的。见gist.github.com/deryni/897ff4584abc34fa8851。 -
哦,我现在明白了。我正在使用
$(info $$SRCS is [${SRCS}])打印出值。赋值后输出不会改变,即使在干净的构建中,test.cpp 也不会被编译。 -
对,顶级
$(info)调用不会看到它。分配的范围是这样的,因此无法运行。debug目标的主体是什么?它必须自己进行编译(因为您有.c文件而不是列为先决条件的目标文件)。我假设它可能在配方中使用$^?在此处使用$(SRCS)将“解决”问题,但最终更简单的解决方案是根据正在构建的目标而不是特定于目标来使分配全局化。我会写一个答案。