PLATFORM = $(shell uname -s)
ARCH = $(shell uname -m)

ifeq ($(ARCH),powerpc)
  ARCH=ppc
endif
ifeq ($(ARCH),powerpc64)
  ARCH=ppc64
endif

STRIPFLAGS = --strip-unneeded
ifeq ($(PLATFORM), MorphOS)
	STRIPFLAGS += -K dllEntry -K vmMain -K morphos_so_init -K morphos_so_deinit
endif

CC=gcc
CXX=g++
MKDIR=mkdir

MODNAME=etpub
MOUNT_DIR=src
BUILD_DIR=build
GENERATE_DEPENDENCIES=1
DEBUG_CFLAGS=-g -O0

#############################################################################

BD=$(BUILD_DIR)/debug-$(PLATFORM)-$(ARCH)
BR=$(BUILD_DIR)/release-$(PLATFORM)-$(ARCH)
SYSDIR = $(MOUNT_DIR)/sys
GDIR=$(MOUNT_DIR)/game
CGDIR=$(MOUNT_DIR)/cgame
BOTAIDIR=$(MOUNT_DIR)/../Omnibot/Common
UIDIR=$(MOUNT_DIR)/ui
MD5DIR=$(MOUNT_DIR)/md5
SHA1DIR=$(MOUNT_DIR)/sha-1

#############################################################################
# SETUP AND BUILD -- AROS
#############################################################################

## Defaults

BASE_CFLAGS = -Wall -fno-strict-aliasing -Wimplicit -pipe

OPTIMIZEVM = -O2 -funroll-loops -fomit-frame-pointer

ifeq ($(PLATFORM), MorphOS)
	SHLIBEXT = so
else
	SHLIBEXT = dll
endif
SHLIBCFLAGS= -Isrc/md5 -Isrc/sha-1
ifeq ($(PLATFORM),AROS)
SHLIBCFLAGS+= -IDevelopment:include/lua
endif
SHLIBCFLAGS+= -IOmnibot/Common -IOmnibot/ET
SHLIBLDFLAGS= $(LDFLAGS)
ifeq ($(PLATFORM), MorphOS)
	SHLIBCFLAGS += -noixemul
	SHLIBLDFLAGS += -noixemul -nostartfiles
endif

ifeq ($(PLATFORM), MorphOS)
	LIBS = -lm
else
	LIBS = -ldll
endif
LIBS_CGAME=$(LIBS) -lcurl
ifneq ($(PLATFORM), MorphOS)
	LIBS_CGAME += -lssl -lcrypto
endif
LIBS_CGAME += -lz
LIBS_GAME=$(LIBS) -llua
LIBS_UI=$(LIBS)

ifeq ($(PLATFORM), MorphOS)
	SHLIBNAME=_mp_morphos_$(ARCH).$(SHLIBEXT)
else
	SHLIBNAME=_mp_aros_$(ARCH).$(SHLIBEXT)
endif

TARGETS += \
  $(B)/$(MODNAME)/cgame$(SHLIBNAME) \
  $(B)/$(MODNAME)/qagame$(SHLIBNAME) \
  $(B)/$(MODNAME)/ui$(SHLIBNAME)

ifeq ($(GENERATE_DEPENDENCIES),1)
  DEPEND_CFLAGS = -MMD
else
  DEPEND_CFLAGS =
endif

ifeq ($(V),1)
echo_cmd=@:
Q=
else
echo_cmd=@echo
Q=@
endif

define DO_GAME_CC
$(echo_cmd) "GAME_CC $<"
$(Q)$(CC) -DGAMEDLL -DUSE_MDXFILE -DNO_BOT_SUPPORT -DLUA_SUPPORT $(SHLIBCFLAGS) $(CFLAGS) $(OPTIMIZEVM) -o $@ -c $<
endef

define DO_GAME_CXX
$(echo_cmd) "GAME_CC $<"
$(Q)$(CXX) -DGAMEDLL -DUSE_MDXFILE -DNO_BOT_SUPPORT -DLUA_SUPPORT $(SHLIBCFLAGS) $(CFLAGS) $(OPTIMIZEVM) -o $@ -c $<
endef

