如何避免手动列出makefile中不同路径的每个C文件?

如何避免手动列出makefile中不同路径的每个C文件?,c,makefile,toolchain,C,Makefile,Toolchain,目前,我不得不列出makefile中的每个C文件,这似乎效率不高。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_H

目前,我不得不列出makefile中的每个C文件,这似乎效率不高。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) $< $@
all:$(构建目录)/$(目标).elf$(构建目录)/$(目标).hex$(构建目录)/$(目标).bin
#对象列表
OBJECTS=$(addprefix$(BUILD\u DIR)/,$(notdir$(C\u SOURCES:.C=.o)))
vpath%.c$(排序$(目录$(c_源)))
#ASM程序对象列表
OBJECTS+=$(addprefix$(BUILD\u DIR)/,$(notdir$(ASM\u SOURCES:.s=.o)))
vpath%.s$(排序$(目录$(ASM\U源)))
$(生成目录)/%.o:%.c生成文件|$(生成目录)

$(CC)-c$(CFLAGS)-Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir$)(您在这里问了很多不同的问题,没有太多具体的内容,所以我只回答您第一个明确的问题:

如果您想自己查找所有源文件而不是列出它们,可以使用
shell
函数运行
find

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

您需要在此处使用
:=
,以确保
查找
命令不会在每次展开
$(C\U源)
变量引用时重新运行,而是只运行一次。

这对我来说很有效,涉及到包含子文件夹中的所有.C文件和链接对象文件的问题


虽然我不确定/***.c是否在Windows上工作。

最简单的解决方案是使用cmake或xmake生成Makefiles。这种语法只适用于
/bin/sh
实际上是bash或其他支持
***
全局绑定的高级shell的系统。这不是POSIX,也不可移植;例如Ubuntu/Debian系统对
/bin/sh
使用破折号,但它不提供此功能。即使使用bash,您也必须启用
globstar
选项才能获得此行为。我在回答中建议的
find
命令将适用于任何POSIX ish系统。我不知道这一点。感谢您的澄清。
#include .c files
SOURCES = $(shell echo ./**/*.c)

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