testreps = 10000000
ifeq "$(shell uname -s | tr 'A-Z' 'a-z')" "linux"
 ostype := 1
else # assume cygwin
 ostype := 2
endif
default: minasm.4th minforth.4th
	pytest pfcompile.pfcompile minasm.4th minforth.4th
test: proof_ds proof_d proof_c proof_i proof_s
	@echo $(testreps) repetitions of each program
	@echo -n proof_ds: && time proof_ds || echo average of 8 and 4 is $$?
	@echo -n proof_d: && time proof_d || echo average of 8 and 4 is $$?
	@echo -n proof_c: && time proof_c || echo average of 8 and 4 is $$?
	@echo -n proof_i: && time proof_i || echo average of 8 and 4 is $$?
	@echo -n proof_s: && time proof_s || echo average of 8 and 4 is $$?
proof%: proof%.o
	ld -o $@ $<
proof%.o: proof%.s
	as --defsym OS=$(ostype) \
	 --defsym REPS=$(testreps) -o $@ $<
proof_c: proof_c.c Makefile
	gcc -D REPS=$(testreps) -o proof_c proof_c.c
proof_liu: proof_liu.o
	ld -s -o $@ $<  # strip symbols from this one
	if ./$@; then echo "errorcode zero, wrong!"; rm $@; false; \
	elif [ "$$?" = "2" ]; then echo "errorcode two, right!"; \
	else echo "errorcode $$?, bad!"; rm $@ && false; \
	fi
%.bin: %.asm
	fasm $<
	strip $@
	if ./$@; then echo "errorcode zero, wrong!"; rm $@; false; \
	elif [ "$$?" = "2" ]; then echo "errorcode two, right!"; \
	else echo "errorcode $$?, bad!"; rm $@ && false; \
	fi
diff: proof_liu liu_junfeng_pe.bin
	objdump --all-headers proof_liu > /tmp/proof_liu.dmp
	objdump --all-headers liu_junfeng_pe.bin > /tmp/liu_junfeng_pe.bin.dmp
	-diff /tmp/proof_liu.dmp /tmp/liu_junfeng_pe.bin.dmp
	xxd proof_liu > /tmp/proof_liu.xxd
	xxd liu_junfeng_pe.bin > /tmp/liu_junfeng_pe.bin.xxd
	-diff /tmp/proof_liu.xxd /tmp/liu_junfeng_pe.bin.xxd
clean:
	rm -f *.o *.exe proof_[a-z] proof_[a-z][a-z] *.pyc *.bin
minimum: minimum.elf
	grep '^0' $< | \
	 awk '{print $$2$$3$$4$$5}' | \
	 xxd -r -p \
	 > $@
commit:
	rsync -avuzb . www.jcomeau.com:/usr/src/repository/postforth-1/
