# General Makefile containing all the necessary compiler flags for the tests

# modify CC and CFLAGS for OpenMP C compilers
# modify FC and FFLAGS for OpenMP Fortran compilers


# Content:
#########################################################

# 1. Basic usage
# 2. General testsuite settings
# 3. Compiler selection and Flags

#########################################################


#########################################################
# 1. Basic usage
#########################################################
# 	make ctest		generate c test "ctest"
# 	make ftest		generate fortran test "ftest"
#	make clean		removes all sources and binaries
# 	make cleanall	removes sources,binaries and logfiles


#########################################################
# 2. General testsuite settings
#########################################################

# For general testsuite settings see the configuration file
# ompts.conf

#########################################################
# 3. Compiler selection and Flags
#########################################################

# GNU Compiler
CC     = gcc
CFLAGS = -fopenmp -lm -O3
CFLAGS = -fopenmp -lm -O3
FC     = gfortran
FFLAGS = -fopenmp -lm
FFLAGS = -fopenmp -lm -O3


# Fujitsu Compilers:
#CC = fcc
#CFLAGS = -KOMP,fast_GP2=2
#FC=frt
#FFLAGS=-KOMP,fast_GP2=2 -w -Am -X9 -Fixed


# PGI compilers
#CC = pgcc
#CFLAGS = -mp
#CFLAGS = -mp -DVERBOSE
#CFLAGS = -fast -mp

#FC = pgf90
#FFLAGS = -fast -mp
#FFLAGS = -mp -g


# Intel compilers:
#CC = icc
#CFLAGS = -O3 -ip -openmp
#CFLAGS = -Wall -O0 -openmp
#CFLAGS =  -openmp -lm
#CFLAGS =  -openmp -lm -DVERBOSE

#FC = ifort
#FFLAGS = -openmp -lm -fpp

# Omni compilers:
#CC = ompcc
#CFLAGS = -O3 -lm


# Assure compilers:
#CC = assurec
#CFLAGS = -O3 -WApname=project -DUSE_ASSURE=1
#FC =
#FFLAGS =

# NEC:
#CC = c++
#CC = sxc++
#CFLAGS = -Popenmp

#FC=sxf90
#FFLAGS= -Popenmp


# Hitachi:
#CC = xcc
#CFLAGS = -O4 -pvec +Op -parallel -omp
#FC =
#FFLAGS =


# SGI:
#CC = cc
#CFLAGS = -mp -lm
#FC =
#FFLAGS =


# IBM compilers:
#CC = xlc_r
#CFLAGS = -qsmp=omp -lm


#FC=xlf90_r
#FFLAGS=-qsmp=omp -qfixed=132 -qlanglvl=extended


# SUN compilers
#CC = cc
#CFLAGS = -fast -xopenmp -lm

#FC =f90
#FFLAGS = -xopenmp -fast -lm


# open64 compilers
# remark: -I. was a workaround because the installation came without omp.h file
#CC = opencc
#CFLAGS = -O0 -openmp -lm -I. -lomp -lpthread
#CFLAGS = -O0 -openmp -lm -I /home/matthew/opt/usr/include -lpthread
#CFLAGS = -openmp -lm

#FC = openf90
#FFLAGS = -O0 -openmp -lm  -lomp -lpthread


#Pathscale Compiler
#CC = pathcc
#CFLAGS = -mp -Ofast -lm

#FC=pathf90
#FFLAGS= -mp -Ofast -lm


#OpenUH Compiler
#CC = uhcc
#CFLAGS = -mp

#FC = uhf90
#FFLAGS = -mp

#########################################################################

help:
	@echo "OpenMP Validation Suite, v3.0"
	@echo "(C) University of Stuttgart, University of Houston"
	@echo ""
	@echo "Do make [rule], where rule may be one of:"
	@echo "  ctest"
	@echo "    Build and run the OpenMP/C validation tests."
	@echo "  ftest"
	@echo "    Build and run the OpenMP/Fortran validation tests."
	@echo "  print_compile_options"
	@echo "    Display the default compiler and compiler options being tested"
	@echo "  cleansrcs"
	@echo "    Remove sources generated from the templates"
	@echo "  cleanbins"
	@echo "    Remove executables from bin/ directory"
	@echo "  cleanouts"
	@echo "    Remove all *.out files from bin/ directory"
	@echo "  cleanlogs"
	@echo "    Remove all *.log files from bin/ directory"
	@echo "  clean"
	@echo "    Remove all sources and executables from bin/ directory"
	@echo "  cleanall"
	@echo "    Remove the entire bin/ directory"

omp_my_sleep:
	mkdir -p bin/c
	cp omp_my_sleep.h bin/c/
omp_testsuite: omp_testsuite.h
	mkdir -p bin/c
	cp omp_testsuite.h bin/c/
omp_testsuite.h: ompts-c.conf c/*
	./ompts_makeHeader.pl -f=ompts-c.conf -t=c
.c.o: omp_testsuite omp_my_sleep
	$(CC) $(CFLAGS) -c $<

ctest: omp_my_sleep omp_testsuite
	./runtest.pl --lang=c testlist-c.txt

ftest:
	mkdir -p bin/fortran
	cp omp_testsuite.f bin/fortran
	cp omp_my_sleep.f bin/fortran
	./runtest.pl --lang=fortran testlist-f.txt

print_compile_options:
	@echo "-------------------"
	@echo "C compiler"
	@echo "-------------------"
	@echo "compilation: $(CC) $(CFLAGS)"
	@$(CC) --version
	@echo "-------------------"
	@echo "Fortran compiler"
	@echo "-------------------"
	@echo "compilation: $(FC) $(FFLAGS)"
	@$(FC) --version

cleansrcs:
	find bin/ -iname "*.[cf]" -exec rm {} \;
cleanbins:
	find bin/ -perm /a+x -type f -exec rm {} \;
cleanouts:
	find bin/ -iname "*.out" -exec rm {} \;
cleanlogs:
	find bin/ -iname "*.log" -exec rm {} \;

clean: cleansrcs cleanbins

cleanall:
	rm -rf bin/

