CDK			=	$(shell dirname $(shell dirname $(shell which avr-gcc)))
CROSS		=	avr-
MCU			=	at90s8535
BOARD		=	avrctrl-8535-8mhz
TARGETNAME	=	ledband
CDEFS		=	
LDDEFS		=	


#--DON'T-TOUCH-ANY-FROM-HERE-----------------------------------------

CC			=	$(CDK)/bin/$(CROSS)gcc
AS			=	$(CDK)/bin/$(CROSS)gcc -x assembler-with-cpp
AR			=	$(CDK)/bin/$(CROSS)ar
OBJCP		=	$(CDK)/bin/$(CROSS)objcopy
OBJDMP		=	$(CDK)/bin/$(CROSS)objdump
SIZE		=	$(CDK)/bin/$(CROSS)size
RM			=	rm -rf
CAT			=	cat -sv
MCUOPTS		=	-mmcu=$(MCU)
COPTS		=	-g -O2 -Wall -Wstrict-prototypes -Wa,-ahlms=$(notdir $(<:.c=.lst))
CPFLAGS		=	$(COPTS) $(MCUOPTS) -DAVRHAL_CONFIG_$(subst -,_,$(BOARD)) $(CDEFS)
ASFLAGS		=	-Wa,-gstabs $(MCUOPTS)
LDFLAGS		=	-Wl,-Map=$(TARGETNAME).map,--cref $(MCUOPTS) $(LDDEFS)

ISP			=	$(CDK)/bin/isp
ISPOPTS		=	-lp0 -erase
ISPSUFIX	=	-rom.bin


LDLIBS		=	-lavrhal-$(BOARD)
LIBPARTS	=	
LIBPATH		=	


VPATH	=	$(LIBPATH):.

OBJ		=	$(notdir $(patsubst %.c, %.o, $(wildcard *.c)			\
				$(foreach f,$(LIBPARTS),							\
					$(wildcard $(LIBPATH)/$(f)*.c))))				\
			$(notdir $(patsubst %.s, %.o, $(wildcard *.s)			\
				$(foreach f,$(LIBPARTS),							\
					$(wildcard $(LIBPATH)/$(f)*.s))))				\
			$(notdir $(patsubst %.S, %.o, $(wildcard *.S)			\
				$(foreach f,$(LIBPARTS),							\
					$(wildcard $(LIBPATH)/$(f)*.S))))				\

ARC		=	$(addsuffix .a, $(TARGETNAME))
ELF		=	$(addprefix $(TARGETNAME), .out)
INFO	=	$(addprefix $(TARGETNAME), .inf .siz .lst .dmp)
TARGETS	=	$(addprefix $(TARGETNAME), -rom.bin -eep.bin			\
				-rom.hex -eep.hex -rom.s19 -eep.s19 .obj)

override CPFLAGS	+=	$(patsubst %,-I%,$(subst :, ,$(VPATH)))
override ASFLAGS	+=	$(patsubst %,-I%,$(subst :, ,$(VPATH)))

all: clean elf targets info

elf: $(ELF)
	@echo "---"

targets: $(TARGETS)
	@echo "---"

info: $(INFO)
	@echo "---"
	@$(CAT) *.siz
	@echo "---"


clean:
	@echo "--- remove object files:   " $(OBJ)
	@$(RM) $(OBJ)
	@echo "--- remove list files:     " $(OBJ:.o=.lst)
	@$(RM) $(OBJ:.o=.lst)
	@echo "--- remove archive file:   " $(ARC) "("$(ARC:.a=.map)")"
	@$(RM) $(ARC)
	@$(RM) $(ARC:.a=.map)
	@echo "--- remove elf32-avr file: " $(ELF)
	@$(RM) $(ELF)
	@echo "--- remove hex/bin targets:" $(TARGETS)
	@$(RM) $(TARGETS)
	@echo "--- remove elf32-avr infos:" $(INFO)
	@$(RM) $(INFO)
	@echo "---"
	@echo "---"
	@echo "---"

distclean: clean
	@echo "--- remove backup stuff"
	@$(RM) *~ *.bak *.old
	@echo "--- remove log files"
	@$(RM) *.log
	@echo "--- remove critical error files"
	@$(RM) core
	@echo "---"
	@echo "---"
	@echo "---"

prog: $(addsuffix $(ISPSUFIX), $(TARGETNAME))
	$(ISP) $(ISPOPTS) $<

