# OUTPUT ----------------------------------------------------------------------

OUTPUT_FILE = output/user-material.so

# TOOLS -----------------------------------------------------------------------

GPP = g++
NVCC = nvcc

# FLAGS -----------------------------------------------------------------------

CFLAGS = -O2 -fPIC
NVCCFLAGS = -O2 -Xcompiler -fPIC
INC_GPU	= -I /usr/local/cuda/include

ARCH = \
	-arch=sm_52 \
	-gencode=arch=compute_52,code=sm_52 \
	-gencode=arch=compute_60,code=sm_60 \
	-gencode=arch=compute_70,code=sm_70 \
	-gencode=arch=compute_80,code=sm_80 \
	-gencode=arch=compute_90,code=sm_90 \
	-gencode=arch=compute_90,code=compute_90

# FOLDERS ---------------------------------------------------------------------

DIR_CPP  = user-material
DIR_CPP_OBJ = $(DIR_CPP)/obj

DIR_CUDA  = user-material
DIR_CUDA_OBJ = $(DIR_CUDA)/obj

# SRC/OBJ FILES ---------------------------------------------------------------

vpath %.cpp $(DIR_CPP)
vpath %.cu $(DIR_CUDA)

SRC_CPP  = $(foreach sdir, $(DIR_CPP), $(wildcard $(sdir)/*.cpp))
OBJ_CPP  = $(patsubst $(DIR_CPP)/%.cpp, $(DIR_CPP_OBJ)/%_cpp.o, $(SRC_CPP))

SRC_CUDA = $(foreach sdir, $(DIR_CUDA), $(wildcard $(sdir)/*.cu))
OBJ_CUDA = $(patsubst $(DIR_CUDA)/%.cu, $(DIR_CUDA_OBJ)/%_cu.o, $(SRC_CUDA))

# MAKE RULES ------------------------------------------------------------------

.PHONY: all checkdirs clean

all: checkdirs lib

checkdirs:
	mkdir -p $(DIR_CPP_OBJ)
	mkdir -p output

lib: $(OBJ_CPP) $(OBJ_CUDA)
	@ $(GPP) --shared -o $(OUTPUT_FILE) $(OBJ_CPP) $(OBJ_CUDA)

clean:
	@ rm -f $(DIR_CPP_OBJ)/*.o
	@ rm -f $(OUTPUT_FILE)

# COMPILE SOURCE FILES --------------------------------------------------------

$(DIR_CPP_OBJ)/%_cpp.o: %.cpp
	$(GPP) -c $(CFLAGS) $(INC_GPU) -o $@ $<

$(DIR_CUDA_OBJ)/%_cu.o: %.cu
	$(NVCC) $(ARCH) -c $(NVCCFLAGS) $(INC_GPU) -o $@ $<
