BASE_PATH=../../..
DU_NUM=du4

RO_PATH=${BASE_PATH}/public-ro/mlc
RO_PATH_DU=${RO_PATH}/${DU_NUM}
RO_PATH_COMMON=${BASE_PATH}/public-ro/common
RW_PATH_DU=${BASE_PATH}/public-rw/SWI098/${DU_NUM}

TEST_PATH=${RO_PATH_DU}/tests
TESTS=${DU_NUM}-test1 ${DU_NUM}-test2
TESTS=`ls ${TEST_PATH}/*mls | sed 's/.mls//g' | sed 's/^.*\///g'`


FLAGS+= -Wall -I${RO_PATH}/h/ -I${RO_PATH_DU}/h/  -I${RO_PATH_COMMON}/h/ -I${RW_PATH_DU} 
CC=g++
RM=rm -rf

#make program

mlaskal: ${DU_NUM}l.o ${DU_NUM}g.o ${DU_NUM}sem.o ${DU_NUM}.o ${DU_NUM}baseerrtab.o duerr.o dusememptyerrtab.o dutables.o basic_block.o uid_gen.o labeled_icblock.o ic_instr.o gen_icinstrtab.o gen_aifactor.o gen_icfactory.o abstract_ic.o flat_icblock.o
	${CC} ${FLAGS} -o $@ ${DU_NUM}l.o ${DU_NUM}sem.o ${DU_NUM}.o ${DU_NUM}g.o ${DU_NUM}baseerrtab.o duerr.o dusememptyerrtab.o dutables.o basic_block.o uid_gen.o labeled_icblock.o ic_instr.o gen_icinstrtab.o gen_aifactor.o gen_icfactory.o abstract_ic.o flat_icblock.o

#me edited stuff
${DU_NUM}l.cpp: ${RW_PATH_DU}/${DU_NUM}l.lex gen_icopcodes.hpp gen_icinstr.hpp gen_ainstr.hpp
	flex -Cf -b -p -p -o $@ ${RW_PATH_DU}/${DU_NUM}l.lex

${DU_NUM}l.o: ${DU_NUM}l.cpp ${DU_NUM}g.hpp 
	${CC} ${FLAGS} -o $@ -c ${DU_NUM}l.cpp

${DU_NUM}g.cpp: ${DU_NUM}g.y
	bison --report=all -d ${DU_NUM}g.y -o ${DU_NUM}g.cpp

${DU_NUM}g.hpp: ${DU_NUM}g.y
	bison --report=all -d ${DU_NUM}g.y -o ${DU_NUM}g.cpp

${DU_NUM}g.o: ${DU_NUM}g.cpp gen_icopcodes.hpp gen_icinstr.hpp gen_ainstr.hpp
	${CC} ${FLAGS} -o $@ -c ${DU_NUM}g.cpp

${DU_NUM}sem.o: gen_ainstr.hpp gen_icopcodes.hpp gen_icinstr.hpp du4sem.h 
	${CC} ${FLAGS} -o $@ -c ${DU_NUM}sem.cpp

#read-only stuff

#${DU_NUM} part
${DU_NUM}.o: ${RO_PATH_DU}/src/${DU_NUM}.cpp gen_icopcodes.hpp gen_icinstr.hpp gen_ainstr.hpp
	${CC} ${FLAGS} -o $@ -c ${RO_PATH_DU}/src/${DU_NUM}.cpp

#${DU_NUM}tok.o: ${RO_PATH_DU}/src/${DU_NUM}tok.cpp
#	${CC} ${FLAGS} -o $@ -c ${RO_PATH_DU}/src/${DU_NUM}tok.cpp

${DU_NUM}baseerrtab.o: ${RO_PATH_DU}/src/${DU_NUM}baseerrtab.cpp
	${CC} ${FLAGS} -o $@ -c ${RO_PATH_DU}/src/${DU_NUM}baseerrtab.cpp

#common part
duerr.o: ${RO_PATH}/src/duerr.cpp
	${CC} ${FLAGS} -o $@ -c ${RO_PATH}/src/duerr.cpp

dusememptyerrtab.o: ${RO_PATH}/src/dusememptyerrtab.cpp
	${CC} ${FLAGS} -o $@ -c ${RO_PATH}/src/dusememptyerrtab.cpp

dutables.o: ${RO_PATH}/src/dutables.cpp ${RO_PATH}/h/dutables.h gen_icopcodes.hpp gen_icinstr.hpp gen_ainstr.hpp gen_icinstrtab.cpp gen_aifactor.cpp gen_icfactory.cpp
	${CC} ${FLAGS} -o $@ -c ${RO_PATH}/src/dutables.cpp


#xslt shitx
gen_aifactor.cpp: ${RO_PATH_COMMON}/xml/icminstr.xml ${RO_PATH_COMMON}/xml/genaifctrc.xslt
	xsltproc --output $@ ${RO_PATH_COMMON}/xml/genaifctrc.xslt ${RO_PATH_COMMON}/xml/icminstr.xml

