default: so
so: build_so

# compiler to use for building shared objects
CC = gcc

# determine arch and platform
ARCH=$(shell uname -m | sed -e s/i.86/i386/)
PLATFORM=$(shell uname|sed -e s/_.*//|tr '[:upper:]' '[:lower:]')

# cflags for the VM compiler
VMCFLAGS = $(CFLAGS) -DQ3_VM
# cflags for the compiler
ifeq ($(PLATFORM), mingw32)
SOCFLAGS = $(CFLAGS)
else
SOCFLAGS = $(CFLAGS) -fPIC
endif

# set extension
ifeq ($(PLATFORM), mingw32)
EXT=dll
ARCH=x86
else
EXT=so
endif

# ui objects
OBJ = \
  ui_turbolift.o \
  ui_transporter.o \
  ui_motd.o \
  ui_admin.o \
  ui_video.o \
  ui_teamorders.o \
  ui_team.o \
  ui_startserver.o \
  ui_spskill.o \
  ui_sppostgame.o \
  ui_splevel.o \
  ui_specifyserver.o \
  ui_sparena.o \
  ui_sound.o \
  ui_servers2.o \
  ui_serverinfo.o \
  ui_removebots.o \
  ui_qmenu.o \
  ui_preferences.o \
  ui_playersettings.o \
  ui_players.o \
  ui_playermodel.o \
  ui_network.o \
  ui_mods.o \
  ui_mfield.o \
  ui_menu.o \
  ui_main.o \
  ui_ingame.o \
  ui_gameinfo.o \
  ui_fonts.o \
  ui_emotes.o \
  ui_demo2.o \
  ui_cvars.o \
  ui_credits.o \
  ui_controls2.o \
  ui_connect.o \
  ui_confirm.o \
  ui_cdkey.o \
  ui_atoms.o \
  ui_addbots.o 

# dependencies from game
OBJDEP = \
  q_shared.o \
  q_math.o \
  bg_misc.o 
  
# object for syscalls to the engine
SOOBJ = \
  ui_syscalls.o 

# do cc for shared libraries
DO_SOCC = $(CC) $(SOCFLAGS) -Wall -o $@ -c $<

build_so: DO_CC=$(DO_SOCC)

cg_consolecmds.o : cg_consolecmds.c; $(DO_CC)

ui_addbots.o : ui_addbots.c; $(DO_CC)
ui_atoms.o : ui_atoms.c; $(DO_CC)
ui_cdkey.o : ui_cdkey.c; $(DO_CC)
ui_confirm.o : ui_confirm.c; $(DO_CC)
ui_connect.o : ui_connect.c; $(DO_CC)
ui_controls2.o : ui_controls2.c; $(DO_CC)
ui_cvars.o : ui_cvars.c; $(DO_CC)
ui_demo2.o : ui_demo2.c; $(DO_CC)
ui_fonts.o : ui_fonts.c; $(DO_CC)
ui_gameinfo.o : ui_gameinfo.c; $(DO_CC)
ui_ingame.o : ui_ingame.c; $(DO_CC)
ui_main.o : ui_main.c; $(DO_CC)
ui_menu.o : ui_menu.c; $(DO_CC)
ui_mfield.o : ui_mfield.c; $(DO_CC)
ui_mods.o : ui_mods.c; $(DO_CC)
ui_network.o : ui_network.c; $(DO_CC)
ui_playermodel.o : ui_playermodel.c; $(DO_CC)
ui_players.o : ui_players.c; $(DO_CC)
ui_playersettings.o : ui_playersettings.c; $(DO_CC)
ui_preferences.o : ui_preferences.c; $(DO_CC)
ui_qmenu.o : ui_qmenu.c; $(DO_CC)
ui_removebots.o : ui_removebots.c; $(DO_CC)
ui_serverinfo.o : ui_serverinfo.c; $(DO_CC)
ui_servers2.o : ui_servers2.c; $(DO_CC)
ui_sound.o : ui_sound.c; $(DO_CC)
ui_sparena.o : ui_sparena.c; $(DO_CC)
ui_specifyserver.o : ui_specifyserver.c; $(DO_CC)
ui_splevel.o : ui_splevel.c; $(DO_CC)
ui_sppostgame.o : ui_sppostgame.c; $(DO_CC)
ui_spreset.o : ui_spreset.c; $(DO_CC)
ui_spskill.o : ui_spskill.c; $(DO_CC)
ui_startserver.o : ui_startserver.c; $(DO_CC)
ui_team.o : ui_team.c; $(DO_CC)
ui_teamorders.o : ui_teamorders.c; $(DO_CC)
ui_video.o : ui_video.c; $(DO_CC)
ui_credits.o : ui_credits.c; $(DO_CC)
ui_admin.o : ui_admin.c; $(DO_CC)
ui_emotes.o : ui_emotes.c; $(DO_CC)
ui_motd.o : ui_motd.c; $(DO_CC)
ui_transporter.o : ui_transporter.c; $(DO_CC)
ui_turbolift.o : ui_turbolift.c; $(DO_CC)

ui_syscalls.o : ui_syscalls.c; $(DO_CC)

q_shared.o: ../game/q_shared.c; $(DO_CC)
q_math.o: ../game/q_math.c; $(DO_CC)
bg_misc.o: ../game/bg_misc.c; $(DO_CC)

build_so: $(OBJDEP) $(OBJ) $(SOOBJ)
ifeq ($(PLATFORM), mingw32)
	$(CC) -shared -Wl,--export-all-symbols,-soname,ui$(ARCH).$(EXT) -o ui$(ARCH).$(EXT) $(OBJ) $(OBJDEP) $(SOOBJ)
else
	$(CC) -shared -Wl,--export-dynamic,-soname,ui$(ARCH).$(EXT) -o ui$(ARCH).$(EXT) $(OBJ) $(OBJDEP) $(SOOBJ)
endif
	
clean:
	rm -f *.o *.$(EXT)
