#############################################
# Makefile.linux - linux makefile
# Copyright (C) 2017 mittorn

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
##############################################

# Default options - optimized to debug on local machine
CC ?= gcc
CXX ?= g++
CFLAGS ?= -g -O1 -fsigned-char -Wall -Wextra -Wsign-compare -Wno-unknown-pragmas -Wno-missing-field-initializers -Wno-unused-parameter -Wno-unused-but-set-variable
LDFLAGS =
LBITS := $(shell getconf LONG_BIT)
DEPS :=

XASH_COMMIT := $(firstword $(shell git rev-parse --short=6 HEAD) unknown)

ifeq ($(XASH_COMMIT),unknown)
$(warning You seems to build xash3d without git)
$(warning Please use git if you are going to publish your build)
endif

# Pass 64BIT=1 to make arguments to allow amd64 builds
ifneq ($(64BIT),1)
	ifeq ($(LBITS),64)
		LDFLAGS += -m32
		CFLAGS += -m32
	endif
endif

TOPDIR = $(PWD)/..
INCLUDES :=
XASH_SINGLE_BINARY ?= 1
INSTALL_DIR ?= ./install/
ifeq ($(NANOGL),1)
INCLUDES += -Inanogl -Inanogl/GL
endif
INCLUDES += -I/usr/include/SDL2 -Icommon -I../common -I. -I../pm_shared -Iclient -Iserver -Iclient/vgui -Icommon/sdl

#############################
# Preprocessor defines:
#############################
DEFINES = 

# Specify commit hash in version string
DEFINES += -DXASH_BUILD_COMMIT=\"$(XASH_COMMIT)\"


# Only SDL backend exists on linux
ifeq ($(XASH_DEDICATED),1)
   DEFINES += -DXASH_DEDICATED
else
   DEFINES += -DXASH_SDL
   LIBS += -lSDL2
endif

#############################################
# GL/GLES translators.
# You need clone it to engine folder to use
# Only one translator should be enabled
#############################################
ifeq ($(NANOGL),1)
DEFINES += -DXASH_NANOGL -D__MULTITEXTURE_SUPPORT__  -DEGL_LIB=\"libEGL.so\"
endif

ifeq ($(WES),1)
DEFINES += -DXASH_WES -D__MULTITEXTURE_SUPPORT__  -DEGL_LIB=\"libEGL.so\"
endif

ifeq ($(REGAL),1)
DEFINES += -DXASH_REGAL -D__MULTITEXTURE_SUPPORT__  -DEGL_LIB=\"regal/lib/linux-32/libRegal.so\"
LIBS += regal/lib/linux-32/libRegal.so
endif

# Some libc implementations cannot use libdl in static builds, so disable it by default
ifeq ($(XASH_STATIC),1)

    ifneq ($(XASH_STATIC_LIBDL),1)
	DEFINES += -DNO_LIBDL
    endif

    XASH_SINGLE_BINARY := 1
endif

ifneq ($(XASH_STATIC),1)
    LIBS += -ldl
endif

ifeq ($(XASH_STATIC_LIBDL),1)
    LIBS += -ldl
endif

LIBS += -lm -pthread


ifeq ($(XASH_SINGLE_BINARY),1)
    DEFINES += -DSINGLE_BINARY
endif

# Collect files
SRCS_CPP =
SRCS = $(wildcard server/*.c) $(wildcard client/vgui/*.c) $(wildcard client/avi/*.c) $(wildcard common/*.c) $(wildcard common/imagelib/*.c) $(wildcard common/soundlib/*.c) $(wildcard common/soundlib/libmpg/*.c)
ifneq ($(XASH_DEDICATED),1)
	SRCS += $(wildcard client/*.c)
	SRCS += $(wildcard platform/sdl/*.c)
	ifeq ($(WES),1)
		SRCS += $(wildcard gl-wes-v2/src/*.c)
	endif
	ifeq ($(NANOGL),1)
		SRCS_CPP += $(wildcard nanogl/*.cpp)
	endif
endif
OBJS = $(patsubst %.c,obj/%.o,$(SRCS))
OBJS_CPP = $(patsubst %.cpp,obj/%.o,$(SRCS_CPP))

#################################
# Windows DLL loader
# Should be enabled only on i386 builds
#################################
LOADER :=
ifeq ($(XASH_DLL_LOADER),1)
	DEFINES += -DDLL_LOADER
	ifeq ($(XASH_SINGLE_BINARY),1)
		LOADER = libloader.a
	else
		LOADER = libloader.so
	endif
	DEPS += $(LOADER)
	LIBS += $(LOADER)
endif

# Rules for binaries
ifeq ($(XASH_SINGLE_BINARY),0)
	BINARIES = libxash.so
libxash.so : $(OBJS) $(OBJS_CPP) $(DEPS)
		$(CC) -fvisibility=hidden -o libxash.so $(LDFLAGS) -shared $(OBJS) $(OBJS_CPP) $(LIBS)

else
BINARIES = xash
xash: $(OBJS) $(OBJS_CPP) $(DEPS)
ifeq ($(XASH_STATIC),1)
		$(CC) -o xash -static $(LDFLAGS) $(OBJS) $(OBJS_CPP) $(LIBS)
else
		$(CC) -o xash -fvisibility=hidden $(LDFLAGS) $(OBJS) $(OBJS_CPP) $(LIBS)
endif

endif

ifeq ($(XASH_DLL_LOADER),1)
$(LOADER):
	$(MAKE) -f ../loader/Makefile.linux -C ../loader $(LOADER)
	cp ../loader/$(LOADER) .
endif

# Create dirs for object files
DIRS := obj obj/server obj/client/avi obj/client/vgui obj/common/sdl obj/common/imagelib obj/common/soundlib/libmpg obj/platform/sdl obj/nanogl
$(OBJS): | $(DIRS)

$(DIRS) :
	mkdir -p $(DIRS)

# Object rules
obj/%.o : %.c
	$(CC) $(CFLAGS) $(INCLUDES) $(DEFINES) -c "$<" -o "$@"  -Wno-unused-result -fvisibility=hidden

obj/%.o : %.cpp
	$(CXX) $(CFLAGS) $(INCLUDES) $(DEFINES) -c "$<" -o "$@"


default: $(BINARIES)

.PHONY: depend clean list install

clean:
	$(RM) $(OBJS) $(OBJS_CPP) $(BINARIES) ../loader/*.o ../loader/*.a ../loader/*.so $(LOADER)

list:
	@echo Sources:
	@echo $(SRCS)
	@echo C++ Sources:
	@echo $(SRCS_CPP)
	@echo Objects:
	@echo $(OBJS) $(OBJS_CPP)
	@echo Dirs:
	@echo $(DIRS)
	@echo Dependencies:
	@echo $(DEPS)

# Simple install rule
install: $(BINARIES)
	mkdir -p $(INSTALL_DIR)

ifeq ($(XASH_SINGLE_BINARY),1)
	cp xash $(INSTALL_DIR)/xash_bin
else
	cp libxash.so $(INSTALL_DIR)/
	cp libloader.so $(INSTALL_DIR)/
endif