Makefile 获取make以仅重新编译未更改的源文件

Makefile 获取make以仅重新编译未更改的源文件,makefile,Makefile,我试图让我的Makefile只编译更改过的源文件。在下面的Makefile中,我希望目标:%.o:${SOURCE_DIR}/%.c和%.o:${SOURCE_DIR}/%.s仅在源文件已更改或相应的.o对象文件不存在时编译 不完全确定这里出了什么问题,有人能提供一些建议吗 # Project name # -----------------------------------------------------------------------------------------------

我试图让我的Makefile只编译更改过的源文件。在下面的Makefile中,我希望目标:
%.o:${SOURCE_DIR}/%.c
%.o:${SOURCE_DIR}/%.s
仅在源文件已更改或相应的.o对象文件不存在时编译

不完全确定这里出了什么问题,有人能提供一些建议吗

# Project name
# ---------------------------------------------------------------------------------------------------------------------

PROJECT_NAME = stm32f4_template

# Source configuration
# ---------------------------------------------------------------------------------------------------------------------

OUT_DIR = ./Build
SOURCE_DIR = ./Src

SOURCES  = main.c
SOURCES += startup.s

C_SOURCES  = $(filter %.c, $(SOURCES))
ASM_SOURCES +=  $(filter %.s, $(SOURCES))

OBJECTS  = $(C_SOURCES:.c=.o)
OBJECTS += $(ASM_SOURCES:.s=.o)

# Tools 
# ---------------------------------------------------------------------------------------------------------------------

CC = arm-none-eabi-gcc
LD = arm-none-eabi-ld -v
CP = arm-none-eabi-objcopy
OD = arm-none-eabi-objdump

# Compilation, linker and other tool flags
# ---------------------------------------------------------------------------------------------------------------------

CFLAGS  =  -I./ -c -fno-common -O0 -g -mcpu=cortex-m4 -mthumb
LFLAGS  = -nostartfiles -TLinker/memory.ld -TLinker/sections.ld
CPFLAGS = -Obinary
ODFLAGS = -S

# Target: all ---------------------------------------------------------------------------------------------------------
#
all: setup $(PROJECT_NAME).elf
    @echo "Done! $?"

# Target: setup -------------------------------------------------------------------------------------------------------
#
setup:
    @mkdir -p $(OUT_DIR)

# Target: $(PROJECT_NAME).elf 
# ---------------------------------------------------------------------------------------------------------------------

$(PROJECT_NAME).elf: $(OBJECTS)
    @echo "Linking $@"
    $(LD) $(LFLAGS) -o ${OUT_DIR}/main.elf $(OUT_DIR)/main.o
    @echo

# Target %.o (.c sources)
# ---------------------------------------------------------------------------------------------------------------------
%.o : ${SOURCE_DIR}/%.c # --> Execute only if source changed!!!
    @echo "Compiling $<"
    $(CC) $(CFLAGS) $< -o $(OUT_DIR)/$@
    @echo

# Target %.o (.s sources)
# ---------------------------------------------------------------------------------------------------------------------
%.o : ${SOURCE_DIR}/%.s # --> Execute only if source changed!!!
    @echo "Compiling $<"
    $(CC) $(CFLAGS) $< -o $(OUT_DIR)/$@
    @echo

# Target: clean
# --------------------------------------------------------------------------------------------------------------------- 
clean:
    @echo "Cleaning build output..."
    @rm -rf $(OUT_DIR)
#项目名称
# ---------------------------------------------------------------------------------------------------------------------
项目名称=stm32f4\u模板
#源配置
# ---------------------------------------------------------------------------------------------------------------------
OUT\u DIR=/构建
源目录=./Src
来源=main.c
SOURCES+=startup.s
C_源=$(过滤器%.C,$(源))
ASM_源+=$(筛选器%.s,$(源))
对象=$(C_源:.C=.o)
对象+=$(ASM_源:.s=.o)
#工具
# ---------------------------------------------------------------------------------------------------------------------
CC=arm none eabi gcc
LD=臂无eabi LD-v
CP=arm none eabi对象复制
OD=臂无eabi objdump
#编译、链接器和其他工具标志
# ---------------------------------------------------------------------------------------------------------------------
CFLAGS=-I./-c-fno common-O0-g-mcpu=cortex-m4-mthumb
LFLAGS=-nostartfiles-TLinker/memory.ld-TLinker/sections.ld
CPFLAGS=-Obinary
ODFLAGS=-S
#目标:全部---------------------------------------------------------------------------------------------------------
#
全部:设置$(项目名称).elf
@echo“完成!$?”
#目标:设置-------------------------------------------------------------------------------------------------------
#
设置:
@mkdir-p$(输出目录)
#目标:$(项目名称).elf
# ---------------------------------------------------------------------------------------------------------------------
$(项目名称)。elf:$(对象)
@回显“链接$@”
$(LD)$(LFLAGS)-o${OUT\u DIR}/main.elf$(OUT\u DIR)/main.o
@回音
#目标%.o(.c源)
# ---------------------------------------------------------------------------------------------------------------------
%.o:${SOURCE_DIR}/%.c#-->仅在源代码更改时执行!!!
@echo“编译$此规则:

%.o : ${SOURCE_DIR}/%.c # --> Execute only if source changed!!!
    @echo "Compiling $<"
    $(CC) $(CFLAGS) $< -o $(OUT_DIR)/$@
其他%.o规则也是如此。

此规则:

%.o : ${SOURCE_DIR}/%.c # --> Execute only if source changed!!!
    @echo "Compiling $<"
    $(CC) $(CFLAGS) $< -o $(OUT_DIR)/$@
其他%.o规则也是如此。

此规则:

%.o : ${SOURCE_DIR}/%.c # --> Execute only if source changed!!!
    @echo "Compiling $<"
    $(CC) $(CFLAGS) $< -o $(OUT_DIR)/$@
其他%.o规则也是如此。

此规则:

%.o : ${SOURCE_DIR}/%.c # --> Execute only if source changed!!!
    @echo "Compiling $<"
    $(CC) $(CFLAGS) $< -o $(OUT_DIR)/$@

另一个%.o规则也是如此。

谢谢@Beta,这似乎差不多了,但生成输出如下:
没有规则生成目标“Build/main.o”,这是“stm32f4\u template.elf”所需要的。
。废话,现在100%工作,我有一个小错误。谢谢回答!谢谢@Beta,这似乎差不多了,但生成输出如下s:
没有规则生成目标'Build/main.o',这是'stm32f4_template.elf'所需要的。
放弃,现在100%正常工作,我有一个小错误。感谢您的回答!感谢@Beta,这似乎差不多了,但生成输出如下:
没有规则生成目标'Build/main.o',stm32f4_template.elf'所需要的。
。放弃它,现在100%正常工作,我有一个小的输入错误。谢谢你的回答!谢谢@Beta,这似乎差不多了,但是make输出如下:
没有规则使目标“Build/main.o”,这是“stm32f4\u template.elf”所需要的。
。放弃这个,现在100%工作,我有一个小的输入错误。谢谢你的回答!