.DEFAULT_GOAL := all

# ======================
# COMPILERS AND LINKERS
# ======================
CPUCC:=gcc
GPUCC:=nvc
# Export default linker
export CC := $(CPUCC)
export LD := $(CPUCC)

# ==================
# FLAGS FOR CPU/GPU 
# ==================
CPUCFLAGS:= -O3 -fPIC $(CFLAGS)
GPUCFLAGS:= -O3 -fPIC $(CFLAGS) --diag_suppress declared_but_not_referenced --diag_suppress pointer_outside_base_object --diag_suppress set_but_not_used

# =================
# PATH FOR MODULES
# =================
COMMON_MODULES := $(wildcard modules-common/*.cpl)
PREPROC_MODULES:= $(wildcard modules-preproc/*.cpl)
SOLVER_MODULES := $(wildcard modules-solver/*.cpl)

# ===================
# PATH FOR LIBRARIES
# ===================
MPI_INC := $(shell mpicc -show | grep -oP '\-I\S+' 2>/dev/null)
MPI_LD := $(shell mpicc -show | grep -oP '\-L\S+|\-Wl\S+' 2>/dev/null)

CFLAGS += $(MPI_INC)
LDFLAGS += $(MPI_LD) 

# =======================================
# TARGET AND CHECK PROGRAM DEFINE MACROS
# =======================================
# Export compilation target to avoid overwrite by CPL .d file
ifeq ($(origin TARGET), undefined)
  TARGET := $(or $(firstword $(MAKECMDGOALS)),all)
endif
export TARGET

# Check if GPU is used
GPU_EXECUTION=$(shell grep -q '^\s*\#define\s\+TARGET_IS_GPU' headers.cpl && echo 1 || echo 0)

# ==============
# CPU/GPU FLAGS
# ==============
CFLAGS:=$(CPUCFLAGS)
ifeq ($(GPU_EXECUTION),1)
  ifeq ($(TARGET),solver)
    CC:=$(GPUCC)
    CFLAGS:=$(GPUCFLAGS)
    LD:=$(GPUCC)
  endif
endif

# ============
# BUILD RULES
# ============
preproc: preproc.cpl $(PREPROC_MODULES) $(COMMON_MODULES) headers.cpl 
	mpicpl preproc

solver: solver.cpl headers.cpl $(SOLVER_MODULES) $(COMMON_MODULES) Makefile   
ifeq ($(GPU_EXECUTION),1)
	mpicpl solver -acc=gpu 
else
	mpicpl solver 
endif

postproc: postproc.cpl headers.cpl $(SOLVER_MODULES) $(COMMON_MODULES)   
	mpicpl postproc

utilities/createChannelSTL: utilities/createChannelSTL.cpl   
	cpl make utilities/createChannelSTL $(CFLAGS)

utilities/interpolator: utilities/interpolator.cpl headers.cpl $(SOLVER_MODULES) $(COMMON_MODULES)   
	mpicpl utilities/interpolator $(LDFLAGS) $(CFLAGS)

clean:
	@find . -type d -name '.cpl' -exec rm -rf {} +
	@rm -f preproc solver postproc utilities/interpolator utilities/createChannelSTL

all: preproc solver postproc utilities/interpolator utilities/createChannelSTL
