如何将两条相似的Make规则合并为一条通用规则?
合并重复Make规则的两种实用方案
你完全可以把这两条规则合并成一条通用规则,下面是两种简单可行的实现方式:
方案一:利用VPATH指定依赖搜索路径
VPATH是Make的内置变量,用于定义Make查找依赖文件的额外目录。只需将你的源码目录$(SRC)和$(DEMODIR)加入VPATH,就能用一条规则处理所有情况:
# 用冒号分隔多个搜索目录 VPATH := $(SRC):$(DEMODIR) $(ODIR)/%.o : %.cpp $(DEPS) $(CXX) -c -o $@ $< $(CXXFLAGS)
当Make需要生成$(ODIR)/xxx.o时,会自动在VPATH指定的目录中寻找xxx.cpp——不管它在$(SRC)还是$(DEMODIR)下,匹配到对应文件后就执行统一的编译配方。
方案二:静态模式规则配合文件收集
如果你不想依赖VPATH,可以先收集所有需要编译的.cpp文件,再转换为对应的.o目标,用静态模式规则统一处理:
# 收集src和src/demos下的所有.cpp文件 CPP_SOURCES := $(wildcard $(SRC)/*.cpp) $(wildcard $(DEMODIR)/*.cpp) # 将每个.cpp文件转换为obj目录下的同名.o文件 OBJ_TARGETS := $(patsubst %.cpp, $(ODIR)/$(notdir %.cpp), $(CPP_SOURCES)) # 静态模式规则:为所有目标文件生成编译规则 $(OBJ_TARGETS): $(ODIR)/%.o : %.cpp $(DEPS) $(CXX) -c -o $@ $< $(CXXFLAGS)
两种方案都能消除配方重复,后续如果新增其他源码目录,只需更新VPATH或者CPP_SOURCES即可,维护起来更方便。
内容的提问来源于stack exchange,提问作者Catyre
相关产品推荐
相关产品推荐