define DO_CGAME_CC
$(echo_cmd) "CGAME_CC $<"
$(Q)$(CC) -DCGAMEDLL -DUSE_MDXFILE $(SHLIBCFLAGS) $(CFLAGS) $(OPTIMIZEVM) -o $@ -c $<
endef

define DO_UI_CC
$(echo_cmd) "UI_CC $<"
$(Q)$(CC) -DUIDLL $(SHLIBCFLAGS) $(CFLAGS) $(OPTIMIZEVM) -o $@ -c $<
endef

#############################################################################
# MAIN TARGETS
#############################################################################

default: release
all: debug release

debug:
	@$(MAKE) targets B=$(BD) CFLAGS="$(CFLAGS) $(BASE_CFLAGS) $(DEPEND_CFLAGS)" \
	  OPTIMIZEVM="-D_DEBUG $(DEBUG_CFLAGS)" STRIP="echo" \
	  V=$(V)

release:
	@$(MAKE) targets B=$(BR) CFLAGS="$(CFLAGS) $(BASE_CFLAGS) $(DEPEND_CFLAGS)" \
	  OPTIMIZEVM="-DNDEBUG $(OPTIMIZEVM)" STRIP="strip" \
	  V=$(V)

# Create the build directories, check libraries and print out
# an informational message, then start building
targets: makedirs
ifneq ($(TARGETS),)
	@$(MAKE) $(TARGETS) V=$(V)
endif

makedirs:
	@if [ ! -d $(BUILD_DIR) ];then $(MKDIR) $(BUILD_DIR);fi
	@if [ ! -d $(B) ];then $(MKDIR) $(B);fi
	@if [ ! -d $(B)/$(MODNAME) ];then $(MKDIR) $(B)/$(MODNAME);fi
	@if [ ! -d $(B)/$(MODNAME)/cgame ];then $(MKDIR) $(B)/$(MODNAME)/cgame;fi
	@if [ ! -d $(B)/$(MODNAME)/game ];then $(MKDIR) $(B)/$(MODNAME)/game;fi
	@if [ ! -d $(B)/$(MODNAME)/ui ];then $(MKDIR) $(B)/$(MODNAME)/ui;fi
	
#############################################################################
## CGAME
#############################################################################

