2015-11-03 59 views
0

。在下面的Makefile中,我想目標:%.o : ${SOURCE_DIR}/%.c%.o : ${SOURCE_DIR}/%.s只有如果編譯源文件已經改變,或者相應的.o目標文件不存在。獲取使我想把我的Makefile文件只編譯修改後的源文件重新編譯只有不變的源文件

不能完全確定什麼是錯在這裏,有人可以提供一些建議嗎?

# 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 [email protected]" 
    $(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)/[email protected] 
    @echo 

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

# Target: clean 
# --------------------------------------------------------------------------------------------------------------------- 
clean: 
    @echo "Cleaning build output..." 
    @rm -rf $(OUT_DIR) 

回答

1

這條規則:

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

的問題是,這個規則的目標是main.o,所以要使用它,試圖建立main.o,因爲另一個目標要求main.o,但什麼這個規則實際上建立的是Build/main.o。請繼續運行這個規則,因爲它看到main.o是不存在的(和ELF文件的規則使用Build/main.o,使保持重建偷着)。

我建議你改變它:

OBJECTS = $(patsubst %.c, $(OUT_DIR)/%.o, $(C_SOURCES)) 

$(OUT_DIR)/%.o : ${SOURCE_DIR}/%.C# --> this should work 
    @echo "Compiling $<" 
    $(CC) $(CFLAGS) $< -o [email protected] 

這同樣適用於其他%的.o規則。

+0

感謝@Beta,似乎幾乎那裏,但使輸出如下:'沒有規則,使目標'Build/main.o','stm32f4_template.elf''需要。 –

+0

廢品,現在工作100%,我有一個小錯字。謝謝回答! –

相關問題