TARGET := mspm0c1103
BUILD := build

SDK ?= ../sdk

LDSCRIPT := $(SDK)/source/ti/devices/msp/m0p/linker_files/gcc/mspm0c1103.lds

STARTUP := $(SDK)/source/ti/devices/msp/m0p/startup_system_files/gcc/startup_mspm0c110x_gcc.c

CC := arm-none-eabi-gcc
OBJCOPY := arm-none-eabi-objcopy
OBJDUMP := arm-none-eabi-objdump
SIZE := arm-none-eabi-size

CPUFLAGS += -mcpu=cortex-m0plus -mthumb

DEFINES += -D__MSPM0C1103__

INCLUDES += \
	-I$(SDK)/source \
	-I$(SDK)/source/third_party/CMSIS/Core/Include
	
CFLAGS := \
	$(CPUFLAGS) \
	$(INCLUDES) \
	$(DEFINES) \
	-ffunction-sections \
	-fdata-sections \
	-fno-common \
	-fno-strict-aliasing \
	-Wall \
	-Wextra \
	-Werror=return-type \
	-Os
	-std=c11 \
	-MMD \
	-MP \
	-g

LDFLAGS := \
	$(CPUFLAGS) \
	-T$(LDSCRIPT) \
	-Wl,--gc-sections \
	-Wl,--print-memory-usage \
	-Wl,-Map=$(BUILD)/$(TARGET).map

LIBS := \
	--specs=nano.specs \
	--specs=nosys.specs \
	-lm
	
# ----------------------------------------------------------------------------
# Sources
# ----------------------------------------------------------------------------

SOURCES := \
	src/main.c \
	$(STARTUP)

OBJECTS := $(patsubst %.c,$(BUILD)/%.o,$(SOURCES))
DEPS    := $(OBJECTS:.o=.d)

# ----------------------------------------------------------------------------
# Output files
# ----------------------------------------------------------------------------

ELF := $(BUILD)/$(TARGET).elf
HEX := $(BUILD)/$(TARGET).hex
BIN := $(BUILD)/$(TARGET).bin
LST := $(BUILD)/$(TARGET).lst

# ----------------------------------------------------------------------------
# Default target
# ----------------------------------------------------------------------------

.PHONY: all
all: $(ELF) $(HEX) $(BIN) $(LST)
	@echo
	@echo "Build complete."
	@$(SIZE) $(ELF)

# ----------------------------------------------------------------------------
# Link
# ----------------------------------------------------------------------------

$(ELF): $(OBJECTS) $(LDSCRIPT) $(DRIVERLIB)
	@mkdir -p $(dir $@)
	@echo "  LD    $@"
	$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@

# ----------------------------------------------------------------------------
# Intel HEX
# ----------------------------------------------------------------------------

$(HEX): $(ELF)
	@echo "  OBJCOPY $@"
	$(OBJCOPY) -O ihex $< $@

# ----------------------------------------------------------------------------
# Binary
# ----------------------------------------------------------------------------

$(BIN): $(ELF)
	@echo "  OBJCOPY $@"
	$(OBJCOPY) -O binary $< $@

# ----------------------------------------------------------------------------
# Disassembly
# ----------------------------------------------------------------------------

$(LST): $(ELF)
	@echo "  OBJDUMP $@"
	$(OBJDUMP) -d -S -C $< > $@

# ----------------------------------------------------------------------------
# Compile
# ----------------------------------------------------------------------------

$(BUILD)/%.o: %.c
	@mkdir -p $(dir $@)
	@echo "  CC    $<"
	$(CC) $(CFLAGS) -c $< -o $@
	
	# ----------------------------------------------------------------------------
# Release build
# ----------------------------------------------------------------------------

.PHONY: release
release:
	$(MAKE) DEBUG=0 all

# ----------------------------------------------------------------------------
# Debug build
# ----------------------------------------------------------------------------

.PHONY: debug
debug:
	$(MAKE) DEBUG=1 all

# ----------------------------------------------------------------------------
# Size
# ----------------------------------------------------------------------------

.PHONY: size
size: $(ELF)
	$(SIZE) -A $(ELF)
	@echo
	$(SIZE) $(ELF)

# ----------------------------------------------------------------------------
# Configuration information
# ----------------------------------------------------------------------------

.PHONY: info
info:
	@echo "Target:     $(TARGET)"
	@echo "SDK:        $(SDK)"
	@echo "Compiler:   $(CC)"
	@echo "Linker:     $(LDSCRIPT)"
	@echo "Startup:    $(STARTUP)"
	@echo "DriverLib:  $(DRIVERLIB)"
	@echo "Debug:      $(DEBUG)"

# ----------------------------------------------------------------------------
# Clean
# ----------------------------------------------------------------------------

.PHONY: clean
clean:
	rm -rf $(BUILD)

# ----------------------------------------------------------------------------
# Dependencies
# ----------------------------------------------------------------------------

-include $(DEPS)