include ../Make.inc


#CC=mpicc
#FC=mpif90
#FCOPT=-O0 -march=native
#OFFLOAD=-fopenacc -foffload=nvptx-none="-march=sm_70"

LIBDIR=../lib
INCDIR=../include
MODDIR=../modules
IMPLDIR=./impl 

INCLUDES=-I$(LIBDIR) -I$(INCDIR) -I$(MODDIR) 
FINCLUDES=$(FMFLAG). $(FMFLAG)$(INCDIR) $(FMFLAG)$(MODDIR) $(FIFLAG). 
CINCLUDES=
#LIBS=-L$(LIBDIR) -lpsb_util -lpsb_ext -lpsb_base -lopenblas -lmetis


FOBJS= psb_i_oacc_vect_mod.o psb_l_oacc_vect_mod.o \
       psb_s_oacc_vect_mod.o psb_s_oacc_csr_mat_mod.o \
       psb_d_oacc_vect_mod.o psb_d_oacc_csr_mat_mod.o \
       psb_c_oacc_vect_mod.o psb_c_oacc_csr_mat_mod.o \
       psb_z_oacc_vect_mod.o psb_z_oacc_csr_mat_mod.o \
       psb_s_oacc_ell_mat_mod.o psb_s_oacc_hll_mat_mod.o \
       psb_d_oacc_ell_mat_mod.o psb_d_oacc_hll_mat_mod.o \
       psb_c_oacc_ell_mat_mod.o psb_c_oacc_hll_mat_mod.o \
       psb_z_oacc_ell_mat_mod.o psb_z_oacc_hll_mat_mod.o \
       psb_oacc_mod.o   psb_oacc_env_mod.o


LIBNAME=libpsb_openacc.a

OBJS=$(COBJS) $(FOBJS)


lib: objs ilib 
	$(AR) $(LIBNAME) $(OBJS)
	/bin/cp -p $(LIBNAME) $(LIBDIR)

objs: mods $(OBJS) iobjs

mods: $(FOBJS)
	$(INSTALL) -p *$(.mod) $(MODDIR)

iobjs: $(OBJS)
	$(MAKE) -C impl objs 

ilib: $(OBJS)
	$(MAKE) -C impl lib 

psb_oacc_mod.o  : psb_i_oacc_vect_mod.o psb_l_oacc_vect_mod.o \
       psb_s_oacc_vect_mod.o psb_s_oacc_csr_mat_mod.o \
       psb_d_oacc_vect_mod.o psb_d_oacc_csr_mat_mod.o \
       psb_c_oacc_vect_mod.o psb_c_oacc_csr_mat_mod.o \
       psb_z_oacc_vect_mod.o psb_z_oacc_csr_mat_mod.o \
       psb_s_oacc_ell_mat_mod.o psb_s_oacc_hll_mat_mod.o \
       psb_d_oacc_ell_mat_mod.o psb_d_oacc_hll_mat_mod.o \
       psb_c_oacc_ell_mat_mod.o psb_c_oacc_hll_mat_mod.o \
       psb_z_oacc_ell_mat_mod.o psb_z_oacc_hll_mat_mod.o \
       psb_oacc_env_mod.o

psb_s_oacc_vect_mod.o  psb_d_oacc_vect_mod.o \
       psb_c_oacc_vect_mod.o  psb_z_oacc_vect_mod.o: psb_i_oacc_vect_mod.o psb_l_oacc_vect_mod.o psb_oacc_env_mod.o
psb_l_oacc_vect_mod.o: psb_i_oacc_vect_mod.o psb_oacc_env_mod.o
psb_i_oacc_vect_mod.o: psb_oacc_env_mod.o


psb_s_oacc_csr_mat_mod.o psb_s_oacc_ell_mat_mod.o psb_s_oacc_hll_mat_mod.o: psb_s_oacc_vect_mod.o
psb_d_oacc_csr_mat_mod.o psb_d_oacc_ell_mat_mod.o psb_d_oacc_hll_mat_mod.o: psb_d_oacc_vect_mod.o
psb_c_oacc_csr_mat_mod.o psb_c_oacc_ell_mat_mod.o psb_c_oacc_hll_mat_mod.o: psb_c_oacc_vect_mod.o
psb_z_oacc_csr_mat_mod.o psb_z_oacc_ell_mat_mod.o psb_z_oacc_hll_mat_mod.o: psb_z_oacc_vect_mod.o



clean: cclean iclean
	/bin/rm -f  $(FOBJS) *$(.mod) *.a *.smod
veryclean: clean
cclean: 
	/bin/rm -f  $(COBJS) 
iclean:
	$(MAKE) -C impl clean

.c.o:
	$(CC) $(CCOPT) $(CCOPENACC) $(CINCLUDES) $(CDEFINES) -c $< -o $@
.f90.o:
	$(FC) $(FCOPT) $(FCOPENACC) $(FINCLUDES) -c $< -o $@
.F90.o:
	$(FC) $(FCOPT) $(FCOPENACC) $(FINCLUDES) $(FDEFINES) -c $< -o $@
.cpp.o:
	$(CXX) $(CXXOPT) $(CXXOPENACC) $(CXXINCLUDES) $(CXXDEFINES) -c $< -o $@
