# Build Makefile for GNU Make

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

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

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

# -D these to enable certain features of the port's compile process
# USE_GCC_ASSEMBLY   Use NASM and compile the ported A.ASM assembly code.
#                    If this is not defined, alter the $(OBJ)a.$o in the
#                    ENGINEOBJS declaration to be $(OBJ)a-c.$o
# USE_GCC_PRAGMAS    Use GCC inline assembly macros instead of C code for
#                    the features in PRAGMAS.H
TARGETOPTS=-DUSE_GCC_ASSEMBLY -DUSE_GCC_PRAGMAS

CC=gcc
override CFLAGS+= $(debug) -W -march=pentium -O3 \
	-fschedule-insns2 -funsigned-char -DNO_GCC_BUILTINS $(TARGETOPTS) \
	-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)crc32.$o \
	$(OBJ)jmulti_null.$o \
	$(OBJ)engineinfo.$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 writeengineinfo

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

engineobjs: $(ENGINEOBJS)

editorobjs: $(EDITOROBJS)

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

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 $@ $^

testmulti$(EXESUFFIX): $(OBJ)testmulti.$o $(OBJ)jmulti.$o $(OBJ)crc32.$o
	$(CC) -ggdb -o $@ $^ -lws2_32

# DEPENDENCIES
include Makefile.gnu.deps

$(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 $@

$(OBJ)testmulti.$o: $(SRC)testmulti.c

$(OBJ)engineinfo.$o: $(SRC)tmp/engineinfo.c writeengineinfo

writeengineinfo:
	echo "const char _engine_cflags[] = \"$(CFLAGS)\";" > $(SRC)tmp/engineinfo.c
	echo "const char _engine_libs[] = \"$(LIBS)\";" >> $(SRC)tmp/engineinfo.c
	echo "const char _engine_uname[] = \"$(shell uname -a)\";" >> $(SRC)tmp/engineinfo.c
	echo "const char _engine_compiler[] = \"$(CC) $(shell $(CC) -dumpversion) $(shell $(CC) -dumpmachine)\";" >> $(SRC)tmp/engineinfo.c
	echo "const char _engine_date[] = __DATE__ \" \" __TIME__;" >> $(SRC)tmp/engineinfo.c

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

$(OBJ)%.$o: $(SRC)%.c
	$(CC) $(CFLAGS) -c $< -o $@ 2>&1
	
$(OBJ)%.$o: $(SRC)tmp/%.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*

