# -------------- #
# -- Makefile -- #
# -------------- #

HEADER = nrdef.h nrutil.h macro_debug.h
FILE_MAIN = main.c
FILE_STENCIL = stencil.c 
FILE_STENCIL1 = stencil1_with.c stencil1_without.c
FILE_STENCIL2 = stencil2_with.c
FILE_TEST1 = test_stencil1_with.c test_stencil1_without.c
FILE_TEST2 = test_stencil2_with.c
FILE_NRC = nrutil.c

FILE_HEADER = macro_debug.h
FILE = $(FILE_MAIN) $(FILE_STENCIL) $(FILE_STENCIL1) $(FILE_STENCIL2) $(FILE_TEST1) $(FILE_TEST2) $(FILE_NRC)
 
# -- paths ----------
SRC_PATH = src
OBJ_PATH = obj
EXE_PATH = exe
INC_PATH = include

# -- lib paths ----------
#LIB_LIB_PATH = -L../NRC2/lib
#LIB_INC_PATH = -I../NRC2/include

# -- Macros ----------
CC = gcc

# -- Flags ----------
C_WARNING_FLAGS = -Wno-comment
C_OPTIMISATION_FLAGS = -std=c99 -O1
C_OPTIMISATION_FLAGS = -std=c99 -O3 -ftree-vectorizer-verbose
C_OPTIMISATION_FLAGS = -std=c99 -O3 -fno-tree-vectorize
C_OPTIMISATION_FLAGS = -std=c99 -O1 -fno-tree-vectorize
C_ARCH_FLAGS = -mtune=native -march=native
C_INC_FLAGS = -I$(INC_PATH)

CFLAGS  = $(C_OPTIMISATION_FLAGS) $(C_ARCH_FLAGS) $(C_WARNING_FLAGS) $(C_INC_FLAGS) $(LIB_INC_PATH)
LDFLAGS = $(C_OPTIMISATION_FLAGS) $(C_ARCH_FLAGS) $(C_WARNING_FLAGS) $(C_INC_FLAGS) $(LIB_LIB_PATH)

# -- Final product ----------
PRODUCT   = stencil

# -- src and obj List ----------
SRC = $(addprefix ${SRC_PATH}/, $(FILE))
OBJ = $(addprefix ${OBJ_PATH}/, $(addsuffix .o, $(basename $(FILE))))

# -- Base rules ----------
$(OBJ_PATH)/%.o : $(SRC_PATH)/%.c
	$(CC) $(CFLAGS) -c $< -o $@
   
#-----Main rule ----------
$(EXE_PATH)/$(PRODUCT): $(OBJ)
	$(CC) -o $@ $^ $(LDFLAGS) $(INC) -lm

# -- Other stuff ----------
clean:
	rm -f $(OBJ)
	#rm -f ${LIB_PATH}/${PRODUCT}

