## Initialize variables

DU_NUM=du6
RO_PATH=public-ro/mlc
RO_PATH_DU=${RO_PATH}/${DU_NUM}
RO_PATH_COMMON=public-ro/common
RW_PATH=public-rw/SWI098
RW_PATH_DU=${RW_PATH}/${DU_NUM}
ICM_PATH=public-ro/icm

CFLAGS+=-Wall -I. -I${RO_PATH_DU}/h/ -I${RO_PATH}/h/ -I${RO_PATH_COMMON}/h/ -I${RW_PATH_DU} -I${ICM_PATH}/h -ggdb

## Final build of the program

all: program icm

program: gen_ainstr.hpp gen_icinstr.hpp gen_icopcodes.hpp gen_icinstrtab.o gen_icfactory.o gen_aifactory.o ${DU_NUM}.o ${DU_NUM}g.o ${DU_NUM}baseerrtab.o duseemptyerrtab.o duerr.o dutables.o abstract_ic.o flat_icblock.o ic_instr.o labeled_icblock.o uid_gen.o flex.o ${DU_NUM}sem.o
	${CXX} ${LDFLAGS} -o program gen_icinstrtab.o gen_icfactory.o gen_aifactory.o ${DU_NUM}.o ${DU_NUM}g.o ${DU_NUM}baseerrtab.o duseemptyerrtab.o duerr.o dutables.o abstract_ic.o flat_icblock.o ic_instr.o labeled_icblock.o uid_gen.o flex.o ${DU_NUM}sem.o 

icm: gen_mopcodes.hpp flat_icblock.o ic_instr.o icexcept.o icm.o icm_machine.o gen_icfactory.o gen_icinstrtab.o gen_instr_decode.o gen_machines.o gen_mops.o
	${CXX} ${LDFLAGS} -o icm flat_icblock.o ic_instr.o icexcept.o icm.o icm_machine.o gen_icfactory.o gen_icinstrtab.o gen_instr_decode.o gen_machines.o gen_mops.o

mybuild: cleansm program

## Sources in ${RO_PATH_DU}/src

${DU_NUM}.o: ${RO_PATH_DU}/h/${DU_NUM}.h ${RO_PATH_DU}/h/${DU_NUM}tok.h ${RO_PATH}/h/duerr.h ${RO_PATH}/h/dutables.h ${RO_PATH_DU}/src/${DU_NUM}.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RO_PATH_DU}/src/${DU_NUM}.cpp

${DU_NUM}baseerrtab.o: ${RO_PATH}/h/duerr.h ${RO_PATH_DU}/src/${DU_NUM}baseerrtab.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RO_PATH_DU}/src/${DU_NUM}baseerrtab.cpp

## Sources in ${RO_PATH}/src

duerr.o: ${RO_PATH}/h/duerr.h ${RO_PATH}/src/duerr.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RO_PATH}/src/duerr.cpp

duseemptyerrtab.o: ${RO_PATH}/h/duerr.h  ${RO_PATH}/src/dusememptyerrtab.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RO_PATH}/src/dusememptyerrtab.cpp

dutables.o: ${RO_PATH}/h/dutables.h ${RO_PATH_COMMON}/h/literal_storage.hpp ${RO_PATH}/h/duerr.h ${RO_PATH}/src/dutables.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RO_PATH}/src/dutables.cpp

## Sources in ${RO_PATH_COMMON}/src

abstract_ic.o: ${RO_PATH_COMMON}/h/abstract_ic.hpp ${RO_PATH_COMMON}/h/flat_icblock.hpp ${RO_PATH_COMMON}/h/labeled_icblock.hpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RO_PATH_COMMON}/src/abstract_ic.cpp

flat_icblock.o: ${RO_PATH_COMMON}/h/flat_icblock.hpp ${RO_PATH_COMMON}/h/file_seq.hpp ${RO_PATH_COMMON}/h/ic_factory.hpp ${RO_PATH_COMMON}/h/ic_instr.hpp ${RO_PATH_COMMON}/h/ic_instrtab.hpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RO_PATH_COMMON}/src/flat_icblock.cpp

ic_instr.o: ${RO_PATH_COMMON}/h/ic_instr.hpp ${RO_PATH_COMMON}/h/ic_instrtab.hpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RO_PATH_COMMON}/src/ic_instr.cpp

