CC_FLAGS=-Wpedantic -Wall -Wextra -std=gnu11 -lrt -O3
CC=gcc
LD_FLAGS=-O3
LD=gcc

test: test_runtime.o core basic1 basic2 special_regs complex

test_runtime.o:
	$(CC) tests/runtime.c -c -o test_runtime.o $(CC_FLAGS)

core: test_runtime.o
	cargo r -r -- tests/core.urcl -O3
	$(LD) urcl.o test_runtime.o $(LD_FLAGS)
	./a.out

basic1: test_runtime.o
	cargo r -r -- tests/basic1.urcl -O3
	$(LD) urcl.o test_runtime.o $(LD_FLAGS)
	./a.out

basic2: test_runtime.o
	cargo r -r -- tests/basic2.urcl -O3
	$(LD) urcl.o test_runtime.o $(LD_FLAGS)
	./a.out

special_regs: test_runtime.o
	cargo r -r -- tests/special_regs.urcl -O3
	$(LD) urcl.o test_runtime.o $(LD_FLAGS)
	./a.out

complex: test_runtime.o
	cargo r -r -- tests/complex.urcl -O3
	$(LD) urcl.o test_runtime.o $(LD_FLAGS)
	./a.out

runtime.o:
	$(CC) generic-rt.c -c -o runtime.o $(CC_FLAGS)

mandelbrot: runtime.o
	cargo r -r -- benchmarks/mandelbrot-fortran.urcl -O3
	gcc urcl.o runtime.o $(CC_FLAGS) -lSDL2
	./a.out

fib: runtime.o
	cargo r -r -- examples/fib.urcl -O3
	gcc urcl.o runtime.o $(CC_FLAGS) -lSDL2
	./a.out

urclos_rt.o:
	$(CC) urclos-rt.c -c -o urclos_rt.o $(CC_FLAGS)

urclos: urclos_rt.o
	cargo r -r -- urcl-os/urclos3.urcl -O3 --max-ram 65536 --use-global
	$(LD) urcl.o urclos_rt.o $(LD_FLAGS)
	./a.out urcl-os/fs.bin

minesweeper: runtime.o
	cargo r -r -- examples/minesweeper.urcl -O3
	gcc urcl.o runtime.o $(CC_FLAGS) -lSDL2 -s
	./a.out

clean:
	- rm *.o
	- rm *.ll
	- rm *.bc
