#
# Prozessor ATmega128
#
MCU = atmega128

#
# Output Format INTEL Hex
#
FORMAT = ihex

#
# Name der HEX Datei (ohne Endung).
#
TARGET = PicTest02

#
# Liste C Source Dateien (C Abhaengigkeiten werden automatisch erzeugt)
#
SRC = main.c uart128.c interrupt128.c startup.c timer.c glc.c

#
# List Assembler Dateien
#
ASRC =

#
# Optimierungslevel [0, 1, 2, 3, s].
#
# 0 = Optimierung deaktiviert
# s = Optimierung auf Programmspeicher
#
#  3 ist die beste Optimierung
#
OPT = 0


#
# Includepfade
# (Jeder Pfad muss durch ein Leerzeichen getrennt sein)
#
EXTRAINCDIRS =   ..\Include\


#
# Compiler Option fuer C Standard Level.
#
# c89     - "ANSI" C
# gnu89 - c89 plus GCC extensions
# c99     - ISO C99 standard (not yet fully implemented)
# gnu99 - c99 plus GCC extensions
#
CSTANDARD = -std=c89


# Compiler flags.
#  -g           generate debugging information
#  -O*:        optimization level
#  -f...:        tuning, see GCC manual and avr-libc documentation
#  -Wall      warning level
#  -Wa,      tell GCC to pass this to the assembler.
#  -adhlns  create assembler listing
CFLAGS = -g
CFLAGS += -O$(OPT)
CFLAGS += -Wall -Wstrict-prototypes
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)


# Assembler flags.
#  -Wa,       tell GCC to pass this to the assembler.
#  -ahlms     create listing
#  -gstabs    have the assembler create line number information; note that
#                 for use in COFF files, additional information about filenames
#                 and function names needs to be present in the assembler source
#                 files -- see avr-libc docs [FIXME: not yet described there]
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs


#
#Additional libraries.
#
# Minimalistic printf version
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min

# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
PRINTF_LIB =

# Minimalistic scanf version
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min

# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
SCANF_LIB =

MATH_LIB = -lm



# Linker flags.
#  -Wl,        tell GCC to pass this to linker.
#  -Map      create map file
#  --cref      add cross reference to  map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)



#####################################################################
#  Ab hier nichts mehr aendern                                                                                                             #
#####################################################################

#
# Verzeicnisse des GNU Compilers
#
DIRAVR = d:/elektronik/WinAvr
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = .
DIRLIB = $(DIRAVR)/avr/lib


#
# Define programs and commands.
#
SHELL = sh
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f
COPY = cp


#
# Ausgabe Meldungen im DOS Fenster
#
MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = --------  end  --------
MSG_SIZE_BEFORE = Size before:
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:


#
# Define all object files.
#
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)

#
# Define all listing files.
#
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)

#
# Compiler flags to generate dependency files.
#
GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d

#
# Combine all necessary flags and optional flags.
# Add target processor to flags.
#
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)


#
# Default target.
#
all: begin gccversion sizebefore build sizeafter finished end

# build: elf hex eep lss sym extcoff
build: elf hex lss sym extcoff

elf: $(TARGET).elf
hex: $(TARGET).hex
#
#  eep rausgenommen aus Prozess
#
# eep: $(TARGET).eep
#
lss: $(TARGET).lss
sym: $(TARGET).sym



# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
	@echo
	@echo $(MSG_BEGIN)

finished:
	@echo $(MSG_ERRORS_NONE)

end:
	@echo $(MSG_END)
	@echo

#
# Ausgabe Meldungen im DOS Fenster
#
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf
sizebefore:
	@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi

sizeafter:
	@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi


#
# Ausgabe Compiler Version im DOS Fenster
#
gccversion :
	@$(CC) --version


#
# Program the device.
#
#
#  eep rausgenommen aus Prozess
#
program: $(TARGET).hex # $(TARGET).eep
	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)



#
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
#
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000


coff: $(TARGET).elf
	@echo
	@echo $(MSG_COFF) $(TARGET).cof
	$(COFFCONVERT) -O coff-avr $< $(TARGET).cof


extcoff: $(TARGET).elf
	@echo
	@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
	$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof



# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
	@echo
	@echo $(MSG_FLASH) $@
	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@

#
# Rausgenommen aus Erstellung
#
# %.eep: %.elf
#	@echo
#	@echo $(MSG_EEPROM) $@
#	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
#	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@

# Create extended listing file from ELF output file.
%.lss: %.elf
	@echo
	@echo $(MSG_EXTENDED_LISTING) $@
	$(OBJDUMP) -h -S $< > $@

# Create a symbol table from ELF output file.
%.sym: %.elf
	@echo
	@echo $(MSG_SYMBOL_TABLE) $@
	$(NM) -n $< > $@

# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
	@echo
	@echo $(MSG_LINKING) $@
	$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)


# Compile: create object files from C source files.
%.o : %.c
	@echo
	@echo $(MSG_COMPILING) $<
	$(CC) -c $(ALL_CFLAGS) $< -o $@


# Compile: create assembler files from C source files.
%.s : %.c
	$(CC) -S $(ALL_CFLAGS) $< -o $@


# Assemble: create object files from assembler source files.
%.o : %.S
	@echo
	@echo $(MSG_ASSEMBLING) $<
	$(CC) -c $(ALL_ASFLAGS) $< -o $@



# Target: clean project.
clean: begin clean_list finished end

clean_list :
	@echo
	@echo $(MSG_CLEANING)
	$(REMOVE) $(TARGET).hex
	$(REMOVE) $(TARGET).eep
	$(REMOVE) $(TARGET).obj
	$(REMOVE) $(TARGET).cof
	$(REMOVE) $(TARGET).elf
	$(REMOVE) $(TARGET).map
	$(REMOVE) $(TARGET).obj
	$(REMOVE) $(TARGET).a90
	$(REMOVE) $(TARGET).sym
	$(REMOVE) $(TARGET).lnk
	$(REMOVE) $(TARGET).lss
	$(REMOVE) $(OBJ)
	$(REMOVE) $(LST)
	$(REMOVE) $(SRC:.c=.s)
	$(REMOVE) $(SRC:.c=.d)
	$(REMOVE) .dep/*



# Include the dependency files.
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)


# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff \
clean clean_list program









