# ethersex project specific defaults, each can be overridden in config.mk
F_CPU = 20000000UL
MCU = atmega644

CC=avr-gcc
AR=avr-ar
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
AS = avr-as
CP = cp
RM = rm -f
AVRDUDE = avrdude
AVRDUDE_BAUDRATE = 115200
SIZE = avr-size
STRIP = avr-strip

HOSTCC := gcc
export HOSTCC

LIBS = -lm

# flags for the compiler
CFLAGS ?= -Wall -W -Wno-unused-parameter -Wno-sign-compare
CFLAGS += -g -Os -std=gnu99 -fgnu89-inline -D_XOPEN_SOURCE=600 -DNDEBUG

#############################################################################
#Settings for Simulator build

#ugly hack to define a newline (yes, there are two blank lines, on purpose!!)
define n


endef

OSTYPE = $(shell uname)
MACHINE = $(shell uname -m)

ifeq ($(findstring CYGWIN,$(OSTYPE)),CYGWIN)
	CFLAGS_SIM  = -g -Wall -pedantic -std=c99 -O0 -D_WIN32 -D_XOPEN_SOURCE=600
	ifeq ($(MACHINE),x86_64)
		LDFLAGS_SIM = -T ld_scripts/i386pep.x
	else
		ifeq ($(MACHINE),i686)
			LDFLAGS_SIM = -T ld_scripts/i386pe.x
		else
			$(warning $(n)$(n)Simulator build is only supported on i386 and amd64.$(n)$(n))
		endif
	endif
	LIBS_SIM = -lgdi32 -lwinmm -lm
else
	ifeq ($(OSTYPE),FreeBSD)
		CFLAGS_SIM = -g -I/usr/local/include -Wall -pedantic -std=c99 -O0
		CFLAGS_SIM += -D_XOPEN_SOURCE=600
		ifeq ($(MACHINE),amd64)
			LDFLAGS_SIM = -L/usr/local/lib -T ld_scripts/elf_x86_64_fbsd.x
		else
			ifeq ($(MACHINE),i386)
				LDFLAGS_SIM = -L/usr/local/lib -T ld_scripts/elf_i386_fbsd.x
			else
				$(warning $(n)$(n)Simulator build is only supported on i386 and amd64.$(n)$(n))
			endif
		endif
		LIBS_SIM = -lglut -lpthread -lGL -lGLU -lm
	else
		ifeq ($(OSTYPE),NetBSD)
			CFLAGS_SIM = -g -I /usr/pkg/include -I/usr/X11R7/include -Wall -pedantic -std=c99 -O0
			CFLAGS_SIM += -D_XOPEN_SOURCE=600
			ifeq ($(MACHINE),amd64)
				LDFLAGS_SIM = -L/usr/pkg/lib -L/usr/X11R7/lib -T ld_scripts/elf_x86_64_nbsd.x -Wl,-R/usr/pkg/lib,-R/usr/X11R7/lib
			else
				ifeq ($(MACHINE),i386)
					LDFLAGS_SIM = -L/usr/pkg/lib -L/usr/X11R7/lib -T ld_scripts/elf_i386_nbsd.x -Wl,-R/usr/pkg/lib,-R/usr/X11R7/lib
				else
					$(warning $(n)$(n)Simulator build is only supported on i386 and amd64.$(n)$(n))
				endif
			endif
			LIBS_SIM = -lglut -lpthread -lGL -lGLU -lm
		else
			ifeq ($(OSTYPE),OpenBSD)
				CFLAGS_SIM = -g -I/usr/local/include -I/usr/X11R6/include -Wall -pedantic -std=c99 -O0
				CFLAGS_SIM += -D_XOPEN_SOURCE=600
				ifeq ($(MACHINE),amd64)
					LDFLAGS_SIM = -L/usr/local/lib -L/usr/X11R6/lib -T ld_scripts/elf_x86_64_obsd.xd
				else
					ifeq ($(MACHINE),i386)
						LDFLAGS_SIM = -L/usr/local/lib -L/usr/X11R6/lib -T ld_scripts/elf_i386_obsd.xd
					else
						$(warning $(n)$(n)Simulator build is only supported on i386 and amd64.$(n)$(n))
					endif
				endif
				LIBS_SIM = -lglut -lpthread -lGL -lGLU -lm
			else
				ifeq ($(OSTYPE),Linux)
					CFLAGS_SIM  = -g -Wall -pedantic -std=c99 -O0 -D_XOPEN_SOURCE=600
					ifeq ($(MACHINE),x86_64)
						LDFLAGS_SIM = -T ld_scripts/elf_x86_64.x
					else
						ifeq ($(MACHINE),i686)
							LDFLAGS_SIM = -T ld_scripts/elf_i386.x
						else
							$(warning $(n)$(n)Simulator build is only supported on i386 and amd64.$(n)$(n))
						endif
					endif
					LIBS_SIM = -lglut -lpthread -lGL -lGLU -lm
				else
					($(warning $(n)$(n)Simulator build is not supported on your system.$(n)$(n)\
Currently supported platforms:$(n) \
Linux on i386 and amd64$(n) \
FreeBSD on i386 and amd64$(n) \
NetBSD on i386 and amd64$(n) \
Windows (via Cygwin) on i386 and amd64)
				endif
			endif
		endif
	endif
endif

##############################################################################
# the default target
$(TARGET):

##############################################################################
# include user's config.mk file

$(MAKETOPDIR)/config.mk:
	@echo "# Customize your config here!" >$@
	@echo "# Add further CFLAGS by using the += operator, eg." >>$@
	@echo "# CFLAGS += -mstrict-X" >>$@
	@echo "#" >>$@
	@echo "# In case you wonder: -mstrict-X produces smaller code, but" >>$@
	@echo "# is only available on avr-gcc 4.7.0 or higher." >>$@
	@echo "#" >>$@
	@echo "# Other flags you might want to tune: CPPFLAGS, LDFLAGS ..." >>$@
	@echo "Created default config.mk, tune your settings there!"

-include $(MAKETOPDIR)/config.mk

##############################################################################
# configure load address for bootloader, if enabled
#
ifneq ($(MAKECMDGOALS),clean)
	ifneq ($(MAKECMDGOALS),mrproper)
		ifneq ($(MAKECMDGOALS),menuconfig)  
			include $(MAKETOPDIR)/.config
			CPPFLAGS += -DF_CPU=$(FREQ)UL -mmcu=$(MCU)

			# flags for the linker, choose appropriate linker script
			ifeq ($(findstring atmega256,$(MCU)),atmega256)
				LDFLAGS += -T ld_scripts/avr6.x -Wl,-Map,image.map -mmcu=$(MCU)
			else
				ifeq ($(findstring atmega128,$(MCU)),atmega128)
					LDFLAGS += -T ld_scripts/avr51.x -Wl,-Map,image.map -mmcu=$(MCU)
				else
					LDFLAGS += -T ld_scripts/avr5.x -Wl,-Map,image.map -mmcu=$(MCU)
				endif
			endif
		endif # MAKECMDGOALS!=menuconfig
	endif # MAKECMDGOALS!=mrproper
endif # MAKECMDGOALS!=clean

ifeq ($(BOOTLOADER_SUPPORT),y)	
	LDFLAGS += -Wl,--section-start=.text=0xE000
	CFLAGS  += -mcall-prologues
endif


%.s: %.c
	$(CC) -o $@ -O0 $(CPPFLAGS) -S $<

%.E: %.c
	$(CC) -o $@ -O0 $(CPPFLAGS) -C -E -dD $<