Q3CGOBJ = \
  $(B)/$(MODNAME)/cgame/cg_main.o \
  $(B)/$(MODNAME)/cgame/bg_animation.o \
  $(B)/$(MODNAME)/cgame/bg_animgroup.o \
  $(B)/$(MODNAME)/cgame/bg_character.o \
  $(B)/$(MODNAME)/cgame/bg_classes.o \
  $(B)/$(MODNAME)/cgame/bg_misc.o \
  $(B)/$(MODNAME)/cgame/bg_pmove.o \
  $(B)/$(MODNAME)/cgame/bg_slidemove.o \
  $(B)/$(MODNAME)/cgame/bg_sscript.o \
  $(B)/$(MODNAME)/cgame/bg_stats.o \
  $(B)/$(MODNAME)/cgame/bg_tracemap.o \
  $(B)/$(MODNAME)/cgame/ui_shared.o \
  $(B)/$(MODNAME)/cgame/cg_atmospheric.o \
  $(B)/$(MODNAME)/cgame/cg_character.o \
  $(B)/$(MODNAME)/cgame/cg_commandmap.o \
  $(B)/$(MODNAME)/cgame/cg_consolecmds.o \
  $(B)/$(MODNAME)/cgame/cg_crash.o \
  $(B)/$(MODNAME)/cgame/cg_debriefing.o \
  $(B)/$(MODNAME)/cgame/cg_draw.o \
  $(B)/$(MODNAME)/cgame/cg_drawtools.o \
  $(B)/$(MODNAME)/cgame/cg_effects.o \
  $(B)/$(MODNAME)/cgame/cg_ents.o \
  $(B)/$(MODNAME)/cgame/cg_event.o \
  $(B)/$(MODNAME)/cgame/cg_fireteamoverlay.o \
  $(B)/$(MODNAME)/cgame/cg_fireteams.o \
  $(B)/$(MODNAME)/cgame/cg_flamethrower.o \
  $(B)/$(MODNAME)/cgame/cg_hud.o \
  $(B)/$(MODNAME)/cgame/cg_info.o \
  $(B)/$(MODNAME)/cgame/cg_limbopanel.o \
  $(B)/$(MODNAME)/cgame/cg_loadpanel.o \
  $(B)/$(MODNAME)/cgame/cg_localents.o \
  $(B)/$(MODNAME)/cgame/cg_marks.o \
  $(B)/$(MODNAME)/cgame/cg_missionbriefing.o \
  $(B)/$(MODNAME)/cgame/cg_multiview.o \
  $(B)/$(MODNAME)/cgame/cg_newDraw.o \
  $(B)/$(MODNAME)/cgame/cg_osfile.o \
  $(B)/$(MODNAME)/cgame/cg_particles.o \
  $(B)/$(MODNAME)/cgame/cg_players.o \
  $(B)/$(MODNAME)/cgame/cg_playerstate.o \
  $(B)/$(MODNAME)/cgame/cg_polybus.o \
  $(B)/$(MODNAME)/cgame/cg_popupmessages.o \
  $(B)/$(MODNAME)/cgame/cg_predict.o \
  $(B)/$(MODNAME)/cgame/cg_scoreboard.o \
  $(B)/$(MODNAME)/cgame/cg_servercmds.o \
  $(B)/$(MODNAME)/cgame/cg_shoutcaster.o \
  $(B)/$(MODNAME)/cgame/cg_snapshot.o \
  $(B)/$(MODNAME)/cgame/cg_sound.o \
  $(B)/$(MODNAME)/cgame/cg_spawn.o \
  $(B)/$(MODNAME)/cgame/cg_statsranksmedals.o \
  $(B)/$(MODNAME)/cgame/cg_trails.o \
  $(B)/$(MODNAME)/cgame/cg_uid.o \
  $(B)/$(MODNAME)/cgame/cg_view.o \
  $(B)/$(MODNAME)/cgame/cg_weapons.o \
  $(B)/$(MODNAME)/cgame/cg_window.o \
  $(B)/$(MODNAME)/cgame/md5.o \
  $(B)/$(MODNAME)/cgame/q_math.o \
  $(B)/$(MODNAME)/cgame/q_shared.o \
  $(B)/$(MODNAME)/cgame/cg_syscalls.o

ifeq ($(PLATFORM), MorphOS)
	Q3CGOBJ += $(B)/$(MODNAME)/cgame/mos_libnix_so.o
endif

$(B)/$(MODNAME)/cgame$(SHLIBNAME): $(Q3CGOBJ)
	$(echo_cmd) "LD $@"
	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3CGOBJ) $(LIBS_CGAME)
	$(Q)$(STRIP) $(STRIPFLAGS) $@

#############################################################################
## GAME
#############################################################################

