我正在开发一个中型项目,其中包含几个具有相互依赖关系的库,我最近将其转换为使用非递归 makefile 进行构建。我的下一个目标是能够同时从同一源代码树构建调试和发布版本(make debug;make release)。我的第一步是制作包含正确构建标志的调试和发布目标。我使用目标特定变量来做到这一点,如下所示:
CXXFLAGS=-Wall -Wextra -Werror -DLINUX
CXX_DEBUG_FLAGS=-g3 -DDEBUG_ALL
CXX_RELEASE_FLAGS=-O3
.PHONY: debug
debug: CXXFLAGS+=$(CXX_DEBUG_FLAGS)
debug: build
.PHONY: release
release: CXXFLAGS+=$(CXX_RELEASE_FLAGS)
release: build
这工作得很好,但你只能构建调试或发布,而不能同时构建两者。同时,我并不是指在同一个构建过程中,我的意思是在同一个源代码树中连续进行(进行调试;进行发布)。为了做到这一点,我需要将对象文件放置在调试/发布特定目录中,这样它们就不会互相覆盖,并且我需要用“D”来破坏调试目标二进制文件名称。我认为这很容易,因为我可以再次使用目标特定变量,如下所示:
CXXFLAGS=-Wall -Wextra -Werror -DLINUX
CXX_DEBUG_FLAGS=-g3 -DDEBUG_ALL
CXX_RELEASE_FLAGS=-O3
.PHONY: debug
debug: CXXFLAGS+=$(CXX_DEBUG_FLAGS)
debug: MODULE_BLD_TYPE=D
debug: OUT_DIR=debug_obj
debug: build
.PHONY: release
release: CXXFLAGS+=$(CXX_RELEASE_FLAGS)
release: MODULE_BLD_TYPE:=
release: OUT_DIR=release_obj
release: build
.PHONY: build
build: TARGET_NAME=HelloWorld$(MODULE_BLD_TYPE)
build: TARGET_BUILD_DIR=$(PROJECT_ROOT_DIR)/$(OUT_DIR)
build: TARGET_BUILD_OBJS=$(addprefix $(TARGET_BUILD_DIR)/,$(SOURCES:.cpp=.o))
build: $(TARGET_NAME)
您让阅读本文的专家已经知道这行不通,因为您无法使用目标特定变量来创建实际目标。它们对于我的 CXXFLAGS var 效果很好,因为该变量未在目标名称中使用。
是否有使用非递归 makefile 管理调试/发布版本的设计模式和/或最佳实践?具体来说,如何构建目标文件目录路径和目标名称(基于目标构建目标)?
Make 最持久的问题之一是它无法一次处理多个通配符。没有真正干净的方法来完成您所要求的操作(不诉诸递归,我认为这并不是那么糟糕)。这是一个合理的方法:
CXXFLAGS=-Wall -Wextra -Werror -DLINUX
CXX_DEBUG_FLAGS=-g3 -DDEBUG_ALL
CXX_RELEASE_FLAGS=-O3
.PHONY: debug
debug: CXXFLAGS+=$(CXX_DEBUG_FLAGS)
debug: HelloWorldD
.PHONY: release
release: CXXFLAGS+=$(CXX_RELEASE_FLAGS)
release: HelloWorld
DEBUG_OBJECTS = $(addprefix $(PROJECT_ROOT_DIR)/debug_obj/,$(SOURCES:.cpp=.o))
RELEASE_OBJECTS = $(addprefix $(PROJECT_ROOT_DIR)/release_obj/,$(SOURCES:.cpp=.o))
HelloWorldD: $(DEBUG_OBJECTS)
HelloWorld: $(RELEASE_OBJECTS)
# And let's add three lines just to ensure that the flags will be correct in case
# someone tries to make an object without going through "debug" or "release":
CXX_BASE_FLAGS=-Wall -Wextra -Werror -DLINUX
$(DEBUG_OBJECTS): CXXFLAGS=$(CXX_BASE_FLAGS) $(CXX_DEBUG_FLAGS)
$(RELEASE_OBJECTS): CXXFLAGS=$(CXX_BASE_FLAGS) $(CXX_RELEASE_FLAGS)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)