В настоящее время мне приходится перечислять каждый C-файл в моем make-файле, что не представляется эффективным. C-файлы существуют в нескольких папках и подпапках.
Например:
C_SOURCES = \
Core/main.c \
Core/adc.c \
Core/buttons.c \
Core/config.c \
Core/delay.c \
Core/dsp/filter.c \
Core/ui/ui_definition.c \
... and so on
Core/system_stm32f4xx.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c \
Мне также интересно, как заставить его работать так, чтобы компоновщик брал правильные объектные файлы. В настоящий момент все объектные файлы сохраняются в директории build, как показано ниже:
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin
# list of objects
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
$(AS) -c $(CFLAGS) $< -o $@
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
$(CC) $(OBJECTS) $(LDFLAGS) -o $@
$(SZ) $@
$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
$(HEX) $< $@
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
$(BIN) $< $@
Меня также смущает, как изменить .o-правило в Makefile, в случае, если C-файлы из подпапок также сохраняются в подпапках в каталоге сборки.
(Если файл «Core / dsp / filter.c» сохраняется в «build / dsp / filter.o» или «build / filter.o», как мне нужно соответствующим образом изменить правило?)