Q3GOBJ = \
  $(B)/$(MODNAME)/game/g_main.o \
  $(B)/$(MODNAME)/game/bg_animation.o \
  $(B)/$(MODNAME)/game/bg_animgroup.o \
  $(B)/$(MODNAME)/game/bg_campaign.o \
  $(B)/$(MODNAME)/game/bg_character.o \
  $(B)/$(MODNAME)/game/bg_classes.o \
  $(B)/$(MODNAME)/game/bg_misc.o \
  $(B)/$(MODNAME)/game/bg_pmove.o \
  $(B)/$(MODNAME)/game/bg_slidemove.o \
  $(B)/$(MODNAME)/game/bg_sscript.o \
  $(B)/$(MODNAME)/game/bg_stats.o \
  $(B)/$(MODNAME)/game/bg_tracemap.o \
  $(B)/$(MODNAME)/game/BotLoadLibrary.o \
  $(B)/$(MODNAME)/game/etpro_mdx.o \
  $(B)/$(MODNAME)/game/et-antiwarp.o \
  $(B)/$(MODNAME)/game/geoip.o \
  $(B)/$(MODNAME)/game/g_active.o \
  $(B)/$(MODNAME)/game/g_alarm.o \
  $(B)/$(MODNAME)/game/g_antilag.o \
  $(B)/$(MODNAME)/game/g_buddy_list.o \
  $(B)/$(MODNAME)/game/g_censor.o \
  $(B)/$(MODNAME)/game/g_character.o \
  $(B)/$(MODNAME)/game/g_client.o \
  $(B)/$(MODNAME)/game/g_cmds.o \
  $(B)/$(MODNAME)/game/g_cmds_ext.o \
  $(B)/$(MODNAME)/game/g_combat.o \
  $(B)/$(MODNAME)/game/g_config.o \
  $(B)/$(MODNAME)/game/g_crash.o \
  $(B)/$(MODNAME)/game/g_etbot_interface.o \
  $(B)/$(MODNAME)/game/g_fireteams.o \
  $(B)/$(MODNAME)/game/g_items.o \
  $(B)/$(MODNAME)/game/g_lua.o \
  $(B)/$(MODNAME)/game/g_match.o \
  $(B)/$(MODNAME)/game/g_matchinfo.o \
  $(B)/$(MODNAME)/game/g_mem.o \
  $(B)/$(MODNAME)/game/g_misc.o \
  $(B)/$(MODNAME)/game/g_missile.o \
  $(B)/$(MODNAME)/game/g_mover.o \
  $(B)/$(MODNAME)/game/g_multiview.o \
  $(B)/$(MODNAME)/game/g_player_rating.o \
  $(B)/$(MODNAME)/game/g_props.o \
  $(B)/$(MODNAME)/game/g_referee.o \
  $(B)/$(MODNAME)/game/g_save.o \
  $(B)/$(MODNAME)/game/g_script_actions.o \
  $(B)/$(MODNAME)/game/g_script.o \
  $(B)/$(MODNAME)/game/g_session.o \
  $(B)/$(MODNAME)/game/g_settings.o \
  $(B)/$(MODNAME)/game/g_sha1.o \
  $(B)/$(MODNAME)/game/g_shoutcaster.o \
  $(B)/$(MODNAME)/game/g_shrubbot.o \
  $(B)/$(MODNAME)/game/g_spawn.o \
  $(B)/$(MODNAME)/game/g_stats.o \
  $(B)/$(MODNAME)/game/g_svcmds.o \
  $(B)/$(MODNAME)/game/g_systemmsg.o \
  $(B)/$(MODNAME)/game/g_target.o \
  $(B)/$(MODNAME)/game/g_team.o \
  $(B)/$(MODNAME)/game/g_teammapdata.o \
  $(B)/$(MODNAME)/game/g_trigger.o \
  $(B)/$(MODNAME)/game/g_utils.o \
  $(B)/$(MODNAME)/game/g_vote.o \
  $(B)/$(MODNAME)/game/g_weapon.o \
  $(B)/$(MODNAME)/game/g_xpsave.o \
  $(B)/$(MODNAME)/game/sha1.o \
  $(B)/$(MODNAME)/game/q_math.o \
  $(B)/$(MODNAME)/game/q_shared.o \
  $(B)/$(MODNAME)/game/g_syscalls.o

ifeq ($(PLATFORM), MorphOS)
	Q3GOBJ += $(B)/$(MODNAME)/game/mos_libnix_so.o
endif

$(B)/$(MODNAME)/qagame$(SHLIBNAME): $(Q3GOBJ)
	$(echo_cmd) "LD $@"
	$(Q)$(CXX) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3GOBJ) $(LIBS_GAME)
	$(Q)$(STRIP) $(STRIPFLAGS) $@

#############################################################################
## UI
#############################################################################

