#*******************************************************************
#* Makefile for MSII
#*
#* COPYRIGHT: Philip L Johnson 2004
#* This header must appear on all derivatives of this file.
#*
#*******************************************************************
# Extended for MS2/Extra by Ken Culver and James Murray  2006
# $Id: Makefile,v 1.61 2013/09/16 19:28:17 jsmcortina Exp $
# combined Makefile.ms2 and Makefile.us back into one

#BINDIR:=$(shell ls /usr/bin/m9s12x-elf-gcc c:/usr/bin/m9s12x-elf-gcc `which m9s12x-elf-gcc` | head -1 |  sed -e's,m9s12x-elf-gcc,,g' 2> /dev/null)
BINDIR:=$(shell ls /usr/bin/m68hc11-elf-gcc c:/usr/bin/m68hc11-elf-gcc `which m68hc11-elf-gcc` | head -1 |  sed -e's,m68hc11-elf-gcc,,g' 2> /dev/null)
#BINDIR needs to point to the directory where your cross-compiler tools are installed
#e.g. you may uncomment the line below and comment the line above
#BINDIR=/usr/bin/

#PROGPREF=$(BINDIR)m9s12x-elf-
PROGPREF=$(BINDIR)m68hc11-elf-

CC      = $(PROGPREF)gcc
OBJCOPY = $(PROGPREF)objcopy
OBJDUMP = $(PROGPREF)objdump
NM      = $(PROGPREF)nm

CFLAGS  = -g -Wall -Werror -Wsign-compare -Wshadow -O -fomit-frame-pointer -m68hcs12 -mshort -msoft-reg-count=5 -mauto-incdec -fsigned-char

LDFLAGS = -Wl,-defsym,vectors_addr=0xff80,-m,m68hc12elfb,-T,m68hc12elfb.x,--no-trampoline

CSRCS=ms2_extra_main.c ms2_extra_can.c ms2_extra_can_isr.c ms2_extra_ego.c ms2_extra_ign.c ms2_extra_ign_wheel.c\
      ms2_extra_misc.c \
      premain.c ms2_extra_init.c sigs.c ms2_extra_ign_in.c ms2_extra_inj.c \
      ms2_extra_idle.c ms2_extra_user.c serial.c

ASRCS=msii_flash_gcc.s ms2_sermon.s ms2_conferr.s ms2_extra_burner.s \
      isr_inj.s isr_sci.s isr_rtc.s ms2_extra_asm.s \
      isr_timerovf.s isr_ign.s crc32.s interp.s

OBJS=$(CSRCS:.c=.o)
AOBJS= $(ASRCS:.s=.o)

all:	megasquirt   # default is to build for ms2 platform

both: clean_uniq megasquirt clean_uniq_microsquirt microsquirt clean_uniq_microsquirtmodule microsquirtmodule clean_uniq_mspnp2 mspnp2

megasquirt:
	$(MAKE) make_megasquirt2
microsquirt:
	$(MAKE) make_microsquirt
microsquirtmodule:
	$(MAKE) make_microsquirtmodule
mspnp2:
	$(MAKE) make_mspnp2

#aliases
us: microsquirt
ms2: megasquirt

make_megasquirt2:	setmegasquirt megasquirt2.dmp megasquirt2.elf megasquirt2.s19
make_microsquirt:	setmicrosquirt microsquirt.dmp microsquirt.elf microsquirt.s19
make_microsquirtmodule:	setmicrosquirtmodule microsquirtmodule.dmp microsquirtmodule.elf microsquirtmodule.s19
make_mspnp2:	setmspnp2 mspnp2.dmp mspnp2.elf mspnp2.s19

#in order to safely build both targets, be sure to remove existing object code first
setmegasquirt:
	echo '// setup for Megasquirt' > us_opt_c.h
	echo '; setup for Megasquirt' > us_opt_asm.inc
	grep -v "^#[12345]" ms2extra.ini | sed 's/^#0//' > megasquirt2.ini

