ARCH ?= 64
AUTH ?= 1
JOBS ?=
MINGW32_CC ?= i686-w64-mingw32-gcc
MINGW32_CXX ?= i686-w64-mingw32-g++
WINDOWS_DEP_PREFIX ?=

ENGINE_DIR := dedicated-engine
AUTH_DISABLE_1 := 0
AUTH_DISABLE_0 := 1
AUTH_DISABLE := $(AUTH_DISABLE_$(AUTH))
AUTH_NAME_1 := auth
AUTH_NAME_0 := noauth
AUTH_NAME := $(AUTH_NAME_$(AUTH))
MAKE_JOBS := $(if $(JOBS),-j $(JOBS),)
WINDOWS_I386_ENGINE_OUTPUT := $(ENGINE_DIR)/build-windows-i386/coduo_dedicated_recovered.exe
WINDOWS_I686_ENGINE_OUTPUT := $(ENGINE_DIR)/build-windows-i686/coduo_dedicated_recovered.exe
WINDOWS_I386_MODULE_OUTPUT := game-module/build-windows-i386/uo_game_mp_x86.dll
WINDOWS_I686_MODULE_OUTPUT := game-module/build-windows-i686/uo_game_mp_x86.dll

ifeq ($(ARCH),64)
ENGINE_TARGET := exe
ENGINE_BUILD_VAR := EXE_BUILD_DIR=build-exe-$(AUTH_NAME)
ENGINE_OUTPUT := $(ENGINE_DIR)/build-exe-$(AUTH_NAME)/coduo_lnxded_recovered
else ifeq ($(ARCH),32)
ENGINE_TARGET := exe-i386
ENGINE_BUILD_VAR := EXE_I386_BUILD_DIR=build-i386-$(AUTH_NAME)
ENGINE_OUTPUT := $(ENGINE_DIR)/build-i386-$(AUTH_NAME)/coduo_lnxded_recovered
else
$(error ARCH must be 64 or 32)
endif

ifeq ($(filter $(AUTH),0 1),)
$(error AUTH must be 1 or 0)
endif

.PHONY: all engine engine64 engine32 auth noauth windows windows-i386 \
	windows-i686 clean help

all: engine

engine:
	$(MAKE) $(MAKE_JOBS) -C $(ENGINE_DIR) CODUO_DISABLE_SERVER_AUTH=$(AUTH_DISABLE) $(ENGINE_BUILD_VAR) $(ENGINE_TARGET)
	@printf 'Built %s\n' '$(ENGINE_OUTPUT)'

engine64:
	$(MAKE) ARCH=64 AUTH=$(AUTH) JOBS="$(JOBS)" engine

engine32:
	$(MAKE) ARCH=32 AUTH=$(AUTH) JOBS="$(JOBS)" engine

auth:
	$(MAKE) ARCH=$(ARCH) AUTH=1 JOBS="$(JOBS)" engine

noauth:
	$(MAKE) ARCH=$(ARCH) AUTH=0 JOBS="$(JOBS)" engine

windows: windows-i686

windows-i386:
	$(MAKE) $(MAKE_JOBS) -C $(ENGINE_DIR) \
		CODUO_DISABLE_SERVER_AUTH=$(AUTH_DISABLE) \
		MINGW32_CC="$(MINGW32_CC)" MINGW32_CXX="$(MINGW32_CXX)" \
		WINDOWS_DEP_PREFIX="$(WINDOWS_DEP_PREFIX)" windows-i386
	$(MAKE) $(MAKE_JOBS) -C game-module MINGW32_CC="$(MINGW32_CC)" windows-i386
	@printf 'Built %s\n' '$(WINDOWS_I386_ENGINE_OUTPUT)'
	@printf 'Built %s\n' '$(WINDOWS_I386_MODULE_OUTPUT)'

windows-i686:
	$(MAKE) $(MAKE_JOBS) -C $(ENGINE_DIR) \
		CODUO_DISABLE_SERVER_AUTH=$(AUTH_DISABLE) \
		MINGW32_CC="$(MINGW32_CC)" MINGW32_CXX="$(MINGW32_CXX)" \
		WINDOWS_DEP_PREFIX="$(WINDOWS_DEP_PREFIX)" windows-i686
	$(MAKE) $(MAKE_JOBS) -C game-module MINGW32_CC="$(MINGW32_CC)" windows-i686
	@printf 'Built %s\n' '$(WINDOWS_I686_ENGINE_OUTPUT)'
	@printf 'Built %s\n' '$(WINDOWS_I686_MODULE_OUTPUT)'

clean:
	$(MAKE) -C $(ENGINE_DIR) clean

help:
	@printf '%s\n' \
	  'Targets: engine engine64 engine32 auth noauth windows windows-i386 windows-i686 clean' \
	  'Options:' \
	  '  ARCH=64|32    Build 64-bit or 32-bit dedicated engine executable. Default: 64' \
	  '  AUTH=1|0      Build with server authorization or disabled authorization. Default: 1' \
	  '  JOBS=N        Optional make parallelism passed to the engine build.' \
	  '  MINGW32_CC=compiler  MinGW 32-bit C compiler. Default: i686-w64-mingw32-gcc' \
	  '  MINGW32_CXX=compiler MinGW 32-bit C++ compiler. Default: i686-w64-mingw32-g++' \
	  '  WINDOWS_DEP_PREFIX=/path  MinGW zlib prefix for Windows engine builds.' \
	  '' \
	  'Examples:' \
	  '  make' \
	  '  make ARCH=32' \
	  '  make AUTH=0' \
	  '  make engine32 AUTH=0 JOBS=8' \
	  '  make windows-i386' \
	  '  make windows-i686 JOBS=8'
