#---------------------------------------
#
#	Some configurations
#
#---------------------------------------

# Uncomment to compile a debug version
#DEBUG = 1

# Uncomment to compile without OpenGL driver
#NOGL = 1

# Uncomment if for OpenGL you must link to libMesaGL.a and not to libGL.a
#MESAGL = 1

#---------------------------------------
#
#	Executable extension
#
#---------------------------------------

ifdef DJGPP
EXE = .exe
else
EXE =
endif

#---------------------------------------
#
#	Main executable objects and libs
#
#---------------------------------------

ifdef DJGPP
SYS_OBJS = \
	obj/cd_dos.o \
	obj/in_dos.o \
	obj/mplib.o \
	obj/mplpc.o \
	obj/net_bw.o \
	obj/net_dos.o \
	obj/net_ipx.o \
	obj/net_mp.o \
	obj/npxsetup.o \
	obj/sys_dosa.o \
	obj/sys_dos.o
ifndef NOGL
SYS_OBJS += obj/gl_alleg.o
endif
LIBS := -lalleg -lstdcxx
else
SYS_OBJS = \
	obj/cd_linux.o \
	obj/in_alleg.o \
	obj/net_bsd.o \
	obj/net_udp.o \
	obj/sys_lina.o \
	obj/sys_lin.o
ifndef NOGL
SYS_OBJS += obj/gl_x.o
endif
LIBS := `allegro-config --libs` -lm -lstdc++
#LIBS := `allegro-config --static` -lm -lstdc++ -static
endif

OBJ_FILES = $(SYS_OBJS) \
	obj/am_map.o \
	obj/chat.o \
	obj/cheats.o \
	obj/cl_demo.o \
	obj/cl_input.o \
	obj/cl_main.o \
	obj/cl_parse.o \
	obj/cl_poly.o \
	obj/cmd.o \
	obj/console.o \
	obj/crc.o \
	obj/cvar.o \
	obj/d_alleg.o \
	obj/d_data.o \
	obj/d_draw.o \
	obj/d_main.o \
	obj/d_poly.o \
	obj/d_scan.o \
	obj/d_span.o \
	obj/d_span8.o \
	obj/d_span15.o \
	obj/d_span16.o \
	obj/d_sprite.o \
	obj/d_tex.o \
	obj/d_wipe.o \
	obj/d_varsa.o \
	obj/d_zspan.o \
	obj/d8_sky.o \
	obj/d8_span.o \
	obj/d8_spr.o \
	obj/d16_sky.o \
	obj/d16_span.o \
	obj/d16_spr.o \
	obj/debug.o \
	obj/finale.o \
	obj/files.o \
	obj/host.o \
	obj/iline.o \
	obj/imission.o \
	obj/in_input.o \
	obj/infostr.o \
	obj/maths.o \
	obj/menu.o \
	obj/message.o \
	obj/misc.o \
	obj/msgbox.o \
	obj/net_dgrm.o \
	obj/net_loop.o \
	obj/net_main.o \
	obj/p_info.o \
	obj/p_setup.o \
	obj/pr_cmds.o \
	obj/pr_exec.o \
	obj/pr_execa.o \
	obj/r_border.o \
	obj/r_bsp.o \
	obj/r_main.o \
	obj/r_sky.o \
	obj/r_tex.o \
	obj/r_things.o \
	obj/s_alleg.o \
	obj/s_allegm.o \
	obj/s_sound.o \
	obj/sbar.o \
	obj/sc_man.o \
	obj/screen.o \
	obj/sizebuf.o \
	obj/sn_sonix.o \
	obj/sv_acs.o \
	obj/sv_main.o \
	obj/sv_poly.o \
	obj/sv_save.o \
	obj/sv_sight.o \
	obj/sv_swtch.o \
	obj/sv_tick.o \
	obj/sv_user.o \
	obj/sv_world.o \
	obj/text.o \
	obj/v_draw.o \
	obj/wad.o \
	obj/zone.o

ifndef NOGL
OBJ_FILES += \
	obj/gl_draw.o \
	obj/gl_main.o \
	obj/gl_poly.o \
	obj/gl_tex.o
ifdef MESAGL
LIBS := -lMesaGL $(LIBS)
else
LIBS := -lGL $(LIBS)
endif
endif

#---------------------------------------
#
#	Dedicated server objcts and libs
#
#---------------------------------------

ifdef DJGPP
SV_SYS_OBJS = \
	svobj/mplib.o \
	svobj/mplpc.o \
	svobj/net_bw.o \
	svobj/net_dos.o \
	svobj/net_ipx.o \
	svobj/net_mp.o \
	svobj/npxsetup.o
