MAKE=make
DEFNS=	"SIMDIR=$(SIMDIR)" "CC=$(CC)" "LD=$(LD)" "MAKE=$(MAKE)" \
	"DTYPE=$(DTYPE)" "SIMLD=$(SIMLD)" "SIMCC=$(SIMCC)" "BINDIR=$(BINDIR)" \
	"SRCDIR=$(SRCDIR)" "XUSRLIBDIR=$(XUSRLIBDIR)" "XINCROOT=$(XINCROOT)" \
	"INSTALL=$(INSTALL)" "NM=$(NM)"

#				 include directory
IDIR = ${SRCDIR}/include
#				 release directory
RELDIR = ${SRCDIR}/lib
#				 where junk files go
TMP_DIR = /tmp
#
#
FUNC_NAMES_PREFIX = ${TMP_DIR}/func_names
#				 4 $'s for escape purposes yields 2 $'s to shell yields pid
FUNC_NAMES_FILE = ${FUNC_NAMES_PREFIX}$$$$.nm	
#
#				 flags used when building release ver
#				 all I want is -DXX='"WHATEVER"'
FLAGS= $(CFLAGS) -DCC='"'"'"$(SIMCC)"'"'"' -DLD='"'"'"$(SIMLD)"'"'"' -DNM='"'"'"$(NM)"'"'"' -I$(IDIR)
#
#
RFLAGS= $(FLAGS) -DSIMINC='"'"'"$(SIMDIR)"'"'"' -O
#
#				 flags used when building testing ver
#
TFLAGS = $(FLAGS) -DSIMINC='"'"'"$(SRCDIR)"'"'"' -g

RFILES = chkpoint.o \
	 commoncmds.o \
	 conunicmds.o \
	 debug.o \
	 display.o \
	 dynamic.o \
	 execution.o \
	 files.o \
	 globals.o \
	 load.o \
	 main.o \
	 make.o \
	 names.o \
	 nametable.o \
	 sets.o \
	 simunicmds.o \
	 time.o
TFILES = chkpoint.go \
	 commoncmds.go \
	 conunicmds.go \
	 debug.go \
	 display.go \
	 dynamic.go \
	 execution.go \
	 files.go \
	 globals.go \
	 load.go \
	 main.go \
	 make.go \
	 names.go \
	 nametable.go \
	 sets.go \
	 simunicmds.go \
	 time.go

all: int float main delay fdelay

debug:
	${MAKE} ${MFLAGS} ${DTYPE} ${DEFNS}

# next few rules recursively call this makefile with CFLAGS properly set

main:
	${MAKE} $(MFLAGS) mainline CFLAGS="$(RFLAGS)" MAIN_NAME='simalone' ${DEFNS}

int:
	${MAKE} $(MFLAGS) release CFLAGS="$(RFLAGS)" SIM_NAME='sim' ${DEFNS}

test-int:
	${MAKE} $(MFLAGS) maketest CFLAGS="$(TFLAGS)" SIM_NAME='sim' ${DEFNS}

float:
	${MAKE} $(MFLAGS) release CFLAGS="$(RFLAGS) -DFSIM" SIM_NAME='simf' ${DEFNS}

test-float:
	${MAKE} $(MFLAGS) maketest CFLAGS="$(TFLAGS) -DFSIM" SIM_NAME='simf' ${DEFNS}

delay:
	${MAKE} $(MFLAGS) release CFLAGS="$(RFLAGS) -DTSIM" SIM_NAME='tsim' ${DEFNS}

test-delay:
	${MAKE} $(MFLAGS) maketest CFLAGS="$(TFLAGS) -DTSIM" SIM_NAME='tsim' ${DEFNS}

fdelay:
	${MAKE} $(MFLAGS) release CFLAGS="$(RFLAGS) -DTSIM -DFSIM" SIM_NAME='tsimf' ${DEFNS}

test-fdelay:
	${MAKE} $(MFLAGS) maketest CFLAGS="$(TFLAGS) -DTSIM -DFSIM" SIM_NAME='tsimf' ${DEFNS}

# previous few rules recursively call this makefile with CFLAGS properly set

mainline: simain.o
	 cp simain.o $(RELDIR)/${MAIN_NAME}.o

maketest: $(TFILES) 
	@echo "finding command names for uniprocessor version"
	rm -f ${FUNC_NAMES_FILE}
	$(NM) -g commoncmds.go simunicmds.go conunicmds.go >> ${FUNC_NAMES_FILE};\
	${SRCDIR}/bin/grabnames ${SRCDIR}/lib/libsim.a \
		< ${FUNC_NAMES_FILE} | \
		${SRCDIR}/bin/cmdmkbind ${FUNC_NAMES_PREFIX}
	(cd $(TMP_DIR); $(CC) ${CFLAGS} -c ${FUNC_NAMES_PREFIX}.bind.c ) ;
	@echo "combining object files"
	$(LD) -r -o ${SIM_NAME}g.o $(TFILES) ${FUNC_NAMES_PREFIX}.bind.o
	@echo "made uniprocessor development version ok"

release: ${SIM_NAME}.o
	cp $(SIM_NAME).o $(RELDIR)/${SIM_NAME}.o

sim.o tsim.o simf.o tsimf.o: makerel

makerel: $(RFILES) 
	rm -f ${FUNC_NAMES_FILE}
	$(NM) -g commoncmds.o simunicmds.o conunicmds.o >> ${FUNC_NAMES_FILE}; \
	${SRCDIR}/bin/grabnames \
		${SRCDIR}/lib/libsim.a < ${FUNC_NAMES_FILE} | \
		${SRCDIR}/bin/cmdmkbind ${FUNC_NAMES_PREFIX}
	(cd $(TMP_DIR); $(CC) -c $(CFLAGS) ${FUNC_NAMES_PREFIX}.bind.c )
	$(LD) -r -o $(SIM_NAME).o $(RFILES) ${FUNC_NAMES_PREFIX}.bind.o
	rm -f $(RFILES) ${FUNC_NAMES_PREFIX}.bind.* ${FUNC_NAMES_FILE}

.SUFFIXES: .go .c

.c.go:
	$(CC) ${CFLAGS} -c $*.c
	mv $*.o $*.go

.c.o:
	$(CC) ${CFLAGS} -c $*.c

clean:  tidy 
	rm -f *.o *.go

tidy:
	rm -f ${FUNC_NAMES_PREFIX}* *~ \#*
