У меня есть следующий make-файл:
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-файла, который, в свою очередь, зависит от объектных файлов, созданных из исходного кода 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
Что мне нужно сделать, чтобы настроить этот make-файл так, чтобы он генерировал правильный вывод?