* improved Makefile * fixed openocd script - removed uneeded file * minor cosmetic tweaks
190 lines
5.1 KiB
Makefile
190 lines
5.1 KiB
Makefile
#-------------------------------------------------------------------------------
|
|
# this GNU-makefile relies on the GCC toolchain
|
|
|
|
# --- control global project settings
|
|
# RELEASE=1 -> enable optimisation, then disable debug
|
|
# RELEASE=0 -> disable optimisation, then enable debug
|
|
RELEASE=0
|
|
|
|
# --- project architecture
|
|
# program name
|
|
EXE_PREFIX=main
|
|
# project folders, This Makefile should be in the same folder as the SRC folder
|
|
SRC=src
|
|
BIN=bin
|
|
INC=include
|
|
LIB=lib
|
|
OBJ=${BIN}/obj
|
|
DEP=${BIN}/dep
|
|
# code folders, in the SRC folder
|
|
SUBFOLDERS=drivers target
|
|
# Define linker script file here
|
|
LDSCRIPT=${SRC}/target/STM32F103XB.ld
|
|
|
|
# --- advanced config
|
|
# List all user C define here
|
|
UDEFS=
|
|
# Define ASM defines here
|
|
UADEFS=
|
|
|
|
# --- toolchain configuration
|
|
TARGET=arm-none-eabi-
|
|
CC=${TARGET}gcc
|
|
CPP=${TARGET}g++
|
|
OBJCOPY=${TARGET}objcopy
|
|
AS=${TARGET}gcc -x assembler-with-cpp -c
|
|
SIZE=${TARGET}size
|
|
OBJDUMP=${TARGET}objdump
|
|
|
|
# --- hardware settings
|
|
ARCH=armv7-m
|
|
FLOAT-ABI=soft #no FPU on stm32f103
|
|
CPU=cortex-m3
|
|
CPUFLAGS=-mthumb
|
|
FPU=fpv4-sp-d16 #"FLOAT-ABI=soft" disable that
|
|
|
|
#-------------------------------------------------------------------------------
|
|
# --- makefile pre-incantation
|
|
|
|
# List all de:fault C defines here, like -D_DEBUG=1
|
|
DDEFS=-march=${ARCH} -mfloat-abi=${FLOAT-ABI} -mcpu=${CPU} -mfpu=${FPU} $\
|
|
${CPUFLAGS}
|
|
# List all default ASM defines here, like -D_DEBUG=1
|
|
DADEFS=-D__ASSEMBLY__
|
|
|
|
# --- deduce file names
|
|
MAIN_C_FILES=${wildcard ${SRC}/${strip ${EXE_PREFIX}}*.c}
|
|
MAIN_CPP_FILES=${wildcard ${SRC}/${strip ${EXE_PREFIX}}*.cpp}
|
|
|
|
COMMON_C_FILES=${filter-out ${MAIN_C_FILES},${wildcard ${SRC}/*.c}}
|
|
COMMON_C_FILES+=${foreach dir,${SUBFOLDERS},${wildcard ${SRC}/${dir}/*.c}}
|
|
|
|
COMMON_CPP_FILES=${filter-out ${MAIN_CPP_FILES},${wildcard ${SRC}/*.cpp}}
|
|
COMMON_CPP_FILES+=${foreach dir,${SUBFOLDERS},${wildcard ${SRC}/${dir}/*.cpp}}
|
|
|
|
COMMON_ASM_FILES=${foreach dir,${SUBFOLDERS},${wildcard ${SRC}/${dir}/*.s}}
|
|
|
|
MAIN_OBJECT_FILES=${sort ${patsubst ${src}/%.c,${obj}/%.o,${MAIN_C_FILES}} \
|
|
${patsubst ${src}/%.cpp,${obj}/%.o,${MAIN_CPP_FILES}}}
|
|
COMMON_OBJECT_FILES=${sort \
|
|
${patsubst ${SRC}/%.c,${OBJ}/%.o,${COMMON_C_FILES}} \
|
|
${patsubst ${SRC}/%.cpp,${OBJ}/%.o,${COMMON_CPP_FILES}} \
|
|
${patsubst ${SRC}/%s,${OBJ}/%o,${COMMON_ASM_FILES}}}
|
|
|
|
LIBRARIES=${foreach dir,${wildcard ${LIB}/*},${wildcard ${LIB}/${dir}/*.a}}
|
|
|
|
OBJECT_FILES=${MAIN_OBJECT_FILES} ${COMMON_OBJECT_FILES}
|
|
DEPEND_FILES=${OBJECT_FILES:%.o,%.d}
|
|
|
|
#-------------------------------------------------------------------------------
|
|
# --- makefile incantation
|
|
# down here is black magic, you probably don't want to modify anything
|
|
|
|
DEFS=${DDEFS} ${UDEFS}
|
|
ADEFS=${DADEFS} ${UADEFS}
|
|
|
|
# --- otpimisation
|
|
ifeq (${strip ${RELEASE}},0)
|
|
CFLAGS=-g3 -O0
|
|
else
|
|
CFLAGS=-O3
|
|
endif
|
|
|
|
# --- c/cpp
|
|
ifneq (${strip ${MAIN_CPP_FILES} ${COMMON_CPP_FILES}},)
|
|
CC:=${CPP}
|
|
CFLAGS+=-std=c++17
|
|
else
|
|
CFLAGS+=-std=c17
|
|
endif
|
|
|
|
ASFLAGS=${LIB} $(DEFS) -Wa,--gdwarf2 $(ADEFS)
|
|
CFLAGS+=-Wall ${DEFS} -Wextra -Warray-bounds -Wno-unused-parameter $\
|
|
-fomit-frame-pointer
|
|
LDFLAGS=-T ${LDSCRIPT} -lc -lgcc -lgcov -lm -Wl,-Map=$@.map,--gc-sections $\
|
|
--specs=nosys.specs
|
|
INCLUDE=-I ${INC}
|
|
|
|
# --- Generate dependency information
|
|
CFLAGS+=-MD -MP -MF ${patsubst %o,%d,$@}
|
|
ASFLAGS+=#-MD -MP -MF ${patsubst %o,%d,$@}
|
|
|
|
# --- folder tree
|
|
DIR_GUARD=@mkdir -p ${@D}
|
|
|
|
#-------------------------------------------------------------------------------
|
|
# --- make rules
|
|
all: ${BIN}/${EXE_PREFIX}.elf ${BIN}/${EXE_PREFIX}.hex ${BIN}/${EXE_PREFIX}.bin
|
|
|
|
rebuild : clean all
|
|
|
|
.SUFFIXES:
|
|
.SECONDARY:
|
|
.PHONY: all clean rebuild
|
|
|
|
# --- compiler command for elf file
|
|
${BIN}/%.elf : ${MAIN_OBJECT_FILES} ${COMMON_OBJECT_FILES}
|
|
@echo -e '\e[32;1m ==== linking $@ ====\e[0m'
|
|
@echo ${COMMON_OBJECT_FILES}
|
|
@echo
|
|
${DIR_GUARD}
|
|
${CC} ${INCLUDE} ${CFLAGS} -o $@ $^ ${LIBRARIES} ${LDFLAGS}
|
|
${OBJDUMP} -h $@
|
|
${SIZE} $@
|
|
@echo
|
|
|
|
# --- compiler commands for uploadable files
|
|
${BIN}/%.hex : ${BIN}/%.elf
|
|
@echo -e '\e[33;1m ==== translating $< ====\e[0m'
|
|
${OBJCOPY} -O ihex $< $@
|
|
@echo
|
|
|
|
${BIN}/%.bin : ${BIN}/%.elf
|
|
@echo -e '\e[33;1m ==== translating $< ====\e[0m'
|
|
${OBJCOPY} -O binary $< $@
|
|
@echo
|
|
|
|
# --- compiler commands for every source file
|
|
${OBJ}/%.o : ${SRC}/%.cpp
|
|
@echo -e '\e[36;1m ==== compiling $< ====\e[0m'
|
|
${DIR_GUARD}
|
|
${CPP} ${INCLUDE} -c ${CFLAGS} $< -o $@ ${LIBRARIES}
|
|
@echo
|
|
|
|
${BIN}/%.o : ${SRC}/%.cpp
|
|
@echo -e '\e[36;1m ==== compiling $< ====\e[0m'
|
|
${DIR_GUARD}
|
|
${CPP} ${INCLUDE} -c ${CFLAGS} $< -o $@ ${LIBRARIES}
|
|
@echo
|
|
|
|
${OBJ}/%.o : ${SRC}/%.c
|
|
@echo -e '\e[34;1m ==== compiling $< ====\e[0m'
|
|
${DIR_GUARD}
|
|
${CC} ${INCLUDE} -c ${CFLAGS} $< -o $@ ${LIBRARIES}
|
|
@echo
|
|
|
|
${BIN}/%.o : ${SRC}/%.c
|
|
@echo -e '\e[34;1m ==== compiling $< ====\e[0m'
|
|
${DIR_GUARD}
|
|
${CC} ${INCLUDE} -c ${CFLAGS} $< -o $@ ${LIBRARIES}
|
|
@echo
|
|
|
|
${OBJ}/%.o : ${SRC}/%.s
|
|
@echo -e '\e[35;1m ==== compiling $^ ====\e[0m'
|
|
${DIR_GUARD}
|
|
${AS} -o ${ASFLAGS} $< -o $@ ${LIBRARIES}
|
|
@echo
|
|
|
|
${BIN}/%.o : ${SRC}/%.s
|
|
@echo -e '\e[35;1m ==== compiling $^ ====\e[0m'
|
|
${DIR_GUARD}
|
|
${AS} -o ${ASFLAGS} $< -o $@ ${LIBRARIES}
|
|
@echo
|
|
|
|
# --- remove generated files
|
|
clean:
|
|
-rm -rf ${BIN}/*
|
|
|
|
-include ${DEPEND_FILES}
|
|
|