setmicrosquirt:
	echo '#define MICROSQUIRT' > us_opt_c.h
	echo '.set MICROSQUIRT, 1' > us_opt_asm.inc
	grep -v "^#[02345]" ms2extra.ini | sed 's/^#1//' > microsquirt.ini

setmicrosquirtmodule:
	echo '#define MICROSQUIRT' > us_opt_c.h
	echo '#define MICROSQUIRTMODULE' >> us_opt_c.h
	echo '.set MICROSQUIRT, 1' > us_opt_asm.inc
	echo '.set MICROSQUIRTMODULE, 1' >> us_opt_asm.inc
	grep -v "^#[01345]" ms2extra.ini | sed 's/^#2//' > microsquirt-module.ini

setmspnp2:
	echo '#define MICROSQUIRT' > us_opt_c.h
	echo '#define MICROSQUIRTMODULE' >> us_opt_c.h
	echo '#define MSPNP2' >> us_opt_c.h
	echo '.set MICROSQUIRT, 1' > us_opt_asm.inc
	echo '.set MICROSQUIRTMODULE, 1' >> us_opt_asm.inc
	echo '.set MSPNP2, 1' >> us_opt_asm.inc
	grep -v "^#[01245]" ms2extra.ini | sed 's/^#3//' > mspnp2.ini

ms2_extra_main_vars.h:
	echo "/* DO NOT EDIT - this file is automatically generated during build */" > ms2_extra_main_vars.h
	cat ms2_extra_vars.h | sed 's/extern //' | grep -v "^#" >> ms2_extra_main_vars.h

ms2_extra_defines.inc:
	echo "; DO NOT EDIT - this file is automatically generated during build" > ms2_extra_defines.inc
	grep "^#define" ms2_extra_vars.h | awk '{print ".equ",$$2,",",$$3};' >> ms2_extra_defines.inc

ms2_extra_defines.h:
	echo "/* DO NOT EDIT - this file is automatically generated during build */" > ms2_extra_defines.h
	grep "^#define" ms2_extra_vars.h >> ms2_extra_defines.h

release: clean both
	rm -rf release
	mkdir release
	cp megasquirt2.ini megasquirt2.s19 microsquirt.s19 microsquirt.ini microsquirt-module.s19 microsquirt-module.ini mspnp2.s19 mspnp2.ini README.txt LICENSE.txt RELEASE-NOTES.txt release
	echo "** If you are running this from the zip, copy the loaders into the 'utils' subdir **"
	cp utils/ms2loader_linux32bit utils/ms2loader_linux64bit utils/ms2loader_macos utils/ms2loader_win32.exe release
	# Make sure you updated sigs.c

.PHONY: clean
clean:
	$(RM) -rf release *~
	$(MAKE) clean_all

CLEANARGS=ms2_extra_ign.o ms2_extra_ign_in.o ms2_extra_init.o ms2_extra_misc.o isr_ign.o isr_inj.o isr_rtc.o ms2_extra_main.o ms2_extra_idle.o ms2_extra_inj.o sigs.o  ms2_extra_defines.h ms2_extra_defines.inc ms2_extra_main_vars.h

.PHONY: clean_uniq     # delete the object files that contain MS2 vs. MICROSQUIRT dependencies
clean_uniq:
	$(RM) -f $(CLEANARGS)

.PHONY: clean_uniq_microsquirt     # delete the object files that contain MS2 vs. MICROSQUIRT dependencies (different name so it gets called again)
clean_uniq_microsquirt:
	$(RM) -f $(CLEANARGS)

.PHONY: clean_uniq_microsquirtmodule     # delete the object files that contain MS2 vs. MICROSQUIRT dependencies (different name so it gets called again)
clean_uniq_microsquirtmodule:
	$(RM) -f $(CLEANARGS)

.PHONY: clean_uniq_mspnp2     # delete the object files that contain MS2 vs. MICROSQUIRT dependencies (different name so it gets called again)
clean_uniq_mspnp2:
	$(RM) -f $(CLEANARGS)

