[英]GNU Makefile automatic dependency resolve
我过去一直在使用qmake
和CMake
来生成我的makefile,没有任何问题。 但是,最近我发现在运行代码的某些集群上,这些工具很难找到/安装,因此我决定编写裸Makefile。 另外我还可以学到一些关于Makefile的东西;)
我的项目涉及多个目录,这些目录中包含源/头文件,并且大多数情况下它们之间是相互依赖的。 通过SO,我已经学会了使用-MM
标志来自动生成依赖项信息。 我的Makefile看起来像这样
include $(HEAD_DIR)/common.mk
OBJS_DIR = objs
LIBS_DIR = libs
SRCS = Matrix.cpp MatrixFull.cpp
OBJS = $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.o))
LIB_0 = $(patsubst %, $(LIBS_DIR)/%,libalgebra.a)
DEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d))
-include $(DEPS)
.PHONY: all
all:
@echo " ===== Building dependencies in lib/algebra ===== "
@$(MKDIR) $(OBJS_DIR)
@$(MAKE) $(OBJS)
@$(MKDIR) $(LIBS_DIR)
@$(MAKE) $(LIB_0)
@echo " ===================== done ===================== "
$(OBJS_DIR)/%.o: %.cpp
@echo " compiling source file: $< ..."
$(CXX) -c $(CXXFLAGS) -I$(INCLUDE_PATH) -MM $< -o $@
$(LIB_0): $($(OBJS_DIR)/%.o)
@echo " generating library file: $(@F) ..."
@$(AR) $(AR_FLAGS) $@ $^
.PHONY: clean
clean:
@$(RM) $(OBJS_DIR) $(LIBS_DIR)
这通常可以很好地工作,但是我想在以下几方面进行改进:1)当我更改头文件并发出make
,编译器不知何故没有all
选择,并且似乎默认为DEPS
。 这应该在此makefile中发生吗? 我怎样才能使all
默认规则? 2)如何使依赖文件不可见? 我尝试了DEPS := $(patsubst %,$(OBJS_DIR)/.%,$(SRCS:.cpp=.d))
但这无济于事3)如果您认为此Makefile有什么特别的建议可以给我可以通过其他方式改进吗?
编辑:说实话,我什至不知道如何make调用编译器来生成依赖项:p ...我没有看到任何明确的规则。 是否以某种方式隐藏在DEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d))
?
1)将-include $(DEPS)
向下-include $(DEPS)
all
规则下方。 第一条规则是默认规则(除非您有意设置一些特殊变量),因此,如果include
优先于以下规则all:
,则将成为默认规则。
2)我相信,通过“让他们看不见”你的意思是你想.foo.d
而不是foo.d
。 您必须修改使它们成为规则:
$(OBJS_DIR)/%.o: %.cpp
@echo " compiling source file: $< ..."
$(CXX) -c $(CXXFLAGS) -I$(INCLUDE_PATH) -MM $< -o $@
@mv $(OBJS_DIR)/$*.d $(OBJS_DIR)/.$*.d
然后找到它们的变量:
DEPS := $(patsubst %.cpp,$(OBJS_DIR)/.%.d,$(SRCS))
3)我会摆脱递归调用( $(MAKE) ...
),但是您应该确保其他所有操作都首先正确进行。 我很惊讶$(OBJS_DIR)/%.o
规则不在common.mk
。 除此之外,它看起来还不错。
4(?)) $(OBJS_DIR)/%.o
规则中的编译器命令使用-MM
标志,因此编译器生成依赖项文件作为副作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.