PATH:=/c/SysGCC/m68k-elf/bin:/c/rvsdevtools/x64/gnat-20.1/bin:$(PATH)

BLDDIR=build
SRCDIR=src
GFXDIR=gfx

PREFIX=m68k-elf-
CC68K=$(PREFIX)gcc.exe
AS=$(PREFIX)as.exe
OBJCPY=$(PREFIX)objcopy.exe

CC=gcc.exe
CXX=g++.exe


INCLUDES=-ISDL2-2.0.8/x86_64-w64-mingw32/include/SDL2/ -I$(BLDDIR)


CFLAGS68K= -c -g -m68000 -Wall -O0 -fomit-frame-pointer
ASFLAGS= -m68000 --register-prefix-optional
LIBS=-lc -lgcc -lnosys
LINKFLAGS = -m68000 -T md.ld -Wl,-Map=output.map -nostdlib

CFLAGS=  -g3 -Werror -DHOST
CXXFLAGS= -O3 -g3 -Werror

DEPFLAGS = -MT $@ -MMD -MP -MF $(BLDDIR)/$*.d


LDFLAGS=-LSDL2-2.0.8/x86_64-w64-mingw32/lib/ -lmingw32 -lSDL2main -lSDL2



SRCS=$(SRCDIR)/game.c $(SRCDIR)/state.c $(SRCDIR)/collisions.c $(SRCDIR)/globals.c $(SRCDIR)/data.c
HOST_SRCS=$(SRCDIR)/main.c $(SRCDIR)/mapconv.c $(SRCDIR)/quick_uts.c
HEADERS=$(wildcard $(SRCDIR)/*.h)

ifeq ($(UT), 1)
   CFLAGS += -DUT
   HOST_SRCS += $(SRCDIR)/unittest.c
else
   ifeq ($(UT), 2)
      CFLAGS += -DSB
      HOST_SRCS += $(SRCDIR)/sandbox.c
   else
      ifeq ($(UT), 3)
         CFLAGS += -DDT
         HOST_SRCS += $(SRCDIR)/deathtest.c
      else
         ifeq ($(UT), 4)
            CFLAGS += -DFB
            HOST_SRCS += $(SRCDIR)/flamebox.c
         endif
      endif
   endif
endif





MD_OBJS=$(BLDDIR)/crt0.68k.o $(BLDDIR)/hw_md.68k.o $(patsubst $(SRCDIR)/%.c,$(BLDDIR)/%.68k.o,$(SRCS))
HOST_OBJS=$(patsubst $(SRCDIR)/%.c,$(BLDDIR)/%.x64.o,$(SRCS)) $(patsubst $(SRCDIR)/%.c,$(BLDDIR)/%.x64.o,$(HOST_SRCS))

GFX_MAIN = $(patsubst $(GFXDIR)/%.png,$(BLDDIR)/%.mdg,$(wildcard $(GFXDIR)/*.png))
GFX_ALT = $(patsubst $(GFXDIR)/conveyor/%.png,$(BLDDIR)/conveyor/%.mdg,$(wildcard $(GFXDIR)/*/*.png))
GFX_OBJS = $(BLDDIR)/main_gfx.o $(BLDDIR)/conveyor/conveyor.o




ifneq ($(C), "")
   DBG_COMMAND = -ex "break collisions.c:$(C)" -ex run
endif

#temp: FORCE
#	echo $(TEMP)

main: run

db: main.exe
	gdb main $(DBG_COMMAND)

md : squeeb.bin

run: main.exe
	./main.exe

$(BLDDIR):
	mkdir $(BLDDIR)

$(BLDDIR)/conveyor: | $(BLDDIR)
	mkdir $(BLDDIR)/conveyor

png2md.exe: png2md.cpp
	$(CXX) $(CXXFLAGS) -o $@ $^

squeeb.elf: $(GFX_OBJS) $(MD_OBJS) | $(BLDDIR) $(BLDDIR)/conveyor
	$(CC68K) $(LINKFLAGS) $^ $(LIBS) -o squeeb.elf

squeeb.bin: squeeb.elf
	$(OBJCPY) -O binary $< temp.bin
	dd if=temp.bin of=$@ bs=8K conv=sync

$(BLDDIR)/main_gfx.mdg: $(GFX_MAIN) | $(BLDDIR)
	cat $^ > $@

