0

我一直在使用qmake并且CMake过去没有任何问题来生成我的makefile。然而,最近我发现在我运行我的代码的一些集群上,这些工具更难找到/安装,所以我决定编写裸 Makefiles。此外,我还可以学习有关 Makefile 的一两件事;)

我的项目涉及多个目录,其中包含源/头文件,并且通常在它们之间交叉依赖。我通过 SO 学会了使用-MMflag 来自动生成依赖信息。我的 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)当我更改头文件makeall 发出DEPS. 这应该发生在这个makefile中吗?如何制定all默认规则?2)如何使依赖文件不可见?我试过DEPS := $(patsubst %,$(OBJS_DIR)/.%,$(SRCS:.cpp=.d))了,但没有帮助 3) 如果您认为这个 Makefile 可以通过任何其他方式改进,您有什么具体建议可以给我吗?

编辑:老实说,我什至不确定 make 如何调用编译器来生成依赖项:p ...我没有看到任何明确的规则。它是否以某种方式隐藏在 中DEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d))

4

1 回答 1

1

1) 将规则-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标志,因此编译器生成依赖文件作为副作用。

于 2012-09-05T19:33:24.820 回答