CROSS_COMPILE?=
ifneq (,$(CROSS_COMPILE))
CXX:=$(CROSS_COMPILE)g++
endif

BIN?=bin
DAT?=$(BIN)
CXXFLAGS+=-Iextra -Isrc
CXXFLAGS+=-std=c++17

$(BIN)/src/client/%.o: CXXFLAGS+=$(shell pkg-config sdl2 --cflags)
$(BIN)/client.exe: LDFLAGS+=$(shell pkg-config sdl2 --libs)

$(BIN)/src/test_presenter/%.o: CXXFLAGS+=$(shell pkg-config sdl2 --cflags)
$(BIN)/test_presenter.exe: LDFLAGS+=$(shell pkg-config sdl2 --libs)

$(BIN)/src/tools/main_tweaker.cpp.o: CXXFLAGS+=$(shell pkg-config sdl2 --cflags)
$(BIN)/tweaker.exe: LDFLAGS+=$(shell pkg-config sdl2 --libs)

#CXXFLAGS+=-g3
#LDFLAGS+=-g

CXXFLAGS+=-O3

# Reduce executable size
CXXFLAGS+=-ffunction-sections -fdata-sections
LDFLAGS+=-Wl,-gc-sections

CXXFLAGS+=-Wall -Wextra -Werror -Wfatal-errors

HOST:=$(shell $(CXX) -dumpmachine | sed 's/.*-//')

all: all_targets

-include $(HOST).mk

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

include assets/project.mk

$(DAT)/data.pak: $(shell find data) $(DATA_TARGETS)
	@mkdir -p $(dir $@)
	tar czf "$@" data

TARGETS+=$(DAT)/data.pak

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

common.srcs:=\
	src/common/safe_main.cpp\
	src/common/socket_$(HOST).cpp\
	src/common/address.cpp\
	src/common/decompress.cpp\
	src/common/file.cpp\
	src/common/fbx.cpp\
	src/common/gameplay.cpp\
	src/common/gamestate.cpp\
	src/common/kriging.cpp\
	src/common/logger.cpp\
	src/common/matrix4.cpp\
	src/common/physics.cpp\
	src/common/simu.cpp\
	src/common/stats.cpp\
	src/common/string.cpp\
	src/common/time.cpp\
	src/common/vec3.cpp\

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

VERSION=dev
common.srcs+=src/common/version.cpp
$(BIN)/src/common/version.cpp.o: CXXFLAGS+=-D VERSION_STRING='"$(VERSION)"'

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

client.srcs:=\
	extra/glad/glad.cpp\
	src/client/audio.cpp\
	src/client/audio_sdl.cpp\
	src/client/display.cpp\
	src/client/inifile.cpp\
	src/client/presenter.cpp\
	src/client/renderer.cpp\
	src/client/car_decoration.cpp\
	src/client/stage_ingame.cpp\
	src/client/stage_menu.cpp\
	src/client/main.cpp\
	$(common.srcs)\

$(BIN)/client.exe: $(client.srcs:%=$(BIN)/%.o)
TARGETS+=$(BIN)/client.exe

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

test_presenter.srcs:=\
	extra/glad/glad.cpp\
	src/client/audio.cpp\
	src/client/audio_sdl.cpp\
	src/client/display.cpp\
	src/client/inifile.cpp\
	src/client/presenter.cpp\
	src/client/renderer.cpp\
	src/client/car_decoration.cpp\
	src/client/stage_ingame.cpp\
	src/client/stage_menu.cpp\
	src/client/test_presenter.cpp\
	$(common.srcs)\

$(BIN)/test_presenter.exe: $(test_presenter.srcs:%=$(BIN)/%.o)
TARGETS+=$(BIN)/test_presenter.exe

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

server.srcs:=\
	src/server/main.cpp\
	src/server/server.cpp\
	$(common.srcs)\

$(BIN)/server.exe: $(server.srcs:%=$(BIN)/%.o)
TARGETS+=$(BIN)/server.exe

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

profiler.srcs:=\
	src/tools/main_profiler.cpp\
	$(common.srcs)\

$(BIN)/profiler.exe: $(profiler.srcs:%=$(BIN)/%.o)
TARGETS+=$(BIN)/profiler.exe

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

tweaker.srcs:=\
	extra/glad/glad.cpp\
	src/tools/main_tweaker.cpp\
	$(common.srcs)\

$(BIN)/tweaker.exe: $(tweaker.srcs:%=$(BIN)/%.o)
TARGETS+=$(BIN)/tweaker.exe

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

fbxdump.srcs:=\
	src/tools/main_fbxdump.cpp\
	$(common.srcs)\

$(BIN)/fbxdump.exe: $(fbxdump.srcs:%=$(BIN)/%.o)
TARGETS+=$(BIN)/fbxdump.exe

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

unittests.srcs:=\
	src/tests/unittests.cpp\
	src/tests/fbx.cpp\
	src/tests/gameplay.cpp\
	src/tests/server.cpp\
	src/server/server.cpp\
	$(common.srcs)\

$(BIN)/unittests.exe: $(unittests.srcs:%=$(BIN)/%.o)
TARGETS+=$(BIN)/unittests.exe

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

all_targets: $(TARGETS)

$(BIN)/%.exe:
	@mkdir -p $(dir $@)
	$(CXX) -o "$@" $^ $(LDFLAGS)

$(BIN)/%.cpp.o: %.cpp
	@mkdir -p $(dir $@)
	$(CXX) -c $(CXXFLAGS) -o "$@" $<
	@$(CXX) -MM -MT "$@" -c -o "$(BIN)/$*.cpp.o.dep" $< $(CXXFLAGS)

-include $(shell test -d $(BIN) && find $(BIN) -name "*.dep")

clean:
	rm -rf $(BIN) $(DATA_TARGETS)
