# Build Makefile

SRC=src/
OBJ?=obj/
INC=include/
CFLAGS?=-DSUPERBUILD

# debugging enabled
debug=-ggdb
# debugging disabled
#debug=-ggdb -fomit-frame-pointer

DXROOT=c:/mingw32/dx6
FMODROOT=c:/mingw32/fmodapi360win32/api

CC=gcc
override CFLAGS+= $(debug) -W -march=pentium -O3 \
	-fschedule-insns2 -funsigned-char -DNO_GCC_BUILTINS \
	-I$(INC)
LIBS=-lfmod
NASMFLAGS=-s -g
EXESUFFIX=

ENGINEOBJS=$(OBJ)engine.o \
	$(OBJ)cache1d.o \
	$(OBJ)a.o \
	$(OBJ)pragmas.o \
	$(OBJ)osd.o \
	$(OBJ)mmulti_null.o \
	$(OBJ)crc32.o

GAMEOBJS=$(OBJ)game.o \
	$(OBJ)sound.o \
	$(OBJ)config.o \
	$(ENGINEOBJS) \
	#$(SOUNDOBJS)
	
#SOUNDOBJS=$(OBJ)readvoc.o \
	#$(OBJ)readwav.o \
	#$(OBJ)kdm.o \
	#$(OBJ)kdmasm.o

EDITOROBJS=$(OBJ)build.o \
	$(OBJ)bstub.o \
	$(OBJ)config.o \
	$(ENGINEOBJS)

uname=$(strip $(shell uname -s))
ifeq ($(findstring Linux,$(uname)),Linux)
	PLATFORM=LINUX
	RENDERTYPE=SDL
	NASMFLAGS+= -f elf
else
	ifeq ($(findstring MINGW32,$(uname)),MINGW32)
		PLATFORM=WINDOWS
		EXESUFFIX=.exe
		override CFLAGS+= -DUNDERSCORES -I$(DXROOT)/include -I$(FMODROOT)/inc
		LIBS+= -lmingwex -lwinmm -L$(DXROOT)/lib -L$(FMODROOT)/lib -lws2_32
		NASMFLAGS+= -DUNDERSCORES
		GAMEOBJS+= $(OBJ)gameres.o
		EDITOROBJS+= $(OBJ)buildres.o
		RENDERTYPE ?= WIN
		NASMFLAGS+= -f win32
	else
		PLATFORM=UNKNOWN
	endif
endif
	
ifeq ($(RENDERTYPE),SDL)
	ENGINEOBJS+= $(OBJ)sdlayer.o
	
	GAMEOBJS+= $(OBJ)sdlayer.o
	EDITOROBJS+= $(OBJ)sdlayer.o
	override CFLAGS+= $(shell sdl-config --cflags)
	LIBS+= $(shell sdl-config --libs)
else
	ifeq ($(RENDERTYPE),WIN)
		ENGINEOBJS+= $(OBJ)winlayer.o
		
		GAMEOBJS+= $(OBJ)winlayer.o
		EDITOROBJS+= $(OBJ)winlayer.o
		override CFLAGS+= -Dmain=app_main
		LIBS+= -mwindows -ldxguid
	endif
endif

override CFLAGS+= -D$(PLATFORM) -DRENDERTYPE$(RENDERTYPE)=1

.PHONY: clean all engineobjs editorobjs utils

# TARGETS
all: game$(EXESUFFIX) build$(EXESUFFIX)
utils: kextract$(EXESUFFIX) kgroup$(EXESUFFIX) transpal$(EXESUFFIX)

engineobjs: $(ENGINEOBJS)

editorobjs: $(EDITOROBJS)

