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

DEVICE				= atmega32u4
F_CPU					= 16000000
PROGRAMMER		= stk500v2
PORT          = /dev/mysmart*

FIRMWARE			= FIRMWARE

U8GDIR        = ./lib/u8glib

SRCS					= $(shell ls *.c 2>/dev/null)
SRCS    			+= $(shell ls $(U8GDIR)/*.c 2>/dev/null)
OBJS					= $(SRCS:.c=.o)

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

LDFLAGS				= -mmcu=$(DEVICE) -Wl,--relax
LDFLAGS				+= -Wl,-Map=$(FIRMWARE).MAP

all: $(FIRMWARE).HEX

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

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

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

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

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

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