Q3UIOBJ = \
  $(B)/$(MODNAME)/ui/bg_campaign.o \
  $(B)/$(MODNAME)/ui/bg_classes.o \
  $(B)/$(MODNAME)/ui/bg_misc.o \
  $(B)/$(MODNAME)/ui/ui_main.o \
  $(B)/$(MODNAME)/ui/ui_atoms.o \
  $(B)/$(MODNAME)/ui/ui_gameinfo.o \
  $(B)/$(MODNAME)/ui/ui_loadpanel.o \
  $(B)/$(MODNAME)/ui/ui_players.o \
  $(B)/$(MODNAME)/ui/ui_shared.o \
  $(B)/$(MODNAME)/ui/ui_util.o \
  $(B)/$(MODNAME)/ui/q_math.o \
  $(B)/$(MODNAME)/ui/q_shared.o \
  $(B)/$(MODNAME)/ui/ui_syscalls.o

ifeq ($(PLATFORM), MorphOS)
	Q3UIOBJ += $(B)/$(MODNAME)/ui/mos_libnix_so.o
endif

$(B)/$(MODNAME)/ui$(SHLIBNAME): $(Q3UIOBJ)
	$(echo_cmd) "LD $@"
	$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3UIOBJ) $(LIBS_UI)
	$(Q)$(STRIP) $(STRIPFLAGS) $@

#############################################################################
## GAME MODULE RULES
#############################################################################

$(B)/$(MODNAME)/cgame/q_%.o: $(GDIR)/q_%.c
	$(DO_CGAME_CC)

$(B)/$(MODNAME)/cgame/bg_%.o: $(GDIR)/bg_%.c
	$(DO_CGAME_CC)

$(B)/$(MODNAME)/cgame/ui_%.o: $(UIDIR)/ui_%.c
	$(DO_CGAME_CC)

$(B)/$(MODNAME)/cgame/%.o: $(CGDIR)/%.c
	$(DO_CGAME_CC)

$(B)/$(MODNAME)/cgame/%.o: $(MD5DIR)/%.c
	$(DO_CGAME_CC)

$(B)/$(MODNAME)/cgame/%.o: $(SYSDIR)/%.c
	$(DO_CGAME_CC)

$(B)/$(MODNAME)/game/%.o: $(SHA1DIR)/%.c
	$(DO_GAME_CC)

$(B)/$(MODNAME)/game/%.o: $(GDIR)/%.c
	$(DO_GAME_CC)

$(B)/$(MODNAME)/game/%.o: $(GDIR)/%.cpp
	$(DO_GAME_CXX)

$(B)/$(MODNAME)/game/%.o: $(BOTAIDIR)/%.cpp
	$(DO_GAME_CXX)

$(B)/$(MODNAME)/game/%.o: $(SYSDIR)/%.c
	$(DO_GAME_CC)

$(B)/$(MODNAME)/ui/q_%.o: $(GDIR)/q_%.c
	$(DO_UI_CC)

$(B)/$(MODNAME)/ui/bg_%.o: $(GDIR)/bg_%.c
	$(DO_UI_CC)

$(B)/$(MODNAME)/ui/%.o: $(UIDIR)/%.c
	$(DO_UI_CC)

$(B)/$(MODNAME)/ui/%.o: $(SYSDIR)/%.c
	$(DO_UI_CC)

#############################################################################
# MISC
#############################################################################

OBJ = $(Q3GOBJ) $(Q3CGOBJ) $(Q3UIOBJ)

clean: clean-debug clean-release

clean-debug:
	@$(MAKE) clean2 B=$(BD)

clean-release:
	@$(MAKE) clean2 B=$(BR)

clean2:
	@echo "CLEAN $(B)"
	@rm -f $(OBJ)
	@rm -f $(OBJ_D_FILES)
	@rm -f $(TARGETS)

distclean: clean
	@rm -rf $(BUILD_DIR)

#############################################################################
# DEPENDENCIES
#############################################################################

ifneq ($(B),)
  OBJ_D_FILES=$(filter %.d,$(OBJ:%.o=%.d))
  -include $(OBJ_D_FILES)
endif

.PHONY: all clean clean2 clean-debug clean-release \
	debug default distclean makedirs \
	release targets \
	$(OBJ_D_FILES)