$(BLDDIR)/assets.h: $(GFX_MAIN) | $(BLDDIR)
	echo -e "#ifdef HOST\nunsigned char* img_main_gfx;\nextern unsigned char *img_conveyor;\n#else\nextern unsigned char img_main_gfx[];\nextern unsigned char img_conveyor[];\n#endif" > $@
	find $(BLDDIR) -name "main_gfx.mdg" -printf '%s\n' | awk '{print "#define img_main_gfx_size " ($$1/32);}' >> $@
	cd $(BLDDIR); find -maxdepth 1 -name "*.mdg" ! -name "main_gfx.mdg" -printf '%f %s\n' | sort | awk '{print "#define img_"$$1"_size " ($$2/32);}' | sed 's/\.mdg//' >> ../$@
	cd $(BLDDIR); find -maxdepth 1 -name "*.mdg" ! -name "main_gfx.mdg" -printf '%f %s\n' | sort | awk 'BEGIN {sum=0} {print "#define img_"$$1"_offset " (sum/32);sum+=$$2}' | sed 's/\.mdg//' >> ../$@

$(BLDDIR)/globals.h: $(SRCDIR)/globals.c | $(BLDDIR)
	cat $(SRCDIR)/globals.c | sed '/^#/ d' | sed 's/\[.*\]/[]/g' | sed 's/^./extern &/' > $@

main.exe: $(BLDDIR)/main_gfx.mdg $(GFX_ALT) $(HOST_OBJS)
	$(CC) -o $@ $(HOST_OBJS) $(LDFLAGS)


#$(BLDDIR)/%.o: $(SRC)/%.pnm
#	OBJCPYopy -I binary -O pe-x86-64 -B i386:x86-64 $< $@

objclean:
	rm -f $(BLDDIR)/*.o main.exe temp.bin squeeb.bin squeeb.elf

clean: objclean
	rm -rf $(BLDDIR)


deepclean: clean
	rm -f png2md.exe

$(BLDDIR)/%.mdg: $(GFXDIR)/%.png png2md.exe | $(BLDDIR) $(BLDDIR)/conveyor
	./png2md.exe $< $@

$(BLDDIR)/mapdata.o: mapdata.bin
	$(OBJCPY) -I binary -O elf32-m68k -B m68k:68000 --rename-section .data=.rodata --redefine-sym _binary_mapdata_bin_start=mapdata $< $@

mapconv.exe: $(SRCDIR)/mapconv.c $(BLDDIR)/assets.h $(HEADERS)
	$(CC) -g3 $(INCLUDES) -DSTANDALONE $< -o $@

$(BLDDIR)/mapdata.h: mapconv.exe
	./mapconv.exe $(BLDDIR)/mapdata.h


$(BLDDIR)/%.o: $(BLDDIR)/%.mdg
	@echo $(subst /,_,$(dir $<))
	$(OBJCPY) -I binary -O elf32-m68k -B m68k:68000 --rename-section .data=.rodata --redefine-sym _binary_$(subst /,_,$(dir $<))$(notdir $(basename $<))_mdg_start=img_$(notdir $(basename $<)) $< $@

$(BLDDIR)/unittest.x64.o: FORCE

$(BLDDIR)/main.x64.o: $(SRCDIR)/main.c
$(BLDDIR)/main.x64.o: $(SRCDIR)/main.c $(BLDDIR)/main.d $(GFX_OBJS) $(BLDDIR)/globals.h $(BLDDIR)/assets.h
	$(CC) -MT $@ -MMD -MP -MF $(BLDDIR)/main.d $(INCLUDES) -O0 $(CFLAGS) -c $< -o $@

$(BLDDIR)/%.x64.o: $(SRCDIR)/%.c

#$(BLDDIR)/game.x64.o: $(SRCDIR)/game.c $(BLDDIR)/game.d $(GFX_OBJS)
#	$(CC) $(DEPFLAGS) $(INCLUDES) -O0 $(CFLAGS) -c $< -o $@

$(BLDDIR)/%.x64.o: $(SRCDIR)/%.c $(BLDDIR)/%.d $(GFX_OBJS) $(BLDDIR)/globals.h $(BLDDIR)/assets.h
	$(CC) $(DEPFLAGS) $(INCLUDES) -O0 $(CFLAGS) -c $< -o $@

$(BLDDIR)/%.68k.o: $(SRCDIR)/%.s $(HEADERS)
	$(AS) $(ASFLAGS) $< -o $@

$(BLDDIR)/%.68k.o: $(SRCDIR)/%.c $(GFX_OBJS) $(BLDDIR)/assets.h $(BLDDIR)/globals.h $(HEADERS) $(BLDDIR)/mapdata.h
	$(CC68K) $(INCLUDES) $(CFLAGS68K) -c $< -o $@

$(BLDDIR)/%.o: $(SRCDIR)/%.cpp
	$(CXX) $(INCLUDES) $(CXXFLAGS) -c $< -o $@



FORCE:


DEPFILES := $(patsubst $(SRCDIR)/%.c,$(BLDDIR)/%.d,$(SRCS)) $(patsubst $(SRCDIR)/%.c,$(BLDDIR)/%.d,$(HOST_SRCS))
$(DEPFILES):

include $(wildcard $(DEPFILES))