labeled_icblock.o: ${RO_PATH_COMMON}/h/labeled_icblock.hpp ${RO_PATH_COMMON}/h/ic_instrtab.hpp ${RO_PATH_COMMON}/h/ai_factory.hpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RO_PATH_COMMON}/src/labeled_icblock.cpp

uid_gen.o: ${RO_PATH_COMMON}/h/uid_gen.hpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RO_PATH_COMMON}/src/uid_gen.cpp

## Sources in ${ICM_PATH}/src

icexcept.o: ${ICM_PATH}/src/icexcept.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${ICM_PATH}/src/icexcept.cpp

icm.o: ${ICM_PATH}/src/icm.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${ICM_PATH}/src/icm.cpp

icm_machine.o: ${ICM_PATH}/src/icm_machine.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${ICM_PATH}/src/icm_machine.cpp

## bison

${DU_NUM}g.o: ${DU_NUM}g.cpp ${RO_PATH_DU}/h/${DU_NUM}.h ${RO_PATH}/h/duerr.h ${RW_PATH_DU}/${DU_NUM}lval.hpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c $<

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

${DU_NUM}g.hpp: ${DU_NUM}g.cpp

${DU_NUM}sem.o: ${RW_PATH_DU}/${DU_NUM}sem.cpp ${RW_PATH_DU}/${DU_NUM}sem.h
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c ${RW_PATH_DU}/${DU_NUM}sem.cpp

## flex

flex.o: flex.cpp ${RO_PATH}/h/duerr.h ${RO_PATH_DU}/h/${DU_NUM}.h ${RO_PATH_DU}/h/${DU_NUM}tok.h ${DU_NUM}g.hpp ${RW_PATH_DU}/${DU_NUM}lval.hpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c flex.cpp

flex.cpp: ${RW_PATH_DU}/${DU_NUM}l.lex
	flex -Cf -b -p -p -o $@ $<

## XML stuff

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

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

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

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

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

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

gen_icinstrtab.o: gen_icinstrtab.cpp gen_ainstr.hpp gen_icinstr.hpp gen_icopcodes.hpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c gen_icinstrtab.cpp

gen_icfactory.o: gen_icfactory.cpp gen_ainstr.hpp gen_icinstr.hpp gen_icopcodes.hpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c gen_icfactory.cpp

gen_aifactory.o: gen_aifactory.cpp gen_ainstr.hpp gen_icinstr.hpp gen_icopcodes.hpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c gen_aifactory.cpp

# ICM stuff

gen_instr_decode.cpp:
	xsltproc --output $@ ${ICM_PATH}/xml/geninstrdecodec.xslt ${RO_PATH_COMMON}/xml/icminstr.xml

gen_machines.cpp:
	xsltproc --output $@ ${ICM_PATH}/xml/genmachc.xslt ${RO_PATH_COMMON}/xml/icminstr.xml

gen_mopcodes.hpp:
	xsltproc --output $@ ${ICM_PATH}/xml/genmopcodh.xslt ${RO_PATH_COMMON}/xml/icminstr.xml

gen_mops.cpp:
	xsltproc --output $@ ${ICM_PATH}/xml/genmopsc.xslt ${RO_PATH_COMMON}/xml/icminstr.xml

gen_instr_decode.o: gen_instr_decode.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c gen_instr_decode.cpp

gen_machines.o: gen_machines.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c gen_machines.cpp

gen_mops.o: gen_mops.cpp
	${CXX} ${CPPFLAGS} ${CFLAGS} -o $@ -c gen_mops.cpp

## Clean up

cleansm:
	rm -f ${DU_NUM}g.cpp

cleanusr: cleansm
	rm -f flex.cpp

clean:
	rm -f flex.cpp *.o program du*-test* lex.backup ${DU_NUM}g.* gen_*

## Checking of results

check: program ${DU_NUM}-test1

${DU_NUM}-test1:
	@./program ${RO_PATH_DU}/tests/$@.mls > $@.out
	@dos2unix -k $@.out >/dev/null 2>&1
	@if diff -u ${RO_PATH_DU}/tests/$@.out $@.out > $@.diff; then \
	echo $@ " OK ;)"; \
	else \
	echo "problem, nefunguje vse jak ma. rozdil ve vysledcich je v souboru :" $@.diff; \
	fi
	@rm -f $@.out
