# Duke3D Makefile

SRC=source/
OBJ=obj/
EROOT=../build/
EINC=$(EROOT)include/
EOBJ=eobj/
INC=$(SRC)

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


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

CC=gcc
CFLAGS=$(debug) -W -Wall -march=pentium -O3 \
	-fschedule-insns2 -funsigned-char -DNO_GCC_BUILTINS \
	-I$(INC) -I$(EINC) -I$(SRC)jmact -I$(SRC)jaudiolib \
	-DNOCOPYPROTECT
LIBS=
NASMFLAGS=-s -g
EXESUFFIX=

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

JMACTOBJ=$(OBJ)util_lib.o \
	$(OBJ)file_lib.o \
	$(OBJ)control.o \
	$(OBJ)keyboard.o \
	$(OBJ)mouse.o \
	$(OBJ)mathutil.o \
	$(OBJ)scriplib.o

#JAUDIOLIB_FX=$(OBJ)jaudiolib_fxstub.o
#JAUDIOLIB_MUSIC=$(OBJ)jaudiolib_musicstub.o
#JAUDIOLIB_FX=$(OBJ)jaudiolib_fx_fmod.o
JAUDIOLIB_FX=$(OBJ)mv_mix.o \
	  $(OBJ)mv_mix16.o \
	  $(OBJ)mvreverb.o \
	  $(OBJ)pitch.o \
	  $(OBJ)multivoc.o \
	  $(OBJ)ll_man.o \
	  $(OBJ)fx_man.o \
	  $(OBJ)dsoundout.o
JAUDIOLIB_MUSIC=$(OBJ)midi.o \
	  $(OBJ)mpu401.o \
	  $(OBJ)music.o
JAUDIOLIBOBJ=$(JAUDIOLIB_MUSIC) $(JAUDIOLIB_FX)

GAMEOBJS=$(OBJ)game.o \
	$(OBJ)actors.o \
	$(OBJ)gamedef.o \
	$(OBJ)global.o \
	$(OBJ)menues.o \
	$(OBJ)player.o \
	$(OBJ)premap.o \
	$(OBJ)sector.o \
	$(OBJ)sounds.o \
	$(OBJ)rts.o \
	$(OBJ)config.o \
	$(OBJ)animlib.o \
	$(OBJ)testcd.o \
	$(OBJ)osdfuncs.o \
	$(OBJ)osdcmds.o \
	$(JMACTOBJ) \
	$(JAUDIOLIBOBJ)

EDITOROBJS=$(EOBJ)build.o \
	$(OBJ)astub.o \
	$(EOBJ)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
		CFLAGS+= -DUNDERSCORES -I$(DXROOT)/include
		LIBS+= -lmingwex -lwinmm -mwindows -ldxguid -L$(DXROOT)/lib -lws2_32
		NASMFLAGS+= -DUNDERSCORES
		GAMEOBJS+= $(OBJ)gameres.o $(OBJ)winbits.o
		EDITOROBJS+= $(OBJ)buildres.o
		RENDERTYPE ?= WIN
		NASMFLAGS+= -f win32
	else
		PLATFORM=UNKNOWN
	endif
endif
	
ifeq ($(RENDERTYPE),SDL)
	GAMEOBJS+= $(EOBJ)sdlayer.o
	EDITOROBJS+= $(EOBJ)sdlayer.o

	CFLAGS+= $(shell sdl-config --cflags)
	LIBS+= $(shell sdl-config --libs)
else
	ifeq ($(RENDERTYPE),WIN)
		GAMEOBJS+= $(EOBJ)winlayer.o
		EDITOROBJS+= $(EOBJ)winlayer.o
		
		CFLAGS+= -Dmain=app_main
	endif
endif

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

.PHONY: clean all build

# TARGETS
all: build duke3d$(EXESUFFIX) build$(EXESUFFIX)

build:
	-mkdir $(EOBJ)
	cd ../build && make "OBJ=$(CURDIR)/$(EOBJ)" "CFLAGS=-DSUPERBUILD" engineobjs editorobjs

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

duke3d_h=$(EINC)build.h $(EINC)pragmas.h $(EINC)compat.h $(EINC)cache1d.h $(EINC)baselayer.h \
	$(INC)types.h $(SRC)jmact/file_lib.h $(SRC)jmact/util_lib.h $(SRC)jmact/keyboard.h $(SRC)jmact/control.h \
	$(INC)develop.h $(INC)gamedefs.h $(INC)function.h $(INC)config.h $(INC)sounds.h $(INC)rts.h $(INC)_rts.h \
	$(INC)soundefs.h $(SRC)jaudiolib/fx_man.h $(SRC)jaudiolib/music.h \
	$(INC)names.h $(INC)funct.h $(INC)duke3d.h

