#hex: hex.hex
#	perl -e 'undef $$/; $$_ = <>; s/#.*//mg; s/\s+//sg; s/[0-9a-f][0-9a-f]/chr hex $$&/ge; print;' < $< > $@
#	chmod +x $@

all: test-lhex1 test-lhex2 test-elfwrap test-cmeta

hex: hex.hex hex.sh
	./hex.sh < $< > $@
	chmod +x $@

test-hex: hex.hex hex
	./hex < $< | cmp - hex

lhex: lhex.hex hex
	./hex < $< > $@
	chmod +x $@

test-lhex1: lhex.hex lhex
	./lhex < $< | cmp - lhex

test-lhex2: lhex.lhex rwx.lhex lhex
	cat $< rwx.lhex | ./lhex | cmp - lhex

elfwrap: elfwrap.lhex lhex
	./lhex < $< > $@
	chmod +x $@

test-elfwrap: elfwrap
	dd bs=120 skip=1 status=none < $< | ./elfwrap | cmp - $<

cma1: cma1.lhex rwx.lhex lhex elfwrap
	cat $< rwx.lhex | ./lhex | ./elfwrap > $@
	chmod +x $@

cmrt: cmrt.lhex checkerror.lhex getlabel.lhex io.lhex rwx.lhex why.lhex label-z.lhex lhex
	cat $< checkerror.lhex getlabel.lhex io.lhex rwx.lhex why.lhex label-z.lhex | ./lhex > $@

cmeta1: cmeta1.cma cma1 cmrt elfwrap
	./cma1 < $< | cat cmrt - | ./elfwrap > $@
	chmod +x $@

asmrt: asmrt.lhex checkerror.lhex getlabel.lhex io.lhex rwx.lhex why.lhex label-z.lhex lhex
	cat $< checkerror.lhex getlabel.lhex io.lhex rwx.lhex why.lhex label-z.lhex | ./lhex > $@

cma: cma.cmeta cmeta1 cma1 asmrt elfwrap
	./cmeta1 < $< | ./cma1 | cat asmrt - | ./elfwrap > $@
	chmod +x $@

## Currently fails because cma outputs slightly different (but equivalent) code
#test-cma: cma
#	./cmeta1 < cma.cmeta | ./cma | cat asmrt - | ./elfwrap | cmp - cma

cmeta: cmeta.cmeta cmeta1 cma cmrt elfwrap
	./cmeta1 < $< | ./cma | cat cmrt - | ./elfwrap > $@
	chmod +x $@

test-cmeta: cmeta cmeta.cmeta cma cmrt elfwrap
	./cmeta < cmeta.cmeta | ./cma | cat cmrt - | ./elfwrap | cmp - cmeta

%.out: %.cmeta cmeta cma cmrt elfwrap
	./cmeta < $< | ./cma | cat cmrt - | ./elfwrap > $@
	chmod +x $@

clean:
	$(RM) cmafmt.out cmeta cma asmrt cmeta1 cmrt cma1 elfwrap lhex

.PHONY: clean test-hex test-lhex1 test-lhex2 test-elfwrap test-cmeta
