# ===================================================================
# Author: Jean-Michel RICHER
# Email: jean-michel.richer@univ-angers.fr
# Web: https://leria-info.univ-angers.fr/~jeanmichel.richer/
# Institution: Univ Angers,LERIA, SFR MATHSTIC,F-49000 Angers,France
# Deparment: Computer Science
# Date: June 2023
# ===================================================================

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

NASM=nasm

# 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 -ggdb -m64

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

BUILD_DIR=build
BIN_DIR=$(BUILD_DIR)/bin
OBJ_DIR=$(BUILD_DIR)/obj
SRC_DIR=src

# -------------------------------------------------------------------
# TARGET
# -------------------------------------------------------------------

TARGET=$(BIN_DIR)/main.exe

all: $(TARGET)

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

$(TARGET): $(OBJ_DIR)/main.o $(OBJ_DIR)/timer.o $(OBJ_DIR)/sum_asm.o  
	$(COMPILER) -o $@ $^ $(CPP_OPT_FLAGS)

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

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.nasm 
	$(NASM) -f elf64 -g -F dwarf $< -o $@

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

test: $(TARGET)
	@echo "> run test"
	@/usr/bin/time -f "user=%U\nelapsed=%e" $(TARGET)

	
# -------------------------------------------------------------------
# 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)"
	
	

