###############################################################################
#
#                                 Makefile
#
#   einfaches Makefile zum "builden" von HEX-Dateien fuer Atmel (c) AVR-
#   Mikrocontroller.
#
#   Benutzerdefinierte Angaben fuer:
#
#   PROJECT
#        Der Name des Hauptprogramms OHNE jegliche Erweiterung
#
#   OBJECTS
#        hier sind die zu erzeugenden Dateien anzugeben (Hauptprogramm
#        welches die Funktion Main enthaellt plus zusaetzliche Software-
#        module ohne weiteren "Trenner":
#
#        OBJECTS = ./serial_demo.o ./readint.o
#
#        hier muessen die Dateien serial_demo.c und readint.c vorhanden
#        sein
#
#   PRINT_FL / SCAN_FL
#        = 1 wenn Unterstuetzung fuer Gleitkommazahlen mittels printf / scanf
#            vorhanden sein soll.
#        = 0 ohne unterstuetzung
#
#   SCR_DIR
#        Suchverzeichnis, in dem zusaetzliche Programmmodule liegen
#
#   MCU
#        Name des zu verwendenden Mikrocontrollers
#
#   FREQUENCY
#        Taktfrequenz des Controllers, die Angabe hier ist gleichbedeutend
#        einem
#                 #define F_CPU frequenz
#        im C-Programm
#
#   SYS_OBJECTS
#        einzubindendes zu erstellendes Softwaremodul
#
#               SYS_OBJECTS = ../src/softwaremodul.o
#
#        hier muss der Quellcode softwaremodul.c vorhanden sein
#
#   MY_DEFINES
#        defines, wie sie in einem C-Programm angegeben wuerden mit zu-
#        saetzlich vorangestelltem "-D". (Somit sind die Defines in
#        allen Softwaremodulen verfuegbar)
#
#   PROGRAMMER / BAUD / PORT
#        gibt den Programmernamen, den Port und die Baudrate an, an den
#        ein Programmer angeschlossen ist.
#
#
#   Aufrufoption des Makefiles:
#        make oder make all : erstellt alle .o und Hexdateien
#        make compile       : compiliert nur das Hauptprogramm ohne weitere
#                             Bibliotheken
#        make clean         : loescht alle erstellten Dateien (sinnvoll,
#                             wenn Softwaremodule / Bibliotheken veraendert
#                             wurden)
#        make size          : zeigt die Groesse der erstellten Hex-Datei an
#        make flash         : flasht den Zielcontroller
#        make fuses         : setzt die angegebenen Fuses
#
#
#   September 2016,  R. Seelig
#
###############################################################################

##############       Benutzerinterface / Benutzereingaben     #################

PROJECT = serial_blank
OBJECTS = ./serial_blank.o
PRINTF_FL = 0
SCANF_FL  = 0
SRC_DIR = -I../src/

MCU =atmega8
FREQUENCY = 8000000ul

GCC_BIN =
SYS_OBJECTS =

MY_DEFINES =

INCLUDE_PATHS = -I. -I../include \
                $(SRC_DIR)

LIBRARY_PATHS =
LIBRARIES =

PROGRAMMER = usbasp
BAUD =
PORT =

# Fuses fuer ATmega8, interner Oszillator, 8MHz
FUSES_LO=0xd4
FUSES_HI=0xd9
FUSES_EXT=


######################      Ende Benutzerinterface     ########################

AS      = avr-as
CC      = avr-gcc
CPP     = avr-g++
LD      = avr-gcc
OBJCOPY = avr-objcopy
SIZE    = avr-size

CPU = -mmcu=$(MCU)
CC_SYMBOLS = -DF_CPU=$(FREQUENCY)
CC_SYMBOLS += $(MY_DEFINES)

CC_FLAGS = $(CPU) -Os -c

LD_FLAGS = $(CPU)

ifeq ($(PRINTF_FL), 1)
  LD_FLAGS += -Wl,-u,vprintf -lprintf_flt -lm
endif

ifeq ($(SCANF_FL), 1)
  LD_FLAGS += -Wl,-u,vscanf -lscanf_flt -lm
endif

LD_FLAGS += -Wl,-Map=$(PROJECT).map,--cref
LD_SYS_LIBS =


ifeq ($(DEBUG), 1)
  CC_FLAGS += -DDEBUG -O0
else
  CC_FLAGS += -DNDEBUG -Os
endif

.PHONY: all clean size compile flash fuses

all: $(PROJECT).bin $(PROJECT).hex size

compile:
	$(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $(PROJECT).o $(PROJECT).c


clean:
	rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)


.asm.o:

.c.o:
	$(CC)  $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o $@ $<

.cpp.o:
	$(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 $(INCLUDE_PATHS) -o $@ $<



$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS)
	$(LD) $(LD_FLAGS) $(LIBRARY_PATHS) -o $@ $^ $(LIBRARIES) $(LD_SYS_LIBS)


$(PROJECT).bin: $(PROJECT).elf
	$(OBJCOPY) -O binary $< $@

$(PROJECT).hex: $(PROJECT).elf
	@$(OBJCOPY) -O ihex $< $@

lst: $(PROJECT).lst

size: $(PROJECT).elf
	$(SIZE) $(PROJECT).elf

DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
-include $(DEPS)

flash:

	avrdude -c $(PROGRAMMER) -p $(MCU) -P $(PORT) -b $(BAUD) -U flash:w:$(PROJECT).hex

fuses:
	avrdude -c $(PROGRAMMER) -p $(MCU) -P $(PORT) -b $(BAUD) -B 10 -U lfuse:w:$(FUSES_LO):m -U hfuse:w:$(FUSES_HI):m
