MCSS=../mcss
CM=../cmeta

BIN=back-stage1 back-stage1-asm am1-to-back am1-to-back-debug back-stage2 back-stage2-asm back-stage2-debug back-stage2-asm-debug

all: $(BIN) test-back-stage2

back-stage1: back-stage1.am1
	$(MCSS)/am1 < $< | $(MCSS)/ama2 | cat $(MCSS)/bm2rt - | $(CM)/elfwrap > $@
	chmod +x $@

back-stage1-asm: back-stage1-asm.am1
	$(MCSS)/am1 < $< | $(MCSS)/ama2 | cat $(MCSS)/asmrt4 - | $(CM)/elfwrap > $@
	chmod +x $@

am1-to-back: am1-to-back.am1
	$(MCSS)/am1 < $< | $(MCSS)/ama2 | cat $(MCSS)/bm2rt - | $(CM)/elfwrap > $@
	chmod +x $@

am1-to-back-debug: am1-to-back-debug.am1
	$(MCSS)/am1 < $< | $(MCSS)/ama2 | cat $(MCSS)/bm2rt - | $(CM)/elfwrap > $@
	chmod +x $@

back.back: back-stage1.am1 am1-to-back
	./am1-to-back < $< > $@

back-debug.back: back-stage1.am1 am1-to-back-debug
	./am1-to-back-debug < $< > $@

back-asm.back: back-stage1-asm.am1 am1-to-back
	./am1-to-back < $< > $@

back-asm-debug.back: back-stage1-asm.am1 am1-to-back-debug
	./am1-to-back-debug < $< > $@

back-stage2: back.back init.back compiler-before.back compiler-after.back io.back misc.back parse.back rwx.back table.back
	cat init.back compiler-before.back $< compiler-after.back io.back misc.back parse.back rwx.back table.back | ./back-stage1 | ./back-stage1-asm | $(CM)/elfwrap > $@
	chmod +x $@

back-stage2-debug: back-debug.back init.back compiler-before.back compiler-after.back io.back misc.back parse.back rwx.back table.back
	cat init.back compiler-before.back $< compiler-after.back io.back misc.back parse.back rwx.back table.back | ./back-stage1 | ./back-stage1-asm | $(CM)/elfwrap > $@
	chmod +x $@

back-stage2-asm: back-asm.back init.back assembler-before.back assembler-after.back io.back misc.back parse.back rwx.back table.back
	cat init.back assembler-before.back $< assembler-after.back io.back misc.back parse.back rwx.back table.back | ./back-stage1 | ./back-stage1-asm | $(CM)/elfwrap > $@
	chmod +x $@

back-stage2-asm-debug: back-asm-debug.back init.back assembler-before.back assembler-after.back io.back misc.back parse.back rwx.back table.back
	cat init.back assembler-before.back $< assembler-after.back io.back misc.back parse.back rwx.back table.back | ./back-stage1 | ./back-stage1-asm | $(CM)/elfwrap > $@
	chmod +x $@

test-back-stage2: back-stage2 back-stage2-asm
	cat init.back compiler-before.back back.back compiler-after.back io.back misc.back parse.back rwx.back table.back | ./back-stage2 | ./back-stage2-asm | $(CM)/elfwrap | diff -su - back-stage2

test-back-stage2-debug: back-stage2-debug back-stage2-asm-debug
	cat init.back compiler-before.back back-debug.back compiler-after.back io.back misc.back parse.back rwx.back table.back | ./back-stage2-debug | less

test-back-stage2-asm-debug: back-stage2-debug back-stage2-asm-debug
	cat init.back compiler-before.back back-debug.back compiler-after.back io.back misc.back parse.back rwx.back table.back | ./back-stage2 | ./back-stage2-asm-debug | less

clean:
	$(RM) back.back back-asm.back back-debug.back back-asm-debug.back $(BIN)

prereq:
	$(MAKE) -C $(MCSS) am1 ama2
	$(MAKE) -C $(CM) lhex elfwrap

.PHONY: all clean prereq test-back-stage2 test-back-stage2-debug
