Q           = @
RM          = rm -f
MAKE        = make
CC          = avr-gcc
OBC         = avr-objcopy
OBD         = avr-objdump
SIZ         = avr-size
AVRDUDE     = avrdude

DEVICE      = atmega32u4
F_CPU       = 16000000
PROGRAMMER  = avr109
PORT        = /dev/m32u4breakout*

FIRMWARE    = FIRMWARE

SRCS        = main.c
OBJS        = $(SRCS:.c=.o)

OBJ_DIR     = build

CFLAGS      = -Wall -Os -g
CFLAGS      += -I. -DF_CPU=$(F_CPU)
CFLAGS      += -mmcu=$(DEVICE)

LDFLAGS     = -Wl,--relax
LDFLAGS     += -Wl,-Map=$(OBJ_DIR)/$(FIRMWARE).MAP

all: $(OBJ_DIR)/$(FIRMWARE).HEX

$(OBJ_DIR)/$(FIRMWARE).HEX: $(OBJ_DIR)/$(FIRMWARE).ELF
	$(Q)printf "  OBJCOPY $(OBJ_DIR)/$(FIRMWARE).HEX\n"
	$(Q)$(OBC) -O ihex $(OBJ_DIR)/$(FIRMWARE).ELF $(OBJ_DIR)/$(FIRMWARE).HEX

$(OBJ_DIR)/$(FIRMWARE).ELF $(OBJ_DIR)/$(FIRMWARE).MAP: $(OBJ_DIR)/$(OBJS)
	$(Q)printf "  LD      $(OBJ_DIR)/$(FIRMWARE).ELF\n"
	$(Q)$(CC) $(LDFLAGS) $(OBJ_DIR)/$(OBJS) -o $(OBJ_DIR)/$(FIRMWARE).ELF
	$(SIZ) $(OBJ_DIR)/$(FIRMWARE).ELF

$(OBJ_DIR)/$(OBJS): $(SRCS)
	$(Q)printf "  CC      $(*).c\n"
	$(Q)$(CC) $(CFLAGS) -o $(OBJ_DIR)/$(OBJS) -c $(SRCS)

flash: all
	$(Q)printf "  FLASH   $(OBJ_DIR)/$(FIRMWARE).HEX\n"
	$(Q)$(AVRDUDE) -c $(PROGRAMMER) -p $(DEVICE) -P $(PORT) -U flash:w:$(OBJ_DIR)/$(FIRMWARE).HEX

clean:
	$(Q)printf "  CLEAN\n"
	$(Q)$(RM) $(OBJ_DIR)/$(OBJS)

deepclean: clean
	$(Q)$(RM) $(OBJ_DIR)/$(FIRMWARE).*
