Как я могу избежать необходимости вручную перечислять каждый C-файл по разным путям в моем make-файле? - PullRequest
0 голосов
/ 06 июня 2019

В настоящее время мне приходится перечислять каждый 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», как мне нужно соответствующим образом изменить правило?)

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Вы задали здесь много разных вопросов, без особой детализации, поэтому я просто отвечу на ваш первый ясный вопрос:

Если вы хотите, чтобы make нашел все исходные файлы на еговместо того, чтобы перечислять их, вы можете использовать функцию shell для запуска find:

C_SOURCES := $(shell find Core Drivers -name \*.c -print)

Вам необходимо использовать :=, чтобы убедиться, что команда find не запускается повторнокаждый раз $(C_SOURCES) ссылка на переменную раскрывается, но вместо этого запускается только один раз.

0 голосов
/ 07 июня 2019

Это работает для меня, относительно , включая все файлы .c из подпапок и , связывающих объектные файлы проблемы.

#include .c files
SOURCES = $(shell echo ./**/*.c)

#obj file
OBJ = $(SOURCES:.c=.o)

Хотя яне уверен, что ./**/*.c работает на Windows ..

...