
LCCSRC = lcc-4_2
LCCZIP = lcc-4_2.zip
LCCDIR = lcc-build
DOOMTOP = DOOM-master
DOOMZIP = $(DOOMTOP).zip
DOOMSRC = $(DOOMTOP)/linuxdoom-1.10
ASMINC = asmlib
LCCINC = lccinc

.PHONY: all clean get_lcc get_doom examples_asm examples_c build_lcc

all: examples_asm examples_c doom.bin doomp.bin

clean:
	$(RM) -rf $(LCCSRC) $(DOOMTOP) lcc-build doom-build
	$(RM) -f doom-build.log doom.bin doomp.bin ogvmpack selfunp.bin
	$(RM) -f hello.bin loader.bin fizzbuzz.bin lzmadec.bin window_obj.asm window.bin

get_lcc: $(LCCSRC)/src/ogvm.md
build_lcc: $(LCCDIR)/include
get_doom: $(DOOMSRC)/ogvm_patch.txt

$(LCCZIP):
	wget "https://github.com/drh/lcc/archive/v4_2.zip" -O $(LCCZIP)

$(LCCSRC): $(LCCZIP)
	unzip $(LCCZIP)

$(LCCSRC)/src/ogvm.md: $(LCCSRC)
	patch -N -p1 -d $(LCCSRC) < lcc.patch
	cp ogvm.md $@

$(LCCDIR)/include: $(LCCSRC)/src/ogvm.md
	mkdir -p $(LCCDIR)
	$(MAKE) -C $(LCCSRC) BUILDDIR=../$(LCCDIR) HOSTFILE=etc/linux.c all
	mkdir -p $(LCCDIR)/gcc $(LCCDIR)/include
	cp $(LCCDIR)/cpp $(LCCDIR)/gcc/cpp
	cp $(LCCSRC)/include/x86/linux/* $(LCCDIR)/include/

$(DOOMZIP):
	wget "https://github.com/id-Software/DOOM/archive/master.zip" -O $(DOOMZIP)

$(DOOMSRC): $(DOOMZIP)
	unzip $(DOOMZIP) "$(DOOMSRC)/*"

$(DOOMSRC)/ogvm_patch.txt: $(DOOMSRC)
	patch -N -p1 -d $(DOOMSRC) < doom.patch
	echo "patched for OGVM" > $@

doom.bin: $(LCCDIR)/include $(DOOMSRC)/ogvm_patch.txt
	$(MAKE) -f doom.make LCCDIR="$(LCCDIR)" SRCDIR="$(DOOMSRC)" ASMINC="$(ASMINC)" all 2>&1 | tee doom-build.log

examples_asm: hello.bin loader.bin fizzbuzz.bin lzmadec.bin
examples_c: $(LCCDIR)/include window.bin

%_obj.asm: examples/%.c
	LCCDIR=$(LCCDIR) $(LCCDIR)/lcc $(CFLAGS) -S $< -o $@ -target=ogvm/nasm -I$(LCCINC) -DLCC -DVMCODE

window.bin: examples/linkc.asm window_obj.asm
	nasm -i $(ASMINC)/ -DEXAMPLE_OBJ="'window_obj.asm'" -f bin -O9 $< -o $@

selfunp.bin: selfunp.asm
	nasm -i $(ASMINC)/ -f bin -O9 $< -o $@
ogvmpack: ogvmpack.c selfunp.bin
	$(CC) -Wall -march=native -O3 $< -s -o $@
doomp.bin: doom.bin ogvmpack
	@echo "### compressing doom.bin -> doomp.bin"
	./ogvmpack -r 19 doom.bin selfunp.bin doomp.bin

%.bin: examples/%.asm $(ASMINC)/vm.asm
	nasm -i $(ASMINC)/ -f bin -O9 $< -o $@

