Возможно, я не совсем корректно (или совсем некорректно) сформулировал вопрос. Есть следующая структура каталогов проекта.
Core/
STM32F10x_StdPeriph_Driver/
Project/
Makefile
Я написал для нее следующий makefile.
CODE
PROJECT=RadioModem
RM= rm -f
MKDIR = mkdir -p
OBJDIR = $(CURDIR)/obj
TOOLCHAIN = /opt/gcc-arm-none-eabi-4_9
TOOLCHAIN_BIN = $(TOOLCHAIN)/bin/
TOOLCHAIN_LIB = $(TOOLCHAIN)/arm-none-eabi/lib/
TOOLCHAIN_INC = $(TOOLCHAIN)/arm-none-eabi/include/
CXX = $(TOOLCHAIN_BIN)arm-none-eabi-g++
CC = $(TOOLCHAIN_BIN)arm-none-eabi-gcc
AS = $(TOOLCHAIN_BIN)arm-none-eabi-as
LD = $(TOOLCHAIN_BIN)arm-none-eabi-ld
CP = $(TOOLCHAIN_BIN)arm-none-eabi-objcopy
OD = $(TOOLCHAIN_BIN)arm-none-eabi-objdump
SZ = $(TOOLCHAIN_BIN)arm-none-eabi-size
# Interrupts vector table
VECTOR = $(CURDIR)/Core/src/startup_stm32f10x_hd.S
# Linker script
LDSCRIPT = $(CURDIR)/Core/stm32_flash.ld
LDFLAGS = -T$(LDSCRIPT) -L$(TOOLCHAIN_LIB) -nostartfiles -Xlinker --gc-sections -Wl,-Map,$(PROJECT).map -mcpu=cortex-m3 -mthumb
#assembler flags
ASFLAGS = -x assembler-with-cpp -Wall -c -fmessage-length=0 -mcpu=cortex-m3 -mthumb
# compiler flags
CFLAGS = -mthumb -mcpu=cortex-m3 -Os -fno-builtin -Wall -std=gnu99
INC := -I$(CURDIR)/STM32F10x_StdPeriph_Driver/inc/
INC += -I$(CURDIR)/Core/inc/
INC += -I$(CURDIR)/Project/inc/
INC += -I$(TOOLCHAIN_INC)
DEFINITIONS := -DSTM32F10X_HD
DEFINITIONS +=-DUSE_STDPERIPH_DRIVER
DEFINITIONS +=-DMAGOR_VER=0
DEFINITIONS +=-DMINOR_VER=1
CFLAGS+= $(DEFINITIONS)
CFLAGS+= $(INC)
# System sources
ASRC := $(VECTOR)
CSRC := $(wildcard $(CURDIR)/STM32F10x_StdPeriph_Driver/src/*.c)
CSRC += $(wildcard $(CURDIR)/Core/src/*.c)
# Project sources
CSRC += $(CURDIR)/Project/src/main.c
CSRC += $(CURDIR)/Project/src/stm32_it.c
COBJ := $(CSRC:.c=.o)
AOBJ := $(ASRC:.S=.o)
#COBJ := $(addprefix $(OBJDIR)/, $(notdir $(CSRC:.c=.o)))
#AOBJ := $(addprefix $(OBJDIR)/, $(notdir $(ASRC:.S=.o)))
all: $(PROJECT).elf $(PROJECT).bin $(PROJECT).lst
$(PROJECT).lst: $(PROJECT).elf
$(OD) -h -S $(PROJECT).elf > $(PROJECT).lst
$(SZ) --format=berkeley $(PROJECT).elf
$(PROJECT).bin: $(PROJECT).elf
$(CP) -O binary $(PROJECT).elf $@
$(PROJECT).elf: $(OBJDIR) $(AOBJ) $(COBJ)
$(CC) $(LDFLAGS) $(AOBJ) $(COBJ) -o $@
$(OBJDIR):
$(MKDIR) $(OBJDIR)
%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
%.o: %.S
$(CC) -c $(ASFLAGS) $< -o $@
clean:
rm -f $(PROJECT) $(COBJ) $(AOBJ)
rm $(PROJECT).elf $(PROJECT).lst $(PROJECT).map $(PROJECT).bin
rm -rf obj
.PHONY: clean
Данный makefile абсолютно рабочий. И он меня почти всем устраивает. Но, у меня возникло желание не загромождать каталоги Core, STM32F10x_StdPeriph_Driver и Project объектными файлами при компиляции.
Как только я заменяю кострукцию
COBJ := $(CSRC:.c=.o)
AOBJ := $(ASRC:.S=.o)
на
COBJ := $(addprefix $(OBJDIR)/, $(notdir $(CSRC:.c=.o)))
AOBJ := $(addprefix $(OBJDIR)/, $(notdir $(ASRC:.S=.o)))
сразу пропадают из видимости make-а правила построения объектников из исходников. Меня это немного смущает. Как можно написать кострукцию зависимости *с и *S файлов, разбросанным по разным каталогам, чтобы правило
%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
%.o: %.S
$(CC) -c $(ASFLAGS) $< -o $@
работало корректно? Спасибо.
Прикрепленные файлы
Cpu_M.zip ( 302 килобайт )
Кол-во скачиваний: 8