我一直在使用qmake
并且CMake
过去没有任何问题来生成我的makefile。然而,最近我发现在我运行我的代码的一些集群上,这些工具更难找到/安装,所以我决定编写裸 Makefiles。此外,我还可以学习有关 Makefile 的一两件事;)
我的项目涉及多个目录,其中包含源/头文件,并且通常在它们之间交叉依赖。我通过 SO 学会了使用-MM
flag 来自动生成依赖信息。我的 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))
?