summaryrefslogtreecommitdiff
path: root/prototype/fw/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'prototype/fw/Makefile')
-rw-r--r--prototype/fw/Makefile213
1 files changed, 213 insertions, 0 deletions
diff --git a/prototype/fw/Makefile b/prototype/fw/Makefile
new file mode 100644
index 0000000..db7952b
--- /dev/null
+++ b/prototype/fw/Makefile
@@ -0,0 +1,213 @@
+
+########################################################################################################################
+# Dependency directories
+########################################################################################################################
+
+CMSIS_CORE_DIR ?= upstream/cmsis-core
+CMSIS_DEVICE_DIR ?= upstream/cmsis-device-f3
+MUSL_DIR ?= upstream/musl
+TINYPRINTF_DIR ?= upstream/tinyprintf
+SQUARE_DIR ?= upstream/stm32square
+
+########################################################################################################################
+# Algorithm parameters
+########################################################################################################################
+
+# - none -
+
+########################################################################################################################
+# High-level build parameters
+########################################################################################################################
+
+DEBUG ?= 1
+OPT ?= 0
+
+BUILDDIR ?= build
+BINARY := safetyreset.elf
+LDSCRIPT := generic_stm32.ld
+DEVICE := STM32F302C8
+
+
+########################################################################################################################
+# Sources
+########################################################################################################################
+
+STARTUP_FILE := $(CMSIS_DEVICE_DIR)/Source/Templates/gcc/startup_stm32f302xc.s
+
+ASM_SOURCES := $(STARTUP_FILE)
+
+C_SOURCES := src/main.c
+C_SOURCES += upstream/tinyprintf/tinyprintf.c
+
+CPP_SOURCES := # - none -
+
+MUSL_SOURCES := # - none -
+MUSL_SOURCES := $(addprefix $(MUSL_DIR)/src/,$(MUSL_SOURCES))
+
+C_SOURCES += $(MUSL_SOURCES)
+
+
+########################################################################################################################
+# Low-level build parameters
+########################################################################################################################
+
+PREFIX ?= arm-none-eabi-
+
+CC := $(PREFIX)gcc
+CPP := $(PREFIX)cpp
+CXX := $(PREFIX)g++
+LD := $(PREFIX)gcc
+AR := $(PREFIX)ar
+AS := $(PREFIX)as
+SIZE := $(PREFIX)size
+NM := $(PREFIX)nm
+OBJCOPY := $(PREFIX)objcopy
+OBJDUMP := $(PREFIX)objdump
+GDB := $(PREFIX)gdb
+
+HOST_CC ?= $(HOST_PREFIX)gcc
+HOST_CXX ?= $(HOST_PREFIX)g++
+HOST_LD ?= $(HOST_PREFIX)gcc
+HOST_AR ?= $(HOST_PREFIX)ar
+HOST_AS ?= $(HOST_PREFIX)as
+HOST_OBJCOPY ?= $(HOST_PREFIX)objcopy
+HOST_OBJDUMP ?= $(HOST_PREFIX)objdump
+
+PYTHON3 ?= python3
+DOT ?= dot
+
+MUSL_DIR_ABS := $(abspath $(MUSL_DIR))
+CMSIS_CORE_DIR_ABS := $(abspath $(CMSIS_CORE_DIR))
+CMSIS_DEVICE_DIR_ABS := $(abspath $(CMSIS_DEVICE_DIR))
+
+DEVICE_FAMILY := $(shell echo $(DEVICE) | egrep -io 'STM32[a-z]{1,2}[0-9]'|cut -c 6-)
+DEVICE_DEFINES := -DSTM32$(DEVICE_FAMILY) $(addprefix -D,$(shell cat $(SQUARE_DIR)/buildinfo/$(DEVICE_FAMILY)/$(DEVICE).defines))
+FAMILY_HEADER := $(shell ls $(CMSIS_DEVICE_DIR)/Include | grep -i '^STM32$(DEVICE_FAMILY)xx.h')
+
+ARCH_FLAGS ?= -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16
+SYSTEM_FLAGS ?= -nostdlib -ffreestanding -nostartfiles
+
+COMMON_CFLAGS += -I$(abspath include)
+COMMON_CFLAGS += -I$(CMSIS_CORE_DIR_ABS)/Include
+COMMON_CFLAGS += -I$(BUILDDIR)
+
+CFLAGS += -I$(abspath tools/musl_include_shims)
+CFLAGS += -I$(abspath $(TINYPRINTF_DIR))
+CFLAGS += -I$(CMSIS_DEVICE_DIR_ABS)/Include
+
+CFLAGS += $(ARCH_FLAGS) $(SYSTEM_FLAGS)
+CFLAGS += -fno-common -ffunction-sections -fdata-sections
+
+COMMON_CFLAGS += -O$(OPT) -std=gnu11 -g
+COMMON_CFLAGS += $(DEVICE_DEFINES)
+COMMON_CFLAGS += -DDEBUG=$(DEBUG)
+
+# for musl
+CFLAGS += -Dhidden=
+
+SIM_CFLAGS += -lm -DSIMULATION
+SIM_CFLAGS += -Wall -Wextra -Wpedantic -Wshadow -Wimplicit-function-declaration -Wundef -Wno-unused-parameter
+
+INT_CFLAGS += -Wall -Wextra -Wpedantic -Wshadow -Wimplicit-function-declaration -Wundef -Wno-unused-parameter
+INT_CFLAGS += -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes
+
+CXXFLAGS += -Os -g
+CXXFLAGS += $(ARCH_FLAGS) $(SYSTEM_FLAGS)
+CXXFLAGS += -fno-common -ffunction-sections -fdata-sections
+CXXFLAGS += -Wall -Wextra -Wshadow -Wundef -Wredundant-decls
+CXXFLAGS += -I.
+
+LDFLAGS += $(ARCH_FLAGS) $(SYSTEM_FLAGS)
+
+LIBS += -lgcc
+LDFLAGS += -Wl,--gc-sections
+
+LINKMEM_FLAGS ?= --trim-stubs=startup.o --trace-sections .isr_vector --highlight-subdirs $(BUILDDIR)
+
+OBJS := $(addprefix $(BUILDDIR)/,$(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) $(ASM_SOURCES:.s=.o))
+ALL_OBJS := $(OBJS)
+ALL_OBJS += $(BUILDDIR)/generated/stm32_system_patched.o
+# Add generated source here.
+
+########################################################################################################################
+# Rules
+########################################################################################################################
+
+all: binsize
+
+.PHONY: binsize
+binsize: $(BUILDDIR)/$(BINARY) $(BUILDDIR)/$(BINARY:.elf=-symbol-sizes.pdf)
+ $(LD) -T$(LDSCRIPT) $(LDFLAGS) -Wl,--print-memory-usage -o /dev/null $(ALL_OBJS) $(LIBS)
+ @echo
+ @echo "▐▬▬▬▌ SyMbOL sIzE HiGhScORe LiSt ▐▬▬▬▌"
+ $(NM) --print-size --size-sort --radix=d $< | tail -n 20
+
+$(BUILDDIR)/generated/mem_defs.ldi: $(SQUARE_DIR)/ld_memmap/$(DEVICE_FAMILY)/$(DEVICE).ldi | $(BUILDDIR)/generated
+ ln -sfr $< $@
+
+$(BUILDDIR)/generated/stm32_device.h: $(CMSIS_DEVICE_DIR_ABS)/Include/$(FAMILY_HEADER) | $(BUILDDIR)/generated
+ ln -sfr $< $@
+
+$(BUILDDIR)/generated/stm32_system_patched.c: $(wildcard $(CMSIS_DEVICE_DIR_ABS)/Source/Templates/system_stm32*.c) | $(BUILDDIR)/generated
+ $(PYTHON3) tools/patch_system_init.py $< > $@
+
+$(BUILDDIR)/generated/stm32_irqs.h: $(STARTUP_FILE) | $(BUILDDIR)/generated
+ $(PYTHON3) tools/gen_isr_header.py --generate-include-guards --use-cpp $(CPP) $< > $@
+
+$(BUILDDIR)/generated: ; mkdir -p $@
+
+.PRECIOUS: $(BUILDDIR)/$(BINARY)
+$(BUILDDIR)/$(BINARY) $(BUILDDIR)/$(BINARY:.elf=.map) &: $(ALL_OBJS) $(LDSCRIPT) $(BUILDDIR)/generated/mem_defs.ldi
+ $(LD) -T$(LDSCRIPT) $(LDFLAGS) -o $@ -Wl,-Map=$(BUILDDIR)/$(BINARY:.elf=.map) $(ALL_OBJS) $(LIBS)
+
+build/$(BINARY:.elf=-symbol-sizes.dot): $(ALL_OBJS)
+ $(PYTHON3) tools/linkmem.py $(LINKMEM_FLAGS) $(LD) -T$(LDSCRIPT) $(LDFLAGS) $^ $(LIBS) > $@
+
+%.pdf: %.dot
+ $(DOT) -T pdf $< -o $@
+
+%.dot: %.elf
+ r2 -a arm -qc 'aa;agRd' $< 2>/dev/null >$@
+
+$(BUILDDIR)/src/%.o: src/%.s
+ mkdir -p $(@D)
+ $(CC) $(COMMON_CFLAGS) $(CFLAGS) $(INT_CFLAGS) -o $@ -c $<
+
+$(BUILDDIR)/src/%.o: src/%.c $(BUILDDIR)/generated/stm32_irqs.h $(BUILDDIR)/generated/stm32_device.h
+ mkdir -p $(@D)
+ $(CC) $(COMMON_CFLAGS) $(CFLAGS) $(INT_CFLAGS) -o $@ -c $<
+
+$(BUILDDIR)/src/%.o: src/%.cpp $(BUILDDIR)/generated/stm32_irqs.h $(BUILDDIR)/generated/stm32_device.h
+ mkdir -p $(@D)
+ $(CXX) $(CXXFLAGS) -o $@ -c $<
+
+$< $(BUILDDIR)/generated/%.o: $(BUILDDIR)/generated/%.c
+ mkdir -p $(@D)
+ $(CC) $(COMMON_CFLAGS) $(CFLAGS) $(INT_CFLAGS) -o $@ -c $<
+
+$(BUILDDIR)/%.o: %.c
+ mkdir -p $(@D)
+ $(CC) $(COMMON_CFLAGS) $(CFLAGS) $(EXT_CFLAGS) -o $@ -c $<
+
+$(BUILDDIR)/%.o: %.s
+ mkdir -p $(@D)
+ $(CC) $(COMMON_CFLAGS) $(CFLAGS) $(EXT_CFLAGS) -o $@ -c $<
+
+venv:
+ test -d venv || python3 -m venv --system-site-packages venv
+ source venv/bin/activate && pip install cxxfilt pyelftools libarchive matplotlib
+
+clean:
+ rm -rf $(BUILDDIR)/src
+ rm -rf $(BUILDDIR)/generated
+ rm -f $(BUILDDIR)/$(BINARY)
+ rm -f $(BUILDDIR)/$(BINARY:.elf=.map)
+ rm -f $(BUILDDIR)/$(BINARY:.elf=-symbol-sizes.dot)
+ rm -f $(BUILDDIR)/$(BINARY:.elf=-symbol-sizes.pdf)
+
+mrproper: clean
+ rm -rf build
+
+.PHONY: clean mrproper
+
+-include $(OBJS:.o=.d)