GNU Makefile自动依赖解析
GNU Makefile automatic dependency resolve
我过去一直使用qmake
和CMake
来生成生成文件,没有遇到任何问题。然而,最近我发现在我运行代码的一些集群上,这些工具更难找到/安装,所以我决定写一些空白的Makefile。此外,我还可以学习一些关于Makefiles的知识;)
我的项目涉及多个目录,其中包含源文件/头文件,并且它们之间经常存在交叉依赖关系。通过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
。这应该发生在这个生成文件中吗?如何使all
成为默认规则?2) 如何使depenency文件不可见?我试过DEPS := $(patsubst %,$(OBJS_DIR)/.%,$(SRCS:.cpp=.d))
,但没用3) 如果你认为这个Makefile可以通过其他方式改进,你能给我什么具体的建议吗?
编辑:老实说,我甚至不确定make是如何调用编译器来生成依赖项的:p。。。我看不出有任何明确的规则。它是否以某种方式隐藏在DEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d))
中?
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
标志,因此编译器生成依赖文件作为副作用。
- Makefile 创建两个库 - 一个依赖于另一个
- 处理多个子目录中的 Makefile 依赖项并输出到单独的子目录
- 如何在makefile的依赖项中编写"or"?
- 更改此MakeFile,以便它可以自动将目录中的所有文件视为依赖关系
- makefile是否可以在C++中强制执行依赖项限制
- 将几个依赖的C Makefile项目移植到MSVC中
- Makefile的依赖项未正确考虑
- GNU Makefile自动依赖解析
- 了解Makefile(C++)的依赖关系
- 将 Shell32.lib 的依赖添加到 WDK makefile
- Makefile |对包含在Header文件中的另一个Header文件的依赖关系
- C/C++Makefile:如何在with.C文件和其他目录中的对象文件之间建立依赖关系
- makefile强制库依赖项排序
- 使用Makefile、源生成器和gcc生成依赖关系
- Makefile循环依赖错误
- Makefile和库的不良依赖关系
- Makefile依赖项中的断点逻辑
- Makefile——多个目标,自动依赖
- 使用makefile在makefile中编写依赖项
- 是否有可能在Makefile的单次传递中使用gcc/g++/nvcc自动依赖-M而不将依赖保存到文件中?