# CUDA and OpenCL Makefile

default:
	@echo "Choose a build target:"
	@echo "------------------------------------------------"
	@echo "linux-amd-32     x86 CPUs and AMD/ATI GPUs      "
	@echo "linux-amd-64     x86 CPUs and AMD/ATI GPUs      "
	@echo "linux-ibm-32     Power CPUs and Cell processors "
	@echo "linux-nvidia-32  NVIDIA GPUs                    "
	@echo "linux-nvidia-64  NVIDIA GPUs                    "
	@echo "macosx-32        x86 CPUs, various GPUs         "
	@echo "macosx-64        x86 CPUs, various GPUs         "

#ATIOPENCLHOME32 = /Projects/vmd/opencl/amd/ati-stream-sdk-v2.0-beta4-lnx32
#ATIOPENCLHOME64 = /Projects/vmd/opencl/amd/ati-stream-sdk-v2.0-beta4-lnx64
#ATIOPENCLHOME32 = /opt/ati-stream-sdk-v2.01-rhel32
ATIOPENCLHOME32 = /opt/ati-stream-sdk-v2.01-rhel64
ATIOPENCLHOME64 = /opt/ati-stream-sdk-v2.01-rhel64

CUDAHOME     = /usr/local/cuda
#CUDAHOME    = /usr/local/encap/cuda-2.3
#CUDAHOME    = /usr/local/encap/cuda-3.0
CUDACC      = $(CUDAHOME)/bin/nvcc
CUDAINCS    = -I. -I$(CUDAHOME)/common/inc -DUNIX


linux-amd-32:
	$(MAKE) all \
	"OPENCLINC  = -I$(ATIOPENCLHOME32)/include" \
	"OPENCLLIBS = -L$(ATIOPENCLHOME32)/lib/x86 -lOpenCL" \
	"CC = gcc" \
	"CFLAGS = -m32 -O -g" \
	"CXX = g++" \
	"CXXFLAGS = -m32 -O -g" \
	"CXXLFLAGS = -lm -Wl,-rpath,$(ATIOPENCLHOME32)/lib/x86"

linux-amd-64:
	$(MAKE) all \
	"OPENCLINC  = -I$(ATIOPENCLHOME64)/include" \
	"OPENCLLIBS = -L$(ATIOPENCLHOME64)/lib/x86_64 -lOpenCL" \
	"CC = gcc" \
	"CFLAGS = -m64 -O -g" \
	"CXX = g++" \
	"CXXFLAGS = -m64 -O -g" \
	"CXXLFLAGS = -lm -Wl,-rpath,$(ATIOPENCLHOME64)/lib/x86_64"

linux-ibm-32:
	$(MAKE) all \
	"OPENCLINC  = -I/usr/include/CL/inc" \
	"OPENCLLIBS = -lCL" \
	"CC = gcc" \
	"CFLAGS = -m32 -O -g" \
	"CXX = g++" \
	"CXXFLAGS = -m32 -O -g" \
	"CXXLFLAGS = -lm"

#
# No 64-bit IBM OpenCL libs yet?
#
# linux-ibm-64:
#       $(MAKE) all \
#       "OPENCLINC  = -I/usr/include/CL/inc" \
#       "OPENCLLIBS = -lCL" \
#       "CC = gcc" \
#       "CFLAGS = -m64 -O -g" \
#       "CXX = g++" \
#       "CXXFLAGS = -m64 -O -g" \
#       "CXXLFLAGS = -lm"

linux-nvidia-32:
	$(MAKE) all \
	"OPENCLINC  = -I/usr/include/CL/inc" \
	"OPENCLLIBS = -lOpenCL" \
	"CUDAOBJS = CUDAOrbital.o" \
        "CUDACCFLAGS = --machine 32 --ptxas-options=-v -O3 $(CUDAINCS)" \
	"CUDALIBS = -L$(CUDAHOME)/lib -lcudart" \
	"CC = gcc" \
	"CFLAGS = -m32 -O -g -DCUDA" \
	"CXX = g++" \
	"CXXFLAGS = -m32 -O -g -DCUDA" \
	"CXXLFLAGS = -lm -Wl,-rpath,$(CUDAHOME)/lib"

linux-nvidia-64:
	$(MAKE) all \
	"OPENCLINC  = -I/usr/include/CL/inc" \
	"OPENCLLIBS = -lOpenCL" \
	"CUDAOBJS = CUDAOrbital.o" \
        "CUDACCFLAGS = --machine 64 --ptxas-options=-v -O3 $(CUDAINCS)" \
	"CUDALIBS = -L$(CUDAHOME)/lib64 -lcudart" \
	"CC = gcc" \
	"CFLAGS = -m64 -O -g -DCUDA" \
	"CXX = g++" \
	"CXXFLAGS = -m64 -O -g -DCUDA" \
	"CXXLFLAGS = -lm -Wl,-rpath,$(CUDAHOME)/lib64"

macosx-32:
	$(MAKE) all \
	"OPENCLINC  = " \
	"OPENCLLIBS = -framework OpenCL" \
	"CC = gcc" \
	"CFLAGS = -m32 -O -g" \
	"CXX = g++" \
	"CXXFLAGS = -m32 -O -g" \
	"CXXLFLAGS = -lm"

macosx-64:
	$(MAKE) all \
	"OPENCLINC  = " \
	"OPENCLLIBS = -framework OpenCL" \
	"CC = gcc" \
	"CFLAGS = -m64 -O -g" \
	"CXX = g++" \
	"CXXFLAGS = -m64 -O -g" \
	"CXXLFLAGS = -lm"

#CUDAOBJS = CUDAOrbital.o
OPENCLOBJS = OpenCLOrbital.o OpenCLUtils.o
OBJS     = WKFThreads.o WKFUtils.o main.o
BINS     = clorbital

all: $(BINS)

.SUFFIXES: .C .c .cu ..c .i .o

.cu.o:
	$(CUDACC) $(CUDACCFLAGS) -c $<
.c.o:
	$(CC) $(CCFLAGS) $(OPENCLINC) -c $<
.C.o:
	$(CXX) $(CXXFLAGS) $(OPENCLINC) -c $<

clorbital: $(OPENCLOBJS) $(CUDAOBJS) $(OBJS)
	$(CXX) $(CXXFLAGS) $(OPENCLOBJS) $(CUDAOBJS) $(OBJS) -o $@ $(CXXLFLAGS) $(OPENCLLIBS)  $(CUDALIBS)

clean:	
	rm -f $(OPENCLOBJS) CUDAOrbital.o $(CUDAOBJS) $(OBJS) $(BINS) *.cubin *.ptx *.linkinfo

