[英]Makefile: automatic generation of dependencies for binaries
我想“完全”自动化项目的Makefile中依赖项生成的过程。 到目前为止,我已经遵循了有关自动依赖项的教程 , 该教程非常好用。 只有一个陷阱:仅适用于头文件依赖项,因此它将自动检测bin_1.o是否依赖header_1.h以及header_2.h。 但是,我可以直接将头文件依赖关系转换为目标文件依赖关系。 说,自动生成的依赖文件之一说
bin_1.o: bin_1.cpp header_1.h header_2.h
因此,在链接步骤中,我可以立即得出结论,我将需要将文件bin_1.o,header_1.o和header_2.o链接在一起,以生成二进制bin_1。 换句话说,bin_1的对应依赖项文件应具有
bin_1: bin_1.o header_1.o header_2.o
这正是我试图实现的目标。 上面描述的翻译是通过一个小的python脚本extract_dependencies.py完成的,然后我的Makefile的精简版看起来像这样:
binaries = bin_1 bin_2 bin_3
SRCS := $(wildcard *.cpp)
all: $(binaries)
# dependencies
DEPDIR := .d
$(shell mkdir -p $(DEPDIR) >/dev/null)
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Td
COMPILE = $(CC) $(DEPFLAGS) $(CFLAGS) -c
POSTCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d
GENERATE_BINARY_DEPS = python extract_dependencies.py $(DEPDIR)/$*.d > $(DEPDIR)/$*.bin.d
$(DEPDIR)/%.d: ;
$(DEPDIR)/%.bin.d: ;
.PRECIOUS: $(DEPDIR)/%.d $(DEPDIR)/%.bin.d
$(binaries): % : %.o $(DEPDIR)/%.bin.d
${CC} ${CFLAGS} $(shell cat .d/$@.bin.d | cut -d ' ' -f 2-) ${LDFLAGS} -o $@
%.o: %.cpp
%.o: %.cpp $(DEPDIR)/%.d
$(COMPILE) $<
$(POSTCOMPILE)
$(GENERATE_BINARY_DEPS)
clean:
rm -vf *.o
rm -vf bin_1 bin_2 bin_3
realclean:
$(MAKE) clean
rm -fr .d
-include $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS)))
-include $(patsubst %,$(DEPDIR)/%.bin.d,$(basename $(SRCS)))
现在出现了问题:为了使其正常工作,我需要运行两次“ make”。 * .bin.d依赖文件已生成,但仅在第二次运行时,Make实际上“意识到”说header_1.o对于bin_1也是必要的,而不仅仅是bin_1.o。 在第一次运行时,它将尝试将所有目标文件链接在一起,而无需先实际构建所有目标文件。
有什么办法可以解决该问题,即在第一遍解决所有问题?
谢谢!
由于Make将在1日读取整个makefile,然后执行目标。 很难一次性更新%.bin.d。 另外,我们可以尝试在内部触发第二个“ make”,例如
ifneq ($(STAGE),2)
$(binaries): % : %.o $(DEPDIR)/%.bin.d
@{MAKE} $(binaries) STAGE=2
else
#2nd pass
$(binaries):
${CC} ${CFLAGS} -o $@ $(shell cat .d/$@.bin.d | cut -d ' ' -f 2-) ${LDFLAGS}
endif
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.