PHONY: clean_all
clean_all:
	$(RM) -f megasquirt2.elf microsquirt.elf microsquirt-module.elf mspnp2.elf
	$(RM) -f megasquirt2.s19 microsquirt.s19 microsquirt-module.s19 mspnp2.s19
	$(RM) -f megasquirt2.dmp microsquirt.dmp microsquirt-module.dmp mspnp2.dmp
	$(RM) -f megasquirt2.map microsquirt.map microsquirt-module.map mspnp2.map
	$(RM) -f megasquirt2.ini microsquirt.ini microsquirt-module.ini mspnp2.ini
	$(RM) -f $(OBJS) $(AOBJS)
	$(RM) -f us_opt_c.h
	$(RM) -f us_opt_asm.inc ms2_extra_defines.h ms2_extra_defines.inc ms2_extra_main_vars.h

$(AOBJS): %.o: %.s
	$(CC) $(CFLAGS) -c $<

$(OBJS): %.o: %.c cltfactor.inc egofactor.inc matfactor.inc hcs12def.h flash.h ms2_extra.h ms2_extra_defines.h ms2_extra_defines.inc ms2_extra_main_vars.h
	$(CC) $(CFLAGS) -c $<

OBJCOPYARGS=--output-target=srec \
	--only-section=.text3 \
	--only-section=.rodata \
    --only-section=.vectors \
    --only-section=.eeprom \
	--only-section=.lookup --change-section-lma .lookup=0x3Ca400 \
	--only-section=.text3c --change-section-lma .text3c=0x3C8000 \
	--only-section=.text3d --change-section-lma .text3d=0x3D8000 \
	--only-section=.text3b --change-section-lma .text3b=0x3B8000 \
	--only-section=.text3a --change-section-lma .text3a=0x3A8000 \
	--only-section=.text39 --change-section-lma .text39=0x398000 \
	--only-section=.text38 --change-section-lma .text38=0x388000 \
	--only-section=.lookup \
	--only-section=.text
#ms2
megasquirt2.elf:	$(OBJS)  $(AOBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) -o megasquirt2.elf $(OBJS) $(AOBJS)

megasquirt2.s19: megasquirt2.elf
	$(OBJCOPY) $(OBJCOPYARGS) megasquirt2.elf megasquirt2.s19
	$(NM) megasquirt2.elf | sort > megasquirt2.map

megasquirt2.dmp: megasquirt2.elf
	 $(OBJDUMP) -Sdh megasquirt2.elf > megasquirt2.dmp
#microsquirt
microsquirt.elf:	$(OBJS)  $(AOBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) -o microsquirt.elf $(OBJS) $(AOBJS)

microsquirt.s19: microsquirt.elf
	$(OBJCOPY) $(OBJCOPYARGS) microsquirt.elf microsquirt.s19
	$(NM) microsquirt.elf | sort > microsquirt.map

microsquirt.dmp: microsquirt.elf
	 $(OBJDUMP) -Sdh microsquirt.elf > microsquirt.dmp
#microsquirtmodule
microsquirtmodule.elf:	$(OBJS)  $(AOBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) -o microsquirt-module.elf $(OBJS) $(AOBJS)

microsquirtmodule.s19: microsquirtmodule.elf
	$(OBJCOPY) $(OBJCOPYARGS) microsquirt-module.elf microsquirt-module.s19
	$(NM) microsquirt-module.elf | sort > microsquirt-module.map

microsquirtmodule.dmp: microsquirtmodule.elf
	 $(OBJDUMP) -Sdh microsquirt-module.elf > microsquirt-module.dmp
#mspnp2
mspnp2.elf:	$(OBJS)  $(AOBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) -o mspnp2.elf $(OBJS) $(AOBJS)

mspnp2.s19: mspnp2.elf
	$(OBJCOPY) $(OBJCOPYARGS) mspnp2.elf mspnp2.s19
	$(NM) mspnp2.elf | sort > mspnp2.map

mspnp2.dmp: mspnp2.elf
	 $(OBJDUMP) -Sdh mspnp2.elf > mspnp2.dmp

