CC=gcc
CFLAGS=-O2 -Wall
DX=dalvik-exchange
VMGEN_SOURCES=Makefile README disasm.c engine.c fib.mini \
	mini-inst.vmg mini-super.vmg mini.h mini.l mini.y \
	peephole-blacklist peephole.c profile.c seq2rule.awk \
	simple.mini stat.awk support.c test.mini test.out

SOURCES=Boxing1.java Boxing2.java Example.java Example2.c Example2.java \
	HEADER.md Makefile call.c code-copying.S code-copying.c dalvik.c \
	dtc-tc.c dtc.c dtc.s itc.c  switch.c \
	register.c stack-caching.c stack-multi.c

GEN=switch.o call.o dtc.o itc.o dtc-tc.o code-copying.s code-copying.o \
	stack-caching.s stack-multi.s dalvik.s register.s \
	Example.class Example.dex Example.dexdump \
	Example2.class Example2.dex Example2.dexdump \
	Example2.wasm Example2.wat \
	Boxing1.class Boxing2.class \
	HEADER.html

all: $(GEN)

HEADER.html: HEADER.md
	pandoc -f markdown -t html -o $@ $<

dtc-tc.o: dtc-tc.c
	clang -O2 -Wall -c $<

code-copying.s: code-copying.c
	gcc -Wall -O2 -S code-copying.c

code-copying.o: code-copying.S
	gcc -c code-copying.S

stack-caching.s: stack-caching.c
	clang -O2 -Wall -S $<

stack-multi.s: stack-multi.c
	clang -O2 -Wall -S $<

dalvik.s: dalvik.c
	clang -O2 -Wall -S $<

register.s: register.c
	clang -O2 -Wall -S $<

%.class: %.java
	javac --release 9 $<

%.dexdump: %.class
	$(DX) --dex --dump-to=$@ $<

%.dex: %.class
	$(DX) --dex --output=$@ $<

%.wasm: %.c
	clang -Os -fno-inline-functions -Wall --target=wasm64 -c $< -o $@

%.wat: %.wasm
	wasm-objdump -d $< >$@

clean:
	rm $(GEN)

dist:
	rm -rf examples
	mkdir -p examples/vmgen-ex
	tar cf - $(SOURCES) | tar -C examples -x -f -
	tar -C vmgen-ex -c -f - $(VMGEN_SOURCES) | tar -C examples/vmgen-ex -x -f -
	tar cfJ examples.tar.xz examples

