# Try to detect operating system
ifeq ($(OS),Windows_NT)
	ifeq ($(shell uname -s),) # not in a bash-like shell
		OS_RM = del /F /Q
		OS_CP = copy
		OS_MKDIR = mkdir
	else # in a bash-like shell, like msys
		OS_RM = rm -rf
		OS_CP = cp -rf
		OS_MKDIR = mkdir -p
	endif
	OS_EXTENSION=.exe
	OS_INC=-I C:\MinGW\lib
else
	OS_RM = rm -rf
	OS_CP = cp -rf
	OS_MKDIR = mkdir -p
	OS_EXTENSION=
	OS_INC=
endif

# Files to compile
# For tests, runeoptimizer.c is not included in the list: is is included from
# each test file with a redefinition of main.
FILES=src/cli/runeoptimizer/runeoptimizer.c src/cli/runeoptimizer/*/*.c
TESTU_FILES=src/cli/test/runeoptimizer_unit_test.c src/cli/runeoptimizer/*/*.c
TESTI_FILES=src/cli/test/runeoptimizer_integration_test.c src/cli/runeoptimizer/*/*.c
TESTE_FILES=src/cli/test/runeoptimizer_e2e_test.c src/cli/runeoptimizer/*/*.c

# Compiler
CC=gcc

# Compiler flags
CFLAGS=
DEBUG_CFLAGS=-Wall -Wextra -g
EXTRA_CFLAGS=-fdump-tree-all

# Libraries for the compiler
LIBS=-lsqlite3 -lm -ljson-c -lpthread

# Include direcotries (Win32 only)
INC=$(OS_INC)

# Optimization options
OPTS=-O3
TESTX_OPTS=
DEBUG_OPTS=

# Output files
OUT_DIR=bin/
OUT_EXT=$(OS_EXTENSION)
OUT_NAME=runeoptimizer
OUT=$(OUT_DIR)$(OUT_NAME)$(OUT_EXT)
DEBUG_OUT_NAME=$(OUT_NAME)_debug
DEBUG_OUT=$(OUT_DIR)$(DEBUG_OUT_NAME)$(OUT_EXT)
TESTU_OUT_NAME=$(OUT_NAME)_test_unit
TESTU_OUT=$(OUT_DIR)$(TESTU_OUT_NAME)$(OUT_EXT)
TESTI_OUT_NAME=$(OUT_NAME)_test_integration
TESTI_OUT=$(OUT_DIR)$(TESTI_OUT_NAME)$(OUT_EXT)
TESTE_OUT_NAME=$(OUT_NAME)_test_e2e
TESTE_OUT=$(OUT_DIR)$(TESTE_OUT_NAME)$(OUT_EXT)

# Instalation directories
INSTALL_CLI_SRC=$(OUT)
INSTALL_GUI_SRC=src/gui/runeoptimizer_gui
INSTALL_DIR_BASE=/usr/share/runeoptimizer/
INSTALL_DIR_EXEC=/usr/local/bin/
INSTALL_CLI_EXEC_SRC=$(INSTALL_DIR_BASE)$(OUT_NAME)$(OUT_EXT)
INSTALL_GUI_EXEC_SRC=$(INSTALL_DIR_BASE)runeoptimizer_gui/runeoptimizer_gui.py
INSTALL_CLI_EXEC_DST=$(INSTALL_DIR_EXEC)$(OUT_NAME)$(OUT_EXT)
INSTALL_GUI_EXEC_DST=$(INSTALL_DIR_EXEC)$(OUT_NAME)_gui$(OUT_EXT)

CMD_DOC=doxygen
CMD_RM=$(OS_RM)
CMD_CP=$(OS_CP)
CMD_MKDIR=$(OS_MKDIR)

# Default, just build RuneOptimizer
default :
	@echo Compiling...
	@$(CC) -o $(OUT) $(CFLAGS) $(FILES) $(INC) $(LIBS) $(OPTS)
	@echo Compiled executable $(OUT)

# Debug, compile with extra flags and no optimization
debug :
	@echo Compiling with debug symbols...
	$(CC) -o $(DEBUG_OUT) $(DEBUG_CFLAGS) $(FILES) $(INC) $(LIBS) $(DEBUG_OPTS)
	@echo Compiled debug executable $(DEBUG_OUT)

# Test, run default and compile the tests.
test : default
	@echo Generating tests...
	@$(CC) -o $(TESTU_OUT) $(TESTU_FILES) $(INC) $(LIBS) $(TESTX_OPTS)
	@echo Compiled testing executable $(TESTU_OUT)
	@$(CC) -o $(TESTI_OUT) $(TESTI_FILES) $(INC) $(LIBS) $(TESTX_OPTS)
	@echo Compiled testing executable $(TESTI_OUT)
	@$(CC) -o $(TESTE_OUT) $(TESTE_FILES) $(INC) $(LIBS) $(TESTX_OPTS)
	@echo Compiled testing executable $(TESTE_OUT)

# Install, install to the system
install :
	@echo Installing...
	@$(CMD_MKDIR) $(INSTALL_DIR_BASE)
	@$(CMD_CP) $(INSTALL_CLI_SRC) $(INSTALL_DIR_BASE)
	@$(CMD_CP) $(INSTALL_GUI_SRC) $(INSTALL_DIR_BASE)
	-@$(CMD_RM) $(INSTALL_CLI_EXEC_DST)
	-@$(CMD_RM) $(INSTALL_GUI_EXEC_DST)
	@ln -s $(INSTALL_CLI_EXEC_SRC) $(INSTALL_CLI_EXEC_DST)
	@ln -s $(INSTALL_GUI_EXEC_SRC) $(INSTALL_GUI_EXEC_DST)
	@echo Installed RuneOptimizer and RuneOptimizerGUI

# Unisnstall, delete every file create by install in the system
uninstall :
	@echo Uninstalling...
	@$(CMD_RM) $(INSTALL_CLI_EXEC_DST)
	@$(CMD_RM) $(INSTALL_GUI_EXEC_DST)
	@$(CMD_RM) $(INSTALL_DIR_BASE)
	@echo RuneOptimizer and RuneOptimizerGUI uninstalled.

# Docs, generate doxygen documentation
docs :
        ifeq ($(shell which $(CMD_DOC)),)
	$(error "No $(CMD_DOC) commannd found. Install it and run 'make doc' to generate documentation")
        else
	@echo Generating documentation...
	@$(CMD_MKDIR) doc/cli
	@$(CMD_MKDIR) doc/gui
	@$(CMD_DOC) doxygen-cli.conf
	@$(CMD_DOC) doxygen-gui.conf 2>/dev/null
	@echo Documentation generated in doc/
        endif

# Clean, remove all geenerated files
clean :
	@echo Cleaning...
	@$(CMD_RM) bin/*
	@$(CMD_RM) doc/*
	@echo All clean
