AVRPATH = $(AVR8TOOLCHAINBINDIR)
DEVICE = atmega8
F_CPU = 8000000
FLASHADDRESS = 0x0000
PROGRAMMER = -c stk500v2
USB = USB0

ECHO=@echo
GCC=gcc
MAKE=@make
RM=@rm -f

CC=$(AVRPATH)avr-gcc
OBC=@$(AVRPATH)avr-objcopy
OBD=@$(AVRPATH)avr-objdump
SIZ=@$(AVRPATH)avr-size

AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)

MYCFLAGS = -Wall -Os -fno-move-loop-invariants -fno-tree-scev-cprop -fno-inline-small-functions -I. -mmcu=$(DEVICE) -DF_CPU=$(F_CPU) $(CFLAGS)   $(DEFINES)
MYLDFLAGS = -Wl,--relax,--gc-sections $(LDFLAGS)

FLASHPREAMBLEDEFINE = 
ifneq ($(FLASHADDRESS), 0)
ifneq ($(FLASHADDRESS), 00)
ifneq ($(FLASHADDRESS), 000)
ifneq ($(FLASHADDRESS), 0000)
ifneq ($(FLASHADDRESS), 00000)
ifneq ($(FLASHADDRESS), 0x0)
ifneq ($(FLASHADDRESS), 0x00)
ifneq ($(FLASHADDRESS), 0x000)
ifneq ($(FLASHADDRESS), 0x0000)
ifneq ($(FLASHADDRESS), 0x00000)
FLASHPREAMBLE = 0x0000
FLASHPREAMBLEDEFINE = -DFLASHPREAMBLE=$(FLASHPREAMBLE)
MYLDFLAGS += -Wl,--section-start=.text=$(FLASHADDRESS)
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif

all:  main.hex main.bin main.asm main.eep

lcd.o: lib/lcd.c lib/lcd.h
	$(CC) lib/lcd.c -c -o lcd.o -std=c99 $(MYCFLAGS)
	
simpleprog.o: lib/simpleprog.c lib/simpleprog.h
	$(CC) lib/simpleprog.c -c -o simpleprog.o -std=c99 -lm -lprintf_flt $(MYCFLAGS)
	
uart.o: lib/uart.c lib/uart.h
	$(CC) lib/uart.c -c -o uart.o -std=c99 -lm -lprintf_flt $(MYCFLAGS)

main.o: main.c
	$(CC) main.c -c -o main.o -std=c99 $(MYCFLAGS)

main.elf: main.o lcd.o simpleprog.o uart.o
	$(CC) main.o lcd.o simpleprog.o uart.o -o main.elf -lm -lprintf_flt $(MYCFLAGS) -Wl,-u,vfprintf,-Map,main.map $(MYLDFLAGS)
	$(ECHO) "."
	$(SIZ) main.elf
	$(ECHO) "."
	
main.eep:
	$(OBC) -j .eeprom -O ihex main.elf main.eep

main.hex: main.elf
	$(OBC) -j .text -j .data -O ihex main.elf main.hex

main.bin: main.elf
	$(OBC) -j .text -j .data -O binary main.elf main.bin

main.asm: main.elf
	$(OBD) -d main.elf > main.asm

disasm: main.elf
	$(OBD) -d main.elf

flash: main.hex
	$(ECHO) "."
	$(AVRDUDE) -P /dev/tty$(USB) -U flash:w:main.hex:i #-U eeprom:w:main.eep
	$(ECHO) "."

deepclean: clean
	$(RM) lib/*~
	$(RM) *~

clean:
	$(RM) *.o
	$(RM) *.s
	$(RM) main.hex
	$(RM) main.bin
	$(RM) main.asm
	$(RM) main.map
	$(RM) main.elf
	$(RM) main.eep
