2015-11-03 3 views
0

Я пытаюсь заставить мой Makefile скомпилировать только измененные исходные файлы. В приведенном ниже файле Makefile мне нужны цели: %.o : ${SOURCE_DIR}/%.c и %.o : ${SOURCE_DIR}/%.s - скомпилировать, если исходный файл был изменен, или соответствующий. Объектный файл не существует.Получите make, чтобы перекомпилировать только неизменные исходные файлы

Не совсем уверен, что здесь не так, может кто-нибудь предложить вам совет?

# 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. Make продолжает выполнять это правило, потому что он видит, что main.o не существует (и правило для файла elf использует Build/main.o, которое Make продолжает восстанавливать).

Я предлагаю вам изменить:

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%, у меня была небольшая опечатка. Спасибо за ответ! –

Смежные вопросы