$(OBJ)game.o: $(SRC)game.c $(SRC)jmact/scriplib.h $(duke3d_h) $(INC)osdfuncs.h $(INC)osdcmds.h
$(OBJ)actors.o: $(SRC)actors.c $(duke3d_h)
$(OBJ)gamedef.o: $(SRC)gamedef.c $(duke3d_h)
$(OBJ)global.o: $(SRC)global.c $(duke3d_h)
$(OBJ)menues.o: $(SRC)menues.c $(duke3d_h) $(SRC)jmact/mouse.h $(INC)animlib.h
$(OBJ)player.o: $(SRC)player.c $(duke3d_h)
$(OBJ)premap.o: $(SRC)premap.c $(duke3d_h)
$(OBJ)sector.o: $(SRC)sector.c $(duke3d_h)
$(OBJ)sounds.o: $(SRC)sounds.c $(duke3d_h)
$(OBJ)rts.o: $(SRC)rts.c $(duke3d_h)
$(OBJ)config.o: $(SRC)config.c $(duke3d_h) $(SRC)jmact/scriplib.h $(INC)_functio.h
$(OBJ)animlib.o: $(SRC)animlib.c $(INC)types.h $(INC)develop.h $(SRC)jmact/util_lib.h $(INC)_animlib.h $(INC)animlib.h
$(OBJ)testcd.o: $(SRC)testcd.c
$(OBJ)winbits.o: $(SRC)winbits.c
$(OBJ)osdfuncs.o: $(SRC)names.h $(EINC)build.h
$(OBJ)osdcmds.o: $(SRC)osdcmds.c $(INC)osdcmds.h $(EINC)osd.h $(duke3d_h)

$(OBJ)astub.o: $(SRC)astub.c $(EINC)build.h $(EINC)pragmas.h $(EINC)compat.h

# jMACT objects
$(OBJ)util_lib.o: $(SRC)jmact/util_lib.c $(SRC)jmact/util_lib.h $(INC)types.h
$(OBJ)file_lib.o: $(SRC)jmact/file_lib.c $(SRC)jmact/file_lib.h $(INC)types.h
$(OBJ)control.o: $(SRC)jmact/control.c $(INC)types.h $(SRC)jmact/control.h $(SRC)jmact/keyboard.h $(SRC)jmact/mouse.h
$(OBJ)keyboard.o: $(SRC)jmact/keyboard.c $(INC)types.h $(SRC)jmact/keyboard.h
$(OBJ)mouse.o: $(SRC)jmact/mouse.c $(INC)types.h $(SRC)jmact/mouse.h
$(OBJ)mathutil.o: $(SRC)jmact/mathutil.c $(INC)types.h
$(OBJ)scriplib.o: $(SRC)jmact/scriplib.c $(SRC)jmact/scriplib.h $(SRC)jmact/util_lib.h $(SRC)jmact/_scrplib.h $(INC)types.h

# jAudioLib objects
$(OBJ)jaudiolib_fxstub.o: $(SRC)jaudiolib/jaudiolib_fxstub.c $(SRC)jaudiolib/fx_man.h
$(OBJ)jaudiolib_musicstub.o: $(SRC)jaudiolib/jaudiolib_musicstub.c $(SRC)jaudiolib/music.h

$(OBJ)jaudiolib_fx_fmod.o: $(SRC)jaudiolib/jaudiolib_fx_fmod.c $(SRC)jaudiolib/fx_man_fmod.h $(INC)duke3d.h

$(OBJ)mv_mix.o: $(SRC)jaudiolib/mv_mix.asm
$(OBJ)mv_mix16.o: $(SRC)jaudiolib/mv_mix16.asm
$(OBJ)mvreverb.o: $(SRC)jaudiolib/mvreverb.asm
$(OBJ)pitch.o: $(SRC)jaudiolib/pitch.c $(SRC)jaudiolib/pitch.h
$(OBJ)multivoc.o: $(SRC)jaudiolib/multivoc.c $(SRC)jaudiolib/usrhooks.h $(SRC)jaudiolib/linklist.h $(SRC)jaudiolib/pitch.h $(SRC)jaudiolib/multivoc.h $(SRC)jaudiolib/_multivc.h
$(OBJ)fx_man.o: $(SRC)jaudiolib/fx_man.c $(SRC)jaudiolib/multivoc.h $(SRC)jaudiolib/ll_man.h $(SRC)jaudiolib/fx_man.h
$(OBJ)dsoundout.o: $(SRC)jaudiolib/dsoundout.c $(SRC)jaudiolib/dsoundout.h

$(OBJ)midi.o: $(SRC)jaudiolib/midi.c $(SRC)jaudiolib/standard.h $(SRC)jaudiolib/usrhooks.h $(SRC)jaudiolib/music.h $(SRC)jaudiolib/_midi.h $(SRC)jaudiolib/midi.h
$(OBJ)mpu401.o: $(SRC)jaudiolib/mpu401.c $(SRC)jaudiolib/mpu401.h
$(OBJ)music.o: $(SRC)jaudiolib/music.c $(SRC)jaudiolib/music.h $(SRC)jaudiolib/midi.h $(SRC)jaudiolib/mpu401.h


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

$(OBJ)%.o: $(SRC)%.c
	$(CC) $(CFLAGS) -c $< -o $@ 2>&1
$(OBJ)%.o: $(SRC)jmact/%.c
	$(CC) $(CFLAGS) -c $< -o $@ 2>&1
$(OBJ)%.o: $(SRC)jaudiolib/%.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 $(OBJ)* duke3d$(EXESUFFIX) duke3d.sym$(EXESUFFIX) build$(EXESUFFIX) build.sym$(EXESUFFIX) core*
	
veryclean: clean
	-rm -f $(EOBJ)*