.phony: all clean distclean prog

$(ARC): $(OBJ)
	@echo "--- build archive file                   " $@ "("$?")"
	@$(AR) rcs $@ $?
	@$(AR) -s $@

.SUFFIXES:
.SUFFIXES:	.c .i .s .S .o .a .out .obj								\
			-rom.bin -eep.bin -rom.hex -eep.hex -rom.s19 -eep.s19	\
			.inf .siz .lst .dmp

.c.o:
	@echo "--- build object file                    " $@ "("$<")"
	@$(CC) $(CPFLAGS) -c -o $@ $< >$(subst .o,.o.log,$@) 2>&1 || \
		( cat $(subst .o,.o.log,$@); exit 1)

.c.s:
	@echo "--- build assembler file                 " $@ "("$<")"
	@$(CC) $(CPFLAGS) -S -o $@ $< >$(subst .s,.s.log,$@) 2>&1 || \
		( cat $(subst .o,.s.log,$@); exit 1)

.s.o .S.o:
	@echo "--- build object file                    " $@ "("$<")"
	@$(AS) $(ASFLAGS) -c -o $@ $< >$(subst .o,.o.log,$@) 2>&1 || \
		( cat $(subst .o,.o.log,$@); exit 1)

.a.out:
	@echo "--- build elf32-avr file                 " $@ "("$<")"
	@$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS)

.out-rom.bin:
	@echo "--- build ROM in binary format into      " $@ "("$<")"
	@$(OBJCP) -O binary -R .eeprom $< $@

.out-eep.bin:
	@echo "--- build EEPROM in binary format into   " $@ "("$<")"
	@$(OBJCP) -j .eeprom --set-section-flags=.eeprom="alloc,load"	\
			  --change-section-lma .eeprom=0						\
			  -O binary $< $@

.out-rom.hex:
	@echo "--- build ROM in Intel hex format into   " $@ "("$<")"
	@$(OBJCP) -O ihex -R .eeprom $< $@

.out-eep.hex:
	@echo "--- build EEPROM in Intel hex format into" $@ "("$<")"
	@$(OBJCP) -j .eeprom --set-section-flags=.eeprom="alloc,load"	\
			  --change-section-lma .eeprom=0						\
			  -O ihex $< $@

.out-rom.s19:
	@echo "--- build ROM in Motorola format into    " $@ "("$<")"
	@$(OBJCP) -O srec -R .eeprom $< $@

.out-eep.s19:
	@echo "--- build EEPROM in Motorola format into " $@ "("$<")"
	@$(OBJCP) -j .eeprom --set-section-flags=.eeprom="alloc,load"	\
			  --change-section-lma .eeprom=0						\
			  -O srec $< $@

.out.obj:
	@echo "--- build AVR Studio object format into  " $@ "("$<")"
	-@$(OBJCP) -O avrobj -R .eeprom $< $@

.out.inf:
	@echo "--- build all header information into    " $@ "("$<")"
	@$(OBJDMP) -x $< > $@

.out.lst:
	@echo "--- build assembler mnemonics into       " $@ "("$<")"
	@$(OBJDMP) -D $< > $@

.out.dmp:
	@echo "--- build section dump information into  " $@ "("$<")"
	@$(OBJDMP) -s $< > $@

.out.siz:
	@echo "--- build size information into          " $@ "("$<")"
	@$(SIZE) -d $< > $@
	@echo >> $@
	@$(SIZE) -x $< >> $@

# Every thing below here is used by avrxtrl-lib's build system and can be ignored
# by the casual user.

FIG2DEV		= fig2dev
PNGTOPNM	= pngtopnm
PNMTOPNG	= pnmtopng

dox: eps png pdf

eps: $(TARGETNAME).eps
png: $(TARGETNAME).png
pdf: $(TARGETNAME).pdf

%.eps: %.fig
	$(FIG2DEV) -L eps $< $@

%.pdf: %.fig
	$(FIG2DEV) -L pdf $< $@

%.png: %.fig
	$(FIG2DEV) -L png $< $@
	$(PNGTOPNM) $@ > tmp.pnm
	$(PNMTOPNG) -transparent white tmp.pnm >$@ && rm tmp.pnm

dox_clean:
	$(RM) -f *.eps *.png *.pdf

#*************************************EndOfFile***************************
#$Id: $
vim:tw=78:ts=4:sw=4:ai:
#
