#=----------------------------------------------------------------------------=#
#   Makefile                                                                   #
#                                                                              #
#   Copyright © 2021 Libre en Communs (contact@a-lec.org)                      #
#   Copyright © 2021 Adrien Bourmault (neox@a-lec.org)                         #
#                                                                              #
#   This file is part of gem-graph.                                            #
#                                                                              #
#   This program is free software: you can redistribute it and/or modify       #
#   it under the terms of the GNU Affero 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 Affero General Public License for more details.                        #
#                                                                              #
#   You should have received a copy of the GNU Affero General Public License   #
#   along with this program.  If not, see <https://www.gnu.org/licenses/>.     #
#=----------------------------------------------------------------------------=#

.PHONY: all clean install run build_system
.DELETE_ON_ERROR: $(BINDIR)/gem-graph-server
.DEFAULT_GOAL := all

#
# Color codes
#
CL='\033[0;32m'
CL2='\033[1;36m'
CL3='\033[0m'
NC='\033[1;37m'

#
# Variables & constants
#
NTHREADS= $(shell nproc)

CC=gcc
WARNINGS= -Wall
DEBUG= -ggdb -fno-omit-frame-pointer -fdiagnostics-color=always \
	-fsanitize=bounds -fstack-check -fopenmp \
	-fsanitize=address \
	-fsanitize=pointer-compare -fsanitize=pointer-subtract \
	-fsanitize=leak -fsanitize=undefined -fsanitize=null -fsanitize=bounds
OPTIMIZE= -O3
INCLUDE= $(shell pkg-config --cflags glib-2.0 libxml-2.0 gtk4)
LIBS= $(shell pkg-config --libs glib-2.0 libxml-2.0 gtk4) -lGL -lGLU -lm -lepoxy -lX11 -lGLEW

BINDIR=bin
BUILDDIR=build
SRCDIR=src
#vpath %.c $(SRCDIR)

SOURCES= $(shell find $(SRCDIR) -maxdepth 1 -type f -name "*.c")
BUILDBINS=$(patsubst %.c,$(BUILDDIR)/%.o,$(SOURCES))
BUILDDEPS=$(patsubst %.c,$(BUILDDIR)/%.d,$(SOURCES))


-include /etc/os-release

#
# Directories
#
$(BUILDDIR):
	@mkdir -p $@
	@echo -e ${CL2}[$@] ${CL}folder generated.${CL3}

$(BINDIR):
	@mkdir -p $@
	@echo -e ${CL2}[$@] ${CL}folder generated.${CL3}

#
# Dependencies
#
-include $(BUILDDEPS)

$(BUILDDIR)/%.d: %.c | $(BUILDDIR)
	@mkdir -p $(shell dirname $@)
	@$(CC) -MM -MT $(@:%.d=%.o) -MF $@ $<
	@echo -e ${CL2}[$@] ${CL}dependencies generated.${CL3}

#
# Compilation
#
$(BINDIR)/gem-graph-server: $(BUILDBINS) | $(BINDIR)
	@$(CC) -o $@ $(WARNINGS) $(DEBUG) $(OPTIMIZE) $^ $(INCLUDE) $(LIBS)
	@echo -e ${CL2}[$@] ${CL}built.${CL3}


$(BUILDDIR)/%.o: %.c | $(BUILDDIR)
	@mkdir -p $(shell dirname $@)
	@$(CC) $(WARNINGS) $(DEBUG) $(OPTIMIZE) $(INCLUDE) -c $< -o $@
	@echo -e ${CL2}[$@] ${CL}compiled.${CL3}


#
# Virtual recipes
#
clean:
	@rm -rf $(BINDIR)
	@rm -rf $(BUILDDIR)
	@echo -e ${CL2}[$@] ${CL}done.${CL3}

install:
	echo "Installing is not supported"

build_system:
	@echo -e ${CL2}[$@] ${CL}building...${CL3}
	@make $(BINDIR)/gem-graph-server -j $(NTHREADS)
	@echo -e ${CL2}[$@] ${CL}done.${CL3}

run: build_system
	@echo -e ${CL2}[$@] ${CL}executing...${CL3}
	@bin/gem-graph-server -C data/config -M data/models -U data/users
	@echo -e ${CL2}[$@] ${CL}done.${CL3}

debug: build_system
	@echo -e ${CL2}[$@] ${CL}executing...${CL3}
	@gdb $(BINDIR)/gem-graph-server
	@echo -e ${CL2}[$@] ${CL}done.${CL3}

valgrind: build_system
	@echo -e ${CL2}[$@] ${CL}executing...${CL3}
	@valgrind --leak-check=full --show-leak-kinds=all -s  \
	bin/gem-graph-server -C data/config -M data/models -U data/users
	@echo -e ${CL2}[$@] ${CL}done.${CL3}

run-both: build_system
	@echo -e ${CL2}[$@] ${CL}executing...${CL3}
	@bin/gem-graph-server -C data/config -M data/models -U data/users\
		& sleep 1 && bin/gem-graph-ctl
	@echo -e ${CL2}[$@] ${CL}done.${CL3}
run-server: build_system
	@echo -e ${CL2}[$@] ${CL}executing...${CL3}
	@bin/gem-graph-server -C data/config -M data/models -U data/users
	@echo -e ${CL2}[$@] ${CL}done.${CL3}

all:	build_system
	@echo -e ${CL2}[$@] ${CL}done.${CL3}