# Tested on four different NVIDIA GPUs.

gpp=/usr/bin/g++
MPD=../Norms
CNV=../Convolutions
CUDA=/usr/local/cuda/include
CUDALIB=/usr/local/cuda/lib64
# the architecture flag for Tesla C2050
smflag=sm_20
# the architecture flag for Kepler K20C
# smflag=sm_35
# the architecture flag for Pascal P100
# smflag=sm_60
# the architecture flag for Volta V100
# smflag=sm_70

random_numbers.o:
	@-echo ">>> compiling double random number generators ..."
	$(gpp) -O3 -c -I$(MPD) $(MPD)/random_numbers.cpp

random_series.o:
	@-echo ">>> compiling double random series generators ..."
	$(gpp) -O3 -c -I$(MPD) $(CNV)/random_series.cpp

random_matrices.o:
	@-echo ">>> compiling random_matrices ..."
	$(gpp) -O3 -c -I$(MPD) -I$(CNV) random_matrices.cpp

dbl_convolutions_host.o:
	@-echo ">>> compiling dbl_convolutions_host ..."
	$(gpp) -O3 -c -I$(CNV) $(CNV)/dbl_convolutions_host.cpp

dbl_matrices_host.o:
	@-echo ">>> compiling dbl_matrices_host ..."
	$(gpp) -O3 -c -I$(CNV) dbl_matrices_host.cpp

dbl_matrices_kernels.o:
	@-echo ">>> compiling matrices kernels for doubles ..."
	nvcc -ccbin=$(gpp) -arch=$(smflag) \
             -c dbl_matrices_kernels.cu

dbl_vectors_testers.o:
	@-echo ">>> compiling dbl_vectors_testers ..."
	$(gpp) -O3 -c -I$(CUDA) -I$(MPD) -I$(CNV) dbl_vectors_testers.cpp

test_dbl_vectors.o:
	@-echo ">>> compiling test_dbl_vectors ..."
	$(gpp) -O3 -c -I$(MPD) -I$(CNV) test_dbl_vectors.cpp

test_dbl_vectors: random_numbers.o random_series.o \
                  random_matrices.o dbl_convolutions_host.o \
                  dbl_matrices_host.o dbl_matrices_kernels.o \
                  dbl_vectors_testers.o test_dbl_vectors.o 
	@-echo ">>> linking ..."
	$(gpp) -o test_dbl_vectors test_dbl_vectors.o \
                  random_numbers.o random_series.o random_matrices.o \
                  dbl_convolutions_host.o dbl_matrices_host.o \
                  dbl_matrices_kernels.o dbl_vectors_testers.o \
               -lcuda -lcudart -L$(CUDALIB)

dbl_matrices_testers.o:
	@-echo ">>> compiling dbl_matrices_testers ..."
	$(gpp) -O3 -c -I$(MPD) -I$(CNV) dbl_matrices_testers.cpp

test_dbl_matrices.o:
	@-echo ">>> compiling test_dbl_matrices ..."
	$(gpp) -O3 -c -I$(MPD) -I$(CNV) test_dbl_matrices.cpp

test_dbl_matrices: random_numbers.o random_series.o \
                   random_matrices.o dbl_convolutions_host.o \
                   dbl_linearization.o dbl_matrices_host.o \
                   dbl_matrices_testers.o test_dbl_matrices.o 
	@-echo ">>> linking ..."
	$(gpp) -o test_dbl_matrices test_dbl_matrices.o \
                  random_numbers.o random_series.o random_matrices.o \
                  dbl_convolutions_host.o dbl_linearization.o \
                  dbl_matrices_host.o dbl_matrices_testers.o

test_upper_jobs.o:
	@-echo ">>> compiling test_upper_jobs ..."
	$(gpp) -O3 -c test_upper_jobs.cpp

test_upper_jobs: test_upper_jobs.o
	@-echo ">>> linking ..."
	$(gpp) -o test_upper_jobs test_upper_jobs.o

dbl_linearization.o:
	@-echo ">>> compiling dbl_linearization ..."
	$(gpp) -O3 -c dbl_linearization.cpp

test_dbl_linearization.o:
	@-echo ">>> compiling test_dbl_linearization ..."
	$(gpp) -O3 -c test_dbl_linearization.cpp

test_dbl_linearization: test_dbl_linearization.o random_numbers.o \
                        random_series.o random_matrices.o dbl_linearization.o
	@-echo ">>> linking ..."
	$(gpp) -o test_dbl_linearization test_dbl_linearization.o \
                  random_numbers.o random_series.o random_matrices.o \
                  dbl_linearization.o

clean:
	/bin/rm -f -r random_matrices.o dbl_matrices_host.o
	/bin/rm -f -r dbl_matrices_kernels.o
	/bin/rm -f -r dbl_matrices_testers.o dbl_vectors_testers.o
	/bin/rm -f -r test_dbl_vectors.o test_dbl_vectors
	/bin/rm -f -r test_dbl_matrices.o test_dbl_matrices
	/bin/rm -f -r test_upper_jobs.o test_upper_jobs
	/bin/rm -f -r dbl_linearization.o
	/bin/rm -f -r test_dbl_linearization.o test_dbl_linearization

cleanall: clean
	/bin/rm -f -r random_numbers.o random_series.o
	/bin/rm -f -r dbl_convolutions_host.o