game$(EXESUFFIX): $(GAMEOBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
	-rm game.sym$(EXESUFFIX)
	cp game$(EXESUFFIX) game.sym$(EXESUFFIX)
	strip game$(EXESUFFIX)
	
build$(EXESUFFIX): $(EDITOROBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
	-rm build.sym$(EXESUFFIX)
	cp build$(EXESUFFIX) build.sym$(EXESUFFIX)
	strip build$(EXESUFFIX)

pragmacheck$(EXESUFFIX): $(OBJ)pragmacheck.o $(OBJ)pragmas.o
	$(CC) $(subst -Dmain=app_main,,$(CFLAGS)) -o $@ $^
	
kextract$(EXESUFFIX): $(OBJ)kextract.o
	$(CC) -o $@ $^
kgroup$(EXESUFFIX): $(OBJ)kgroup.o
	$(CC) -o $@ $^
transpal$(EXESUFFIX): $(OBJ)transpal.o $(OBJ)pragmas.o
	$(CC) -o $@ $^

# DEPENDENCIES
$(OBJ)game.o: $(SRC)game.c $(INC)build.h $(INC)names.h $(INC)pragmas.h \
	$(INC)baselayer.h $(INC)cache1d.h $(INC)game.h $(INC)compat.h
$(OBJ)build.o: $(SRC)build.c $(INC)build.h $(INC)pragmas.h $(INC)compat.h
$(OBJ)bstub.o: $(SRC)bstub.c $(INC)build.h $(INC)pragmas.h $(INC)compat.h
$(OBJ)cache1d.o: $(SRC)cache1d.c $(INC)pragmas.h $(INC)compat.h
$(OBJ)engine.o: $(SRC)engine.c $(INC)build.h $(INC)baselayer.h $(INC)pragmas.h $(INC)a.h $(INC)cache1d.h $(INC)compat.h $(INC)osd.h
$(OBJ)sdlayer.o: $(SRC)sdlayer.c $(INC)sdlayer.h $(INC)baselayer.h $(INC)pragmas.h $(INC)cache1d.h $(INC)build.h $(INC)osd.h $(INC)compat.h
$(OBJ)winlayer.o: $(SRC)winlayer.c $(INC)winlayer.h $(INC)baselayer.h $(INC)dxdidf.h $(INC)pragmas.h $(INC)build.h $(INC)osd.h $(INC)compat.h
$(OBJ)osd.o: $(SRC)osd.c $(INC)build.h
$(OBJ)pragmas.o: $(SRC)pragmas.c $(INC)pragmas.h
$(OBJ)a.o: $(SRC)a.asm $(INC)a.h
$(OBJ)sound.o: $(SRC)sound.c
$(OBJ)config.o: $(SRC)config.c
$(OBJ)udp.o: $(SRC)udp.c $(INC)mmulti.h
$(OBJ)mmulti.o: $(SRC)mmulti.c $(INC)osd.h $(INC)pragmas.h $(INC)mmulti.h $(INC)compat.h $(INC)crc32.h
$(OBJ)mmulti_null.o: $(SRC)mmulti_null.c $(INC)osd.h $(INC)pragmas.h $(INC)mmulti.h $(INC)compat.h
$(OBJ)crc32.o: $(SRC)crc32.c $(INC)crc32.h
#$(OBJ)kdm.o: $(SRC)kdm.c
#$(OBJ)kdmasm.o: $(SRC)kdmasm.asm

#$(OBJ)readvoc.o: $(SRC)readvoc.c $(INC)cache1d.h $(INC)compat.h $(INC)buildsound.h
#$(OBJ)readwav.o: $(SRC)readwav.c $(INC)cache1d.h $(INC)compat.h $(INC)buildsound.h

$(OBJ)gameres.o: $(SRC)misc/gameres.rc
$(OBJ)buildres.o: $(SRC)misc/buildres.rc

$(OBJ)kextract.o: $(SRC)util/kextract.c
	$(CC) -funsigned-char -c $< -o $@
$(OBJ)kgroup.o: $(SRC)util/kgroup.c
	$(CC) -funsigned-char -c $< -o $@
$(OBJ)transpal.o: $(SRC)util/transpal.c
	$(CC) -funsigned-char -I$(INC) -c $< -o $@

# RULES
$(OBJ)%.o: $(SRC)%.asm
	nasm $(NASMFLAGS) $< -o $@

$(OBJ)%.o: $(SRC)%.c
	$(CC) $(CFLAGS) -c $< -o $@ 2>&1

$(OBJ)%.o: $(SRC)misc/%.rc
	windres -i $^ -o $@

$(OBJ)%.o: $(SRC)util/%.c
	$(CC) $(CFLAGS) -c $< -o $@ 2>&1


# PHONIES	
clean:
	-rm -f $(GAMEOBJS) $(EDITOROBJS) game$(EXESUFFIX) game.sym$(EXESUFFIX) build$(EXESUFFIX) build.sym$(EXESUFFIX) core*

