makefile - 为调试和发布目标配置 makefile
问题描述
考虑类似于以下内容的 Makefile:
CC = gcc
CXX = g++
CXXFLAGS += -std=c++11
SRCDIR = .
OBJECTS = \
file1.o \
file2.o \
file3.o
THREADS = 1
all: release
release: CXXFLAGS += -DNUM_THREADS=$(THREADS)
release: main
debug: CXXFLAGS += -g -DDEBUG -DVERBOSENESS=3 -DNUM_THREADS=$(THREADS)
debug: main
# Build main executable...
main: $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $^
# Compile all object files...
file1.o: $(SRCDIR)/file1.cpp
$(CXX) $(CXXFLAGS) -c $^
file2.o: $(SRCDIR)/file2.cpp
$(CXX) $(CXXFLAGS) -c $^
file3.o: $(SRCDIR)/file3.cpp
$(CXX) $(CXXFLAGS) -c $^
这仅适用于第一个make
:换句话说,当我make
使用与前一个目标不同的目标启动时,不会重新编译目标文件。也就是说,如果我在目标文件之间进行更改,我该如何重新编译目标debug
文件release
?
解决方案
如果您想严格基于一个标签强制重新编译,请说 "Debug"与. “发布”,然后您可以通过编写并根据适当的时间戳文件来完成,如下所示:
TYPE = Debug
#
# ... conditional settings based on $(TYPE) ...
#
OBJS = prog.o
all: test
prog: $(OBJS)
$(CC) -o $@ $(OBJS)
$(OBJS): $(TYPE)-mode-stamp
$(TYPE)-mode-stamp: last-mode-stamp
touch $@
touch -r $@ last-mode-stamp
last-mode-stamp:
touch $@
clean:
@rm *-mode-stamp $(OBJS) prog
假设您通过设置变量来选择构建类型$(TYPE)
,可能是通过命令行。所有目标文件都$(TYPE)-mode-stamp
具有先决条件,因此如果该文件已过期,则将重新构建所有目标文件,以及将其中任何一个作为先决条件的任何文件。 $(TYPE)-mode-stamp
本身具有last-mode-stamp
作为先决条件,因此如果前者比后者旧,或者后者本身已过时,则更新前者。将两个文件的时间戳设置为当前时间的配方$(TYPE)-mode-stamp
,这样
$(TYPE)-mode-stamp
不再过时last-mode-stamp
, 和last-mode-stamp
比可能存在的任何 OtherType-mode-stamp 更新。
如果最初不存在,则创建没有任何先决条件(但带有配方)的规则。last-mode-stamp
请注意,这与监视任何构建工具或标志是否更改完全不同且正交。
推荐阅读
- reactjs - 在 useEffect 中等待 useState
- python - 删除“?” 来自 tqdm 进度条的字符?
- python - LightGBM 如何将 feature_fraction 转换为整数值?
- assembly - RISC V 装配对齐错误
- javascript - 在 React 中设置画布背景图像属性
- python - 在 Keras 中为“categorical_crossentropy”选择验证指标
- google-chrome - Chrome 扩展程序拒绝从 blob 创建工作人员
- cypress - Cypress 拦截使用提供的 statusCode 引发跨源错误
- r - 匹配变量名
- javascript - 检测组件内的 React Router 路由更改以切换状态