【发布时间】:2011-11-15 17:04:57
【问题描述】:
我有以下生成文件:
OUTPUTDIR = build
all: v12target v13target
v12target: INTDIR = v12
v12target: DoV12.avrcommontargets
v13target: INTDIR = v13
v13target: DoV13.avrcommontargets
%.avrcommontargets: $(OUTPUTDIR)/%.elf
@true
$(OUTPUTDIR)/%.elf: $(OUTPUTDIR)/$(INTDIR)/main.o
@echo TODO build ELF file from object file: destination $@, source $^
@echo Compiled elf file for $(INTDIR) > $@
$(OUTPUTDIR)/$(INTDIR)/%.o: %.c
@echo TODO call GCC to compile C file: destination $@, source $<
@echo Compiled object file for $<, revision $(INTDIR) > $@
$(shell rm -rf $(OUTPUTDIR))
$(shell mkdir -p $(OUTPUTDIR)/v12 2> /dev/null) $(shell mkdir -p $(OUTPUTDIR)/v13 2> /dev/null)
.SECONDARY:
这个想法是有几个不同的代码配置需要从相同的源代码编译。 “all”目标取决于 v12target 和 v13 目标,它们为特定构建设置了许多变量。它还取决于“avrcommontargets”模式,它定义了如何实际进行编译。然后,avrcommontargets 依赖于 ELF 文件,而 ELF 文件又依赖于从 C 源代码构建的目标文件。
每个编译的 C 文件都会生成一个目标文件 (*.o)。由于每种配置(v12、v13 等)都会产生不同的输出,因此需要多次构建 C 文件,并将输出放置在不同的子目录中。例如“build/v12/main.o”、“build/v13/main.o”等
样本输出:
TODO call GCC to compile C file: destination build//main.o, source main.c
TODO build ELF file from object file: destination build/DoV12.elf, source build//main.o
TODO build ELF file from object file: destination build/DoV13.elf, source build//main.o
问题是目标文件没有进入正确的子目录。例如,“build//main.o”而不是“build/v12/main.o”。这会阻止 main.o 正确重建以生成 main.o 的 v13 版本。
我猜问题在于 $(INTDIR) 是一个特定于目标的变量,也许这不能用于我为 %.elf 和 %.o 定义的模式目标中。
正确的输出是:
TODO call GCC to compile C file: destination build/v12/main.o, source main.c
TODO build ELF file from object file: destination build/DoV12.elf, source build/v12/main.o
TODO call GCC to compile C file: destination build/v13/main.o, source main.c
TODO build ELF file from object file: destination build/DoV13.elf, source build/v13/main.o
我需要做些什么来调整这个 makefile 以便它生成正确的输出?
【问题讨论】: