Files
collection/examples/make/computer-engineering/root.mk
T
2026-06-11 13:26:01 +02:00

188 lines
4.2 KiB
Makefile

SHELL := /usr/bin/env bash
PREFIX := arm-none-eabi-
CC := $(PREFIX)gcc
COPY := $(PREFIX)objcopy
SIZE := $(PREFIX)size
GDB := $(PREFIX)gdb
OCD := openocd
NAME := application
OPT_LEVEL_CC := -g \
-O0
TARGET_FLAGS := -mcpu=cortex-m4 \
-mthumb \
-mfpu=fpv4-sp-d16 \
-mfloat-abi=hard
WG := -Wall \
-Wextra \
-Wpedantic \
-Werror
WCC := -Wconversion \
-Wsign-conversion \
-Wsign-compare \
-Wcast-align=strict \
-Wfloat-equal \
-Wlogical-op
AS_FLAGS := $(TARGET_FLAGS) \
$(OPT_LEVEL_CC) \
$(VERB_LEVEL) \
$(WG) \
-Wa,-a,-ad,-alms=$(BIN_DIR)/$(NAME).lst \
-x assembler-with-cpp
C_DEF := $(addprefix -D, $(C_DEF))
C_INC := $(addprefix -I, $(C_INC))
C_FLAGS := $(TARGET_FLAGS) \
$(OPT_LEVEL_CC) \
$(VERB_LEVEL) \
$(WG) \
$(WCC) \
-Wa,-a,-ad,-alms=$(BIN_DIR)/$(NAME).lst \
$(C_DEF) \
$(C_INC)
FLAGS_FILE := ./compile_flags.txt
LST_DIR := $(BIN_DIR)/list-files
LIBCTBOARD := $(LIB_DIR)/lib/libctboard.a
LIB_PATHS += $(LIB_DIR)/lib
LIB_NAMES += ctboard
LINKER_FLAGS := $(TARGET_FLAGS) \
-static \
-nostartfiles \
$(addprefix -L, $(LIB_PATHS)) \
-lm \
-lnosys \
-Wl,--start-group \
$(addprefix -l, $(LIB_NAMES)) \
-Wl,--end-group \
-specs=nosys.specs \
-specs=nano.specs \
-Wl,-Map,$(BIN_DIR)/$(NAME).map \
-Wl,-e,Reset_Handler \
-Wl,--gc-sections
LD_SCRIPT := $(LIB_DIR)/lib/linker-script.ld
GDB_INIT := $(COMMON_DIR)/.gdbinit
OCD_CONFIG := $(COMMON_DIR)/openocd.cfg
OBJ := $(addprefix $(OBJ_DIR)/, $(AS_SRC:.s=.o)) \
$(addprefix $(OBJ_DIR)/, $(C_SRC:.c=.o))
ELF := $(BIN_DIR)/$(NAME).elf
BIN := $(basename $(ELF)).bin
MKDIR := $(OBJ_DIR) \
$(BIN_DIR) \
$(LST_DIR)
VPATH := $(SRC_DIR)
.PHONY: all clean clean_all dbgsrv flash launchgdb rebuild test
all: $(LIBCTBOARD) $(MKDIR) $(BIN) $(FLAGS_FILE)
flash: $(MKDIR) $(BIN)
-$(OCD) -f $(OCD_CONFIG) \
-c "program $(BIN) verify exit 0x08000000"
dbgsrv: flash
-$(OCD) -f $(OCD_CONFIG) \
-c "gdb_port 4500" \
-c "init; reset run;"
launchgdb: $(ELF) $(BIN) $(GDB_INIT)
$(GDB) --command=$(GDB_INIT) $<
$(MKDIR):
mkdir -p $@
#
# The sections have to correspond with the
# sections defined in the linker script who
# are directed to be located in the flash
# memory area.
#
$(BIN): $(ELF)
$(COPY) --output-target=binary \
-j .isr_vector \
-j .stack \
-j .heap \
-j .text \
-j .my_code \
-j .my_const \
-j .my_var \
-j .rodata\
-j .ARM.extab \
-j .ARM \
-j .preinit_array \
-j .init_array \
-j .fini_array \
-j .data \
-j .ccmram \
-j .ARM.extab \
-j .ARM \
$< $@
chmod -x $@
@printf "\n"
$(ELF): $(OBJ)
$(CC) -o $@ $^ $(LINKER_FLAGS) -T $(LD_SCRIPT)
chmod -x $@
$(OBJ_DIR)/%.o: %.s
$(CC) \
$(AS_FLAGS) \
-Wa,-a,-ad,-alms=$(LST_DIR)/$*.lst \
-c $< \
-o $@
$(OBJ_DIR)/%.o: %.c
$(CC) \
$(C_FLAGS) \
-Wa,-a,-ad,-alms=$(LST_DIR)/$*.lst \
-c $< \
-o $@
$(LIBCTBOARD):
echo "$(LIB_DIR)"
make -C "$(LIB_DIR)" rebuild
# this is to satisfy clangd (lsp client)
$(FLAGS_FILE):
@echo "$(C_FLAGS)" | sed 's/ /\n/g' > $@
clean:
-rm -rf $(MKDIR) $(FLAGS_FILE)
clean_all:: clean
rebuild: clean all