# Destination for various compiler part
DST = /usr/local/lib/lmlc
# Destination for the front end, i.e. the visible program
DSTBIN = /usr/local
# Destination for all the special tools to compile the compiler
BIN = bin

OBJS =	version.o main.o misc/*.o \
	expr/*.o transform/*.o rename/*.o Expr/*.o \
	type/*.o llift/*.o Gcode/*.o zf/*.o curry/*.o \
	Gopt/*.o strict/*.o simpl/*.o mopt/*.o flic/*.o mcode/*.o
IOBJS = icomp.o imisc.o imain.o misc/*.o \
	expr/*.o transform/*.o rename/*.o Expr/*.o \
	type/*.o strict/*.o simpl/*.o zf/*.o curry/*.o
MSRC = main.m
# If you change the machine typ you should copy ${MTARGET}/machine.t to mcode/machine.t
MTARGET = m_sparc
OBJALL = ${OBJS} ${MTARGET}/*.o
COMP = lmlcomp
LMLC = lmlc
LMLFLAGS = -DDEBUG
MAKE = make
.SUFFIXES :
.SUFFIXES : .m .o

.m.o :
	${LMLC} -c ${LMLFLAGS} $<

${COMP}:	${OBJALL}
	${LMLC} ${OBJALL} -o ${COMP}

i:	$(IOBJS)
	${LMLC} ${IOBJS} -o i

imain.o:	imisc.o icomp.o

newvers:
	mv version.m version.m.old
	sed -e 's/.*DATE/"'"`date`"'" -- DATE/' version.m.old >version.m

clean:
	rm -f *.o ${COMP}

oosave:
	mv *.o saveoo
unosave:
	mv saveoo/*.o .
osave:
	mv *.o saveo
unsave:
	mv saveo/*.o .

countlines:
	wc ${MSRC}

count:
	${MAKE} MFLAGS=countlines all

# To get everything done: make universe
# It is impossible to make from scratch.  You must have a running lmlc, to
# recompile it (of course).
universe: myinstall rtime all nlmlc

# make all compiler parts
all:
	cd lib; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd misc; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd expr; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd transform; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd rename; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd Expr; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd simpl; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd type; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd llift; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd Gcode; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd mcode; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd mopt; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd Gopt; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd strict; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd flic; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd zf; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd curry; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS} 
	cd ${MTARGET}; ${MAKE} -k MTARGET=${MTARGET} ${MFLAGS}
	${MAKE} MTARGET=${MTARGET} ${MFLAGS}

# make the runtime system
rtime:
	cd runtime; ${MAKE} MTARGET=${MTARGET}

nlmlc:
	cd lmlc; ${MAKE}

installcomp:
	-mkdir ${DST} ${DST}/bin
	cp ${COMP} ${DST}/bin/lmlcomp
	strip ${DST}/bin/lmlcomp

install:	installcomp
	-mkdir ${DST} ${DST}/lib
	cd lmlc; ${MAKE} DSTBIN=${DSTBIN} install
	cd syntax; ${MAKE} DST=${DST} install
	cd runtime; ${MAKE} DST=${DST} install
	cd lib; ${MAKE} DST=${DST} install

myinstall:
	cd syntax; ${MAKE} myinstall
	cd ${MTARGET}; ${MAKE}
	cd masm; ${MAKE} MTARGET=${MTARGET} myinstall

fixtest: step1 step2

step1:
# install new compiler
#	rm -f PASS1 PASS2 DONE
	touch ${BIN}/lmlcomp
	mv ${BIN}/lmlcomp ${BIN}/lmlcomp.old
	mv ${COMP} ${BIN}/lmlcomp
#	touch PASS1
# clean up everything
	${MAKE} MTARGET=${MTARGET} MFLAGS=oosave all
# then make new object files
	time ${MAKE} MTARGET=${MTARGET} all

step2:
# save those
	${MAKE} MTARGET=${MTARGET} MFLAGS=osave all
# install the new compiler
	mv ${BIN}/lmlcomp ${COMP}.old
	mv ${COMP} ${BIN}/lmlcomp
#	touch PASS2
# and compile again
	time ${MAKE} MTARGET=${MTARGET} all
# restore old compiler
	mv ${BIN}/lmlcomp ${COMP}.1
	mv ${BIN}/lmlcomp.old ${BIN}/lmlcomp
# and compare compilers
	-cmp ${COMP} ${COMP}.1
	echo Done
#	touch DONE

oldc:
	mv ${BIN}/lmlcomp ${COMP}
	mv ${BIN}/lmlcomp.old ${BIN}/lmlcomp
oldc1:
	mv ${COMP}.old ${COMP}
	mv ${BIN}/lmlcomp ${COMP}.1
	mv ${BIN}/lmlcomp.old ${BIN}/lmlcomp