SV_LIBS = -lstdcxx
else
SV_SYS_OBJS = \
	svobj/net_bsd.o \
	svobj/net_udp.o
SV_LIBS = -lm -lstdc++
endif

SV_OBJ_FILES = $(SV_SYS_OBJS) \
	svobj/cmd.o \
	svobj/crc.o \
	svobj/cvar.o \
	svobj/debug.o \
	svobj/files.o \
	svobj/host.o \
	svobj/infostr.o \
	svobj/maths.o \
	svobj/message.o \
	svobj/misc.o \
	svobj/net_dgrm.o \
	svobj/net_loop.o \
	svobj/net_main.o \
	svobj/p_info.o \
	svobj/p_setup.o \
	svobj/pr_cmds.o \
	svobj/pr_exec.o \
	svobj/pr_execa.o \
	svobj/r_tex.o \
	svobj/s_sound.o \
	svobj/sc_man.o \
	svobj/sizebuf.o \
	svobj/sv_acs.o \
	svobj/sv_main.o \
	svobj/sv_poly.o \
	svobj/sv_save.o \
	svobj/sv_sight.o \
	svobj/sv_swtch.o \
	svobj/sv_tick.o \
	svobj/sv_user.o \
	svobj/sv_world.o \
	svobj/sys_bsd.o \
	svobj/wad.o \
	svobj/zone.o

# ---------------------------------------

ifdef DEBUG

C_ARGS = -W -Wall -O3 -ffast-math -fomit-frame-pointer -c
CPP_ARGS = -W -Wall -O -ffast-math -g -fno-rtti -fno-exceptions -c
ASM_ARGS = -x assembler-with-cpp -W -Wall -c
LINK_ARGS = -Wall

else

C_ARGS = -W -Wall -O3 -ffast-math -fomit-frame-pointer -mpentiumpro -c
CPP_ARGS = -W -Wall -O3 -ffast-math -fomit-frame-pointer \
	-fno-rtti -fno-exceptions -mpentiumpro -c
ASM_ARGS = -x assembler-with-cpp -W -Wall -c
LINK_ARGS = -Wall -s

endif

# ---------------------------------------

all: Vavoom$(EXE)

Vavoom$(EXE): $(OBJ_FILES)
	gcc $(LINK_ARGS) -o $@ $(OBJ_FILES) $(LIBS)

suid:
	chown root.root Vavoom
	chmod 4755 Vavoom

crash:
	addr2line -e Vavoom -f < crash.txt >> jl/debug.txt

obj/%.o : source/%.c
	gcc $(C_ARGS) -o $@ $<

obj/%.o : source/%.cpp source/*.h
	gcc $(CPP_ARGS) -o $@ $<

obj/%.o : source/%.s source/asm_i386.h
	gcc $(ASM_ARGS) -o $@ $<

# ---------------------------------------

sv: VavoomSV$(EXE)

VavoomSV$(EXE): $(SV_OBJ_FILES)
	gcc $(LINK_ARGS) -o $@ $(SV_OBJ_FILES) $(SV_LIBS)

svobj/%.o : source/%.c
	gcc $(C_ARGS) -DSERVER -o $@ $<

svobj/%.o : source/%.cpp source/*.h
	gcc $(CPP_ARGS) -DSERVER -o $@ $<

svobj/%.o : source/%.s
	gcc $(ASM_ARGS) -DSERVER -o $@ $<

# ---------------------------------------

clean:
	rm obj/*.o obj/*.obj clobj/*.o clobj/*.obj svobj/*.o svobj/*.obj *.tds

# ---------------------------------------
#
#	Generation of asm files for Windows
#
# ---------------------------------------

ASM_FILES = \
	source/d_zspan.asm \
	source/d_varsa.asm \
	source/d8_sky.asm \
	source/d8_span.asm \
	source/d8_spr.asm \
	source/d16_sky.asm \
	source/d16_span.asm \
	source/d16_spr.asm \
	source/pr_execa.asm

asm: $(ASM_FILES)

source/%.asm : source/%.s source/asm_i386.h source/gas2tasm.exe
	gcc -x assembler-with-cpp -E -P -DGAS2TASM $< -o source/temp.i
	cp source/template.asm $@
	source/gas2tasm.exe < source/temp.i >> $@
	rm source/temp.i

source/gas2tasm.exe : source/gas2tasm.c
	gcc -O3 -ffast-math -fomit-frame-pointer -m486 -s -o $@ $<

