#
# Makefile
#
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: 2026 Zeepunt

Q := @

ifeq ($(V),1)
	quiet =
	cmd = $(cmd_$(1))
else
	quiet = quiet_
	cmd = $(Q)$(if $(quiet_cmd_$(1)),echo '  $(quiet_cmd_$(1))' &&) $(cmd_$(1))
endif

BUILD_DIR := build

TARGET    := main

CC_PREFIX := arm-none-eabi-
AS        := $(CC_PREFIX)as
CC        := $(CC_PREFIX)gcc
LD        := $(CC_PREFIX)ld
NM        := $(CC_PREFIX)nm
AR        := $(CC_PREFIX)ar
OBJCOPY   := $(CC_PREFIX)objcopy
OBJDUMP   := $(CC_PREFIX)objdump
SIZE      := $(CC_PREFIX)size
STRIP     := $(CC_PREFIX)strip

LD_SCRIPT_IN := link.ld.in
LD_SCRIPT    := $(BUILD_DIR)/link.ld

ELF := $(BUILD_DIR)/$(TARGET).elf
BIN := $(BUILD_DIR)/$(TARGET).bin
MAP := $(BUILD_DIR)/$(TARGET).map

CPU := 	\
	-mcpu=cortex-m4 \
	-mthumb \
	-mfpu=fpv4-sp-d16 \
	-mfloat-abi=hard

CFLAGS := \
	$(CPU) \
	-std=c11

CFLAGS += \
	-fdata-sections \
	-ffunction-sections

CFLAGS += \
	-DUSE_HAL_DRIVER \
	-DSTM32L475xx

LDFLAGS := \
	$(CPU) \
	-T$(LD_SCRIPT) \
	--specs=nano.specs \
	--specs=nosys.specs \
	-Wl,--gc-sections \
	-Wl,-Map=$(MAP) \
	-Wl,--print-memory-usage

LDLIBS :=

INCLUDES := \
	-Icmsis \
	-Icmsis/m-profile \
	-Icmsis-device-l4/include \
	-Istm32l4xx-hal-driver/include \
	-Istm32l4xx-hal-driver/include/Legacy \
	-I.

SOURCES := \
	cmsis-device-l4/source/system_stm32l4xx.c \
	stm32l4xx-hal-driver/source/stm32l4xx_hal.c \
	stm32l4xx-hal-driver/source/stm32l4xx_hal_cortex.c \
	stm32l4xx-hal-driver/source/stm32l4xx_hal_flash.c \
	stm32l4xx-hal-driver/source/stm32l4xx_hal_flash_ex.c \
	stm32l4xx-hal-driver/source/stm32l4xx_hal_flash_ramfunc.c \
	stm32l4xx-hal-driver/source/stm32l4xx_hal_gpio.c \
	stm32l4xx-hal-driver/source/stm32l4xx_hal_pwr.c \
	stm32l4xx-hal-driver/source/stm32l4xx_hal_pwr_ex.c \
	stm32l4xx-hal-driver/source/stm32l4xx_hal_rcc.c \
	stm32l4xx-hal-driver/source/stm32l4xx_hal_rcc_ex.c \
	startup.c \
	main.c

OBJS := $(patsubst %.c,$(BUILD_DIR)/%.o,$(SOURCES))

quiet_cmd_cc = CC      $<
cmd_cc       = $(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<

quiet_cmd_ld = LD      $(TARGET)
cmd_ld       = $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

quiet_cmd_bin = OBJCOPY $(BIN)
cmd_bin       = $(OBJCOPY) -O binary $< $@

quiet_cmd_size = SIZE    $(TARGET)
cmd_size       = $(SIZE) $@

PHONY :=
PHONY += all
all: $(ELF) $(BIN)

$(LD_SCRIPT): $(LD_SCRIPT_IN) | $(BUILD_DIR)
	$(Q)$(CC) -E -P -x c -I. $(LD_SCRIPT_IN) -o $@

$(ELF): $(OBJS) $(LD_SCRIPT)
	$(call cmd,ld)

$(BIN): $(ELF)
	$(call cmd,bin)

$(BUILD_DIR)/%.o: %.c | $(BUILD_DIR)
	$(Q)mkdir -p $(dir $@)
	$(call cmd,cc)

$(BUILD_DIR):
	$(Q)mkdir -p $(BUILD_DIR)

PHONY += clean
clean:
	$(Q)rm -rf $(BUILD_DIR)

PHONY += run
run: $(BINARY)
	$(Q)$(BINARY)

PHONY += size
size: $(ELF)
	$(SIZE) $(ELF)

.PHONY: $(PHONY)
