# ===================================================================
# Author: Jean-Michel RICHER
# Email: jean-michel.richer@univ-angers.fr
# Institution: Univ Angers,LERIA, SFR MATHSTIC,F-49000 Angers,France
# ===================================================================

PROJECT_DIR=$(shell pwd)
PROJECT_NAME=$(shell basename $(PROJECT_DIR))
ARCHIVE=$(PROJECT_DIR)/../$(PROJECT_NAME).tgz

# use default GNU compiler
COMPILER=g++

# -------------------------------------------------------------------
# To use the Intel icpx compiler don't forget to source vars.sh
# for example:
#        source /opt/intel/oneapi/compiler/latest/env/vars.sh
# and uncomment next line :
#COMPILER=icpx
# -------------------------------------------------------------------

# -------------------------------------------------------------------
# Compiler and Optimization flags
# -------------------------------------------------------------------

CPP_CMP_FLAGS=-Wall -std=c++14
CPP_OPT_FLAGS=-O3 -march=native

# -------------------------------------------------------------------
# Directories
# -------------------------------------------------------------------

# directory where all compiled files will be sent
BUILD_DIR=build
# directory for binaries .exe
BIN_DIR=$(BUILD_DIR)/bin
# directories for object files .o
OBJ_DIR=$(BUILD_DIR)/obj
# source directory
SRC_DIR=src

# -------------------------------------------------------------------
# TARGETS
# -------------------------------------------------------------------

TARGET_1=$(BIN_DIR)/main_1.exe
TARGET_2 = $(BIN_DIR)/main_2.exe

TARGETS= $(TARGET_1) $(TARGET_2)

all: $(TARGETS)

# -------------------------------------------------------------------
# Rules
# -------------------------------------------------------------------

$(TARGET_1): $(OBJ_DIR)/main_1.o $(OBJ_DIR)/timer.o 
	$(COMPILER) -o $@ $^ $(CPP_OPT_FLAGS)

$(TARGET_2): $(OBJ_DIR)/main_2.o $(OBJ_DIR)/timer.o 
	$(COMPILER) -o $@ $^ $(CPP_OPT_FLAGS)


$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/*.h
	$(COMPILER) -c -o $@ $< $(CPP_CMP_FLAGS) $(CPP_OPT_FLAGS)


# -------------------------------------------------------------------
# Test target
# -------------------------------------------------------------------

test: $(TARGETS)
	@for t in $(TARGETS) ; do \
		echo "======================\n$$t\n======================\n" ; \
		/usr/bin/time -f "user=%U\nelapsed=%e" $$t ; \
	done

	
# -------------------------------------------------------------------
# Clean
# -------------------------------------------------------------------

clean:
	@echo "- clean ..."
	@rm -rf $(OBJ_DIR)/*.o $(BIN_DIR)/*.exe

# -------------------------------------------------------------------
# Archive
# -------------------------------------------------------------------
archive: clean
	@cd .. ;\
	tar -cvzf $(ARCHIVE) $(PROJECT_NAME) ; \
	cd $(PROJECT_DIR) ; \
	echo "- archive is in file: $(ARCHIVE)"
	
	

