You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
369 lines
9.0 KiB
369 lines
9.0 KiB
# ARM Cortex-Mx common makefile scripts and rules. |
|
############################################################################## |
|
# Processing options coming from the upper Makefile. |
|
# |
|
|
|
# Compiler options |
|
OPT := $(USE_OPT) |
|
COPT := $(USE_COPT) |
|
CPPOPT := $(USE_CPPOPT) |
|
|
|
# Garbage collection |
|
ifeq ($(USE_LINK_GC),yes) |
|
OPT += -ffunction-sections -fdata-sections -fno-common |
|
LDOPT := ,--gc-sections |
|
else |
|
LDOPT := |
|
endif |
|
|
|
# Linker extra options |
|
ifneq ($(USE_LDOPT),) |
|
LDOPT := $(LDOPT),$(USE_LDOPT) |
|
endif |
|
|
|
# Link time optimizations |
|
ifeq ($(USE_LTO),yes) |
|
OPT += -flto |
|
endif |
|
|
|
# FPU options default (Cortex-M4 and Cortex-M7 single precision). |
|
ifeq ($(USE_FPU_OPT),) |
|
USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -fsingle-precision-constant |
|
endif |
|
|
|
# FPU-related options |
|
ifeq ($(USE_FPU),) |
|
USE_FPU = hard |
|
endif |
|
ifneq ($(USE_FPU),no) |
|
OPT += $(USE_FPU_OPT) |
|
DDEFS += -DCORTEX_USE_FPU=TRUE |
|
DADEFS += -DCORTEX_USE_FPU=TRUE |
|
else |
|
DDEFS += -DCORTEX_USE_FPU=FALSE |
|
DADEFS += -DCORTEX_USE_FPU=FALSE |
|
endif |
|
|
|
# Process stack size |
|
ifeq ($(USE_PROCESS_STACKSIZE),) |
|
LDOPT := $(LDOPT),--defsym=__process_stack_size__=0x400 |
|
else |
|
LDOPT := $(LDOPT),--defsym=__process_stack_size__=$(USE_PROCESS_STACKSIZE) |
|
endif |
|
|
|
# Exceptions stack size |
|
ifeq ($(USE_EXCEPTIONS_STACKSIZE),) |
|
LDOPT := $(LDOPT),--defsym=__main_stack_size__=0x400 |
|
else |
|
LDOPT := $(LDOPT),--defsym=__main_stack_size__=$(USE_EXCEPTIONS_STACKSIZE) |
|
endif |
|
|
|
# Output directory and files |
|
ifeq ($(BUILDDIR),) |
|
BUILDDIR = build |
|
endif |
|
ifeq ($(BUILDDIR),.) |
|
BUILDDIR = build |
|
endif |
|
OUTFILES := $(BUILDDIR)/$(PROJECT).elf \ |
|
$(BUILDDIR)/$(PROJECT).hex \ |
|
$(BUILDDIR)/$(PROJECT).bin \ |
|
$(BUILDDIR)/$(PROJECT).dmp \ |
|
$(BUILDDIR)/$(PROJECT).list |
|
|
|
ifdef SREC |
|
OUTFILES += $(BUILDDIR)/$(PROJECT).srec |
|
endif |
|
|
|
# Source files groups and paths |
|
ifeq ($(USE_THUMB),yes) |
|
TCSRC += $(CSRC) |
|
TCPPSRC += $(CPPSRC) |
|
else |
|
ACSRC += $(CSRC) |
|
ACPPSRC += $(CPPSRC) |
|
endif |
|
ASRC := $(ACSRC) $(ACPPSRC) |
|
TSRC := $(TCSRC) $(TCPPSRC) |
|
SRCPATHS := $(sort $(dir $(ASMXSRC)) $(dir $(ASMSRC)) $(dir $(ASRC)) $(dir $(TSRC)) $(dir $(LIBCC_CSRC)) $(dir $(LIBCC_ASMXSRC))) |
|
|
|
# Various directories |
|
OBJDIR := $(BUILDDIR)/obj |
|
LSTDIR := $(BUILDDIR)/lst |
|
|
|
# Object files groups |
|
ACOBJS := $(addprefix $(OBJDIR)/, $(notdir $(ACSRC:.c=.o))) |
|
ACPPOBJS := $(addprefix $(OBJDIR)/, $(notdir $(ACPPSRC:.cpp=.o))) |
|
TCOBJS := $(addprefix $(OBJDIR)/, $(notdir $(TCSRC:.c=.o))) |
|
TCPPOBJS := $(addprefix $(OBJDIR)/, $(notdir $(TCPPSRC:.cpp=.o))) |
|
ASMOBJS := $(addprefix $(OBJDIR)/, $(notdir $(ASMSRC:.s=.o))) |
|
ASMXOBJS := $(addprefix $(OBJDIR)/, $(notdir $(ASMXSRC:.S=.o))) |
|
OBJS := $(ASMXOBJS) $(ASMOBJS) $(ACOBJS) $(TCOBJS) $(ACPPOBJS) $(TCPPOBJS) |
|
LIBCC_ASMXOBJS := $(addprefix $(OBJDIR)/, $(notdir $(LIBCC_ASMXSRC:.S=.o))) |
|
LIBCC_TCOBJS := $(addprefix $(OBJDIR)/, $(notdir $(LIBCC_CSRC:.c=.o))) |
|
LIBCC_OBJS := $(LIBCC_ASMXOBJS) $(LIBCC_TCOBJS) |
|
# Paths |
|
IINCDIR := $(patsubst %,-I%,$(INCDIR) $(DINCDIR) $(UINCDIR)) |
|
LLIBDIR := $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR)) |
|
LLIBDIR += -L$(dir $(LDSCRIPT)) |
|
|
|
# Macros |
|
DEFS := $(DDEFS) $(UDEFS) |
|
ADEFS := $(DADEFS) $(UADEFS) |
|
|
|
# Libs |
|
LIBS := $(DLIBS) $(ULIBS) |
|
|
|
# Various settings |
|
MCFLAGS := -mcpu=$(MCU) |
|
ODFLAGS = -x --syms |
|
ASFLAGS = $(MCFLAGS) $(ADEFS) |
|
ASXFLAGS = $(MCFLAGS) $(ADEFS) |
|
ifneq ($(USE_FPU),no) |
|
LIBCC_ASXFLAGS = $(ASXFLAGS) $(USE_FPU_OPT) |
|
else |
|
LIBCC_ASXFLAGS = $(ASXFLAGS) |
|
endif |
|
CFLAGS = $(MCFLAGS) $(OPT) $(COPT) $(CWARN) $(DEFS) |
|
LIBCC_CFLAGS = $(CFLAGS) |
|
CPPFLAGS = $(MCFLAGS) $(OPT) $(CPPOPT) $(CPPWARN) $(DEFS) |
|
LDFLAGS = $(MCFLAGS) $(OPT) -nostartfiles $(LLIBDIR) -Wl,-Map=$(BUILDDIR)/$(PROJECT).map,--cref,--no-warn-mismatch,--library-path=$(RULESPATH)/ld,--script=$(LDSCRIPT)$(LDOPT) |
|
|
|
# provide a marker for ArduPilot build options in ChibiOS |
|
CFLAGS += -D_ARDUPILOT_ |
|
|
|
ifeq ($(ENABLE_ASSERTS),yes) |
|
ASXFLAGS += -DHAL_CHIBIOS_ENABLE_ASSERTS |
|
endif |
|
|
|
# Thumb interwork enabled only if needed because it kills performance. |
|
ifneq ($(strip $(TSRC)),) |
|
CFLAGS += -DTHUMB_PRESENT |
|
CPPFLAGS += -DTHUMB_PRESENT |
|
ASFLAGS += -DTHUMB_PRESENT |
|
ASXFLAGS += -DTHUMB_PRESENT |
|
ifneq ($(strip $(ASRC)),) |
|
# Mixed ARM and THUMB mode. |
|
CFLAGS += -mthumb-interwork |
|
CPPFLAGS += -mthumb-interwork |
|
ASFLAGS += -mthumb-interwork |
|
ASXFLAGS += -mthumb-interwork |
|
LDFLAGS += -mthumb-interwork |
|
else |
|
# Pure THUMB mode, THUMB C code cannot be called by ARM asm code directly. |
|
CFLAGS += -mno-thumb-interwork -DTHUMB_NO_INTERWORKING |
|
CPPFLAGS += -mno-thumb-interwork -DTHUMB_NO_INTERWORKING |
|
ASFLAGS += -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -mthumb |
|
ASXFLAGS += -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -mthumb |
|
LDFLAGS += -mno-thumb-interwork -mthumb |
|
endif |
|
else |
|
# Pure ARM mode |
|
CFLAGS += -mno-thumb-interwork |
|
CPPFLAGS += -mno-thumb-interwork |
|
ASFLAGS += -mno-thumb-interwork |
|
ASXFLAGS += -mno-thumb-interwork |
|
LDFLAGS += -mno-thumb-interwork |
|
endif |
|
|
|
# Generate dependency information |
|
ASFLAGS += -MD -MP -MF .dep/$(@F).d |
|
ASXFLAGS += -MD -MP -MF .dep/$(@F).d |
|
CFLAGS += -MD -MP -MF .dep/$(@F).d |
|
CPPFLAGS += -MD -MP -MF .dep/$(@F).d |
|
|
|
# Paths where to search for sources |
|
VPATH = $(SRCPATHS) |
|
|
|
ifndef ECHO |
|
T := $(shell $(MAKE) $(MAKECMDGOALS) --no-print-directory \ |
|
-nrRf $(firstword $(MAKEFILE_LIST)) \ |
|
ECHO="COUNTTHIS" | grep -c "COUNTTHIS") |
|
|
|
N := x |
|
C = $(words $N)$(eval N := x $N) |
|
ECHO = echo "[$C/$T] ChibiOS:" |
|
endif |
|
all: PRE_MAKE_ALL_RULE_HOOK $(OBJS) $(LIBCC_OBJS) $(OUTFILES) POST_MAKE_ALL_RULE_HOOK |
|
|
|
PRE_MAKE_ALL_RULE_HOOK: |
|
|
|
POST_MAKE_ALL_RULE_HOOK: |
|
|
|
$(LIBCC_OBJS) $(OBJS): | $(BUILDDIR) $(OBJDIR) $(LSTDIR) |
|
|
|
$(BUILDDIR): |
|
ifneq ($(USE_VERBOSE_COMPILE),yes) |
|
@echo Compiler Options |
|
@echo $(CC) -c $(CFLAGS) -I. $(IINCDIR) main.c -o main.o |
|
@echo |
|
endif |
|
@mkdir -p $(BUILDDIR) |
|
|
|
$(OBJDIR): |
|
@mkdir -p $(OBJDIR) |
|
|
|
$(LSTDIR): |
|
@mkdir -p $(LSTDIR) |
|
|
|
$(ACPPOBJS) : $(OBJDIR)/%.o : %.cpp |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
@echo |
|
$(CPPC) -c $(CPPFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@ |
|
else |
|
@$(ECHO) Compiling $(<F) |
|
@$(CPPC) -c $(CPPFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@ |
|
endif |
|
|
|
$(TCPPOBJS) : $(OBJDIR)/%.o : %.cpp |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
@echo |
|
$(CPPC) -c $(CPPFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ |
|
else |
|
@$(ECHO) Compiling $(<F) |
|
@$(CPPC) -c $(CPPFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ |
|
endif |
|
|
|
$(ACOBJS) : $(OBJDIR)/%.o : %.c |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
@echo |
|
$(CC) -c $(CFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@ |
|
else |
|
@$(ECHO) Compiling $(<F) |
|
@$(CC) -c $(CFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@ |
|
endif |
|
|
|
$(TCOBJS) : $(OBJDIR)/%.o : %.c |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
@echo |
|
$(CC) -c $(CFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ |
|
else |
|
@$(ECHO) Compiling $(<F) |
|
@$(CC) -c $(CFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ |
|
endif |
|
|
|
$(LIBCC_TCOBJS) : $(OBJDIR)/%.o : %.c |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
@echo |
|
$(CC) -c $(CFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ |
|
else |
|
@$(ECHO) Compiling $(<F) |
|
@$(CC) -c $(CFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ |
|
endif |
|
|
|
$(ASMOBJS) : $(OBJDIR)/%.o : %.s |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
@echo |
|
$(AS) -c $(ASFLAGS) -I. $(IINCDIR) $< -o $@ |
|
else |
|
@$(ECHO) Compiling $(<F) |
|
@$(AS) -c $(ASFLAGS) -I. $(IINCDIR) $< -o $@ |
|
endif |
|
|
|
$(ASMXOBJS) : $(OBJDIR)/%.o : %.S |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
@echo |
|
$(CC) -c $(ASXFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ |
|
else |
|
@$(ECHO) Compiling $(<F) |
|
@$(CC) -c $(ASXFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ |
|
endif |
|
|
|
$(LIBCC_ASMXOBJS) : $(OBJDIR)/%.o : %.S |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
@echo |
|
$(CC) -c $(LIBCC_ASXFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ |
|
else |
|
@$(ECHO) Compiling $(<F) |
|
@$(CC) -c $(LIBCC_ASXFLAGS) $(TOPT) -I. $(IINCDIR) $< -o $@ |
|
endif |
|
|
|
$(BUILDDIR)/$(PROJECT).elf: $(OBJS) $(LDSCRIPT) |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
@echo |
|
$(LD) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ |
|
else |
|
@echo Linking $@ |
|
@$(LD) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ |
|
endif |
|
|
|
%.hex: %.elf |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
$(HEX) $< $@ |
|
else |
|
@echo Creating $@ |
|
@$(HEX) $< $@ |
|
endif |
|
|
|
%.bin: %.elf |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
$(BIN) $< $@ |
|
else |
|
@echo Creating $@ |
|
@$(BIN) $< $@ |
|
endif |
|
|
|
%.srec: %.elf |
|
ifdef SREC |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
$(SREC) $< $@ |
|
else |
|
@echo Creating $@ |
|
@$(SREC) $< $@ |
|
endif |
|
endif |
|
|
|
%.dmp: %.elf |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
$(OD) $(ODFLAGS) $< > $@ |
|
$(SZ) $< |
|
else |
|
@echo Creating $@ |
|
@$(OD) $(ODFLAGS) $< > $@ |
|
@echo |
|
@$(SZ) $< |
|
endif |
|
|
|
%.list: %.elf |
|
ifeq ($(USE_VERBOSE_COMPILE),yes) |
|
$(OD) -S $< > $@ |
|
else |
|
@echo Creating $@ |
|
@$(OD) -S $< > $@ |
|
@echo |
|
@echo Done |
|
endif |
|
|
|
ifneq ($(CRASHCATCHER),) |
|
lib: $(OBJS) $(LIBCC_OBJS) $(BUILDDIR)/lib$(PROJECT).a $(BUILDDIR)/libcc.a pass |
|
else |
|
lib: $(OBJS) $(BUILDDIR)/lib$(PROJECT).a pass |
|
endif |
|
|
|
$(BUILDDIR)/lib$(PROJECT).a: $(OBJS) |
|
@$(AR) -r $@ $^ |
|
@echo |
|
@echo ChibiOS: Done! |
|
|
|
$(BUILDDIR)/libcc.a: $(LIBCC_OBJS) |
|
@$(AR) -r $@ $^ |
|
@echo |
|
@echo CrashCatcher: Done! |
|
|
|
pass: $(BUILDDIR) |
|
@echo $(foreach f,$(IINCDIR),"$(f);") > $(BUILDDIR)/include_dirs |
|
|
|
clean: CLEAN_RULE_HOOK |
|
@echo Cleaning |
|
-rm -fR .dep $(BUILDDIR) |
|
@echo |
|
@echo Done |
|
|
|
CLEAN_RULE_HOOK: |
|
|
|
# |
|
# Include the dependency files, should be the last of the makefile |
|
# |
|
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) |
|
|
|
# *** EOF ***
|
|
|