gen_ainstr.hpp: ${RO_PATH_COMMON}/xml/icminstr.xml ${RO_PATH_COMMON}/xml/genainstrh.xslt
	xsltproc --output $@ ${RO_PATH_COMMON}/xml/genainstrh.xslt ${RO_PATH_COMMON}/xml/icminstr.xml

gen_icfactory.cpp: ${RO_PATH_COMMON}/xml/icminstr.xml ${RO_PATH_COMMON}/xml/genicfctrc.xslt
	xsltproc --output $@ ${RO_PATH_COMMON}/xml/genicfctrc.xslt ${RO_PATH_COMMON}/xml/icminstr.xml

gen_icinstr.hpp: ${RO_PATH_COMMON}/xml/icminstr.xml ${RO_PATH_COMMON}/xml/genicinstrh.xslt
	xsltproc --output $@ ${RO_PATH_COMMON}/xml/genicinstrh.xslt ${RO_PATH_COMMON}/xml/icminstr.xml

gen_icopcodes.hpp: ${RO_PATH_COMMON}/xml/icminstr.xml ${RO_PATH_COMMON}/xml/genicoph.xslt
	xsltproc --output $@ ${RO_PATH_COMMON}/xml/genicoph.xslt ${RO_PATH_COMMON}/xml/icminstr.xml

gen_icinstrtab.cpp: ${RO_PATH_COMMON}/xml/icminstr.xml ${RO_PATH_COMMON}/xml/genictabc.xslt
	xsltproc --output $@ ${RO_PATH_COMMON}/xml/genictabc.xslt ${RO_PATH_COMMON}/xml/icminstr.xml

#another symbol tables crap
basic_block.o: ${RO_PATH_COMMON}/h/basic_block.hpp ${RO_PATH_COMMON}/src/basic_block.cpp gen_icopcodes.hpp gen_ainstr.hpp
	${CC} ${FLAGS} -o $@ -c ${RO_PATH_COMMON}/src/basic_block.cpp

uid_gen.o:
	${CC} ${FLAGS} -o $@ -c ${RO_PATH_COMMON}/src/uid_gen.cpp

labeled_icblock.o: gen_icopcodes.hpp gen_ainstr.hpp gen_icinstr.hpp
	${CC} ${FLAGS} -o $@ -c ${RO_PATH_COMMON}/src/labeled_icblock.cpp

flat_icblock.o: gen_icopcodes.hpp gen_icinstr.hpp gen_ainstr.hpp
	${CC} ${FLAGS} -o $@ -c ${RO_PATH_COMMON}/src/flat_icblock.cpp

ic_instr.o: gen_icopcodes.hpp gen_icinstr.hpp
	${CC} ${FLAGS} -o $@ -c ${RO_PATH_COMMON}/src/ic_instr.cpp 

gen_icinstrtab.o: gen_icinstrtab.cpp gen_icopcodes.hpp
	${CC} ${FLAGS} -o $@ -c gen_icinstrtab.cpp

gen_aifactor.o: gen_aifactor.cpp gen_ainstr.hpp
	${CC} ${FLAGS} -o $@ -c gen_aifactor.cpp 

gen_icfactory.o: gen_icfactory.cpp gen_icopcodes.hpp gen_icinstr.hpp
	${CC} ${FLAGS} -o $@ -c gen_icfactory.cpp

abstract_ic.o: gen_ainstr.hpp gen_icopcodes.hpp gen_icinstr.hpp
	${CC} ${FLAGS} -o $@ -c ${RO_PATH_COMMON}/src/abstract_ic.cpp

#clean rule

clean:
	${RM} ${DU_NUM}l.cpp *.o mlaskal ${DU_NUM}g.hpp ${DU_NUM}g.cpp gen_* ${DU_NUM}l.backup ${DU_NUM}g.output lex.backup


#test rule
check: mlaskal
	@pid=`echo $$$$`; \
	for TEST in ${TESTS} ; do \
		./mlaskal ${TEST_PATH}/$${TEST}.mls /dev/null -D/tmp/stcd.$${TEST}.$${pid} > /tmp/out.$${TEST}.$${pid} ;\
		echo "Test $$TEST:"; \
		if diff --strip-trailing-cr ${TEST_PATH}/$${TEST}.out /tmp/out.$${TEST}.$${pid} > /tmp/err.out.$${TEST}.$${pid}; then \
			echo '\tOut OK!'; \
		else \
			echo "\tOut Fucked up!, see /tmp/err.out.$${TEST}.$${pid}"; \
		fi; \
		if diff --strip-trailing-cr ${TEST_PATH}/$${TEST}.stcd /tmp/stcd.$${TEST}.$${pid} > /tmp/err.$${TEST}.stcd.$${pid}; then \
			echo '\tSymtables coredump OK!'; \
		else \
			echo "\tSymtables coredump Fucked up!, see /tmp/err.stcd.$${TEST}.$${pid}"; \
		fi; \
		echo "" ;\
	done; \
	rm -rf /tmp/out.$${pid} /tmp/stcd.$${pid}


#			cat /tmp/err.$${pid}; \
