# This is the Makefile for the ptx2 project
#
# The ptx2 project provides some CPU-only libraries and executables,
# and some GPU/CUDA-enabled libraries and executables.
#
# This Makefile can be used in one of three modes:
#  - make:             Compile/install only CPU code
#  - make gpu=1:       Compile/install both CPU and GPU code
#  - make cpu=0 gpu=1: Compile/install only GPU code
#  - make cpu=0 gpu=0: Compile/install nothing
#
# The common build files from the fsl/base project provide a number of
# other options for compiling CUDA projects - refer to that project
# for more details.

# Note that using gpu=1 only compiles/installs the probtrackx2_gpuX.Y
# binary - all other GPU-related (but which don't require a GPU to run)
# scripts and binaries are compiled/installed as part of the cpu=1 build.
#
# The Python-based fsl_streamlines tool is installed as part of the
# cpu=1 build.
#
include $(FSLCONFDIR)/default.mk

PROJNAME = ptx2
LIBS     = -lfsl-newmeshclass -lfsl-warpfns -lfsl-basisfield \
           -lfsl-surface -lfsl-vtkio -lfsl-meshclass -lfsl-newimage \
           -lfsl-utils -lfsl-miscmaths -lfsl-NewNifti -lfsl-giftiio \
           -lfsl-first_lib -lfsl-znz -lfsl-cprob -lfsl-utils -lexpat
XFILES   =
SCRIPTS  =

cpu ?= 1
gpu ?= 0

ifeq (${cpu}, 1)
    XFILES  += probtrackx2 surfmaths surf2surf surf2volume \
               surf_proj label2surf find_the_biggest proj_thresh \
               fdt_matrix_merge
    SCRIPTS += probtrackx2_gpu

# fsl_streamlines
# pyinstall:
# 	${FSLDIR}/bin/python -m pip install ./fsl_streamlines \
# 	    --prefix ${PREFIX} --no-deps --ignore-installed \
# 	    --no-cache-dir -vvv
endif

# The probtrackx2_gpu executable is labelled
# with the CUDA version it is compiled against.
ifeq (${gpu}, 1)
    XFILES  += probtrackx2_gpu${CUDA_VER}
endif


all: ${XFILES}

PTX2OBJS = probtrackx.o probtrackxOptions.o streamlines.o ptx_simple.o \
           ptx_seedmask.o ptx_nmasks.o csv.o csv_mesh.o

probtrackx2: $(PTX2OBJS)
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

find_the_biggest: find_the_biggest.o csv_mesh.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

proj_thresh: proj_thresh.o csv_mesh.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

fdt_matrix_ops: fdt_matrix_ops.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

fdt_matrix_split: fdt_matrix_split.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

testfile: testfile.o streamlines.o csv.o csv_mesh.o probtrackxOptions.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

surf_proj: surf_proj.o csv.o csv_mesh.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

fdt_matrix_merge: fdt_matrix_merge.o streamlines.o csv.o csv_mesh.o probtrackxOptions.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

fdt_matrix_4_to_2: fdt_matrix_4_to_2.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

surf2surf: surf2surf.o csv.o csv_mesh.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

surf2volume: surf2volume.o csv.o csv_mesh.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

label2surf: label2surf.o csv_mesh.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

surfmaths: surfmaths.o
	${CXX} ${CXXFLAGS} -o $@ $^ ${LDFLAGS}

PTX2GPUOBJS = probtrackx_gpu.o tractography_gpu.o saveResults_ptxGPU.o \
              CUDA/tractographyInput.o CUDA/tractographyData.o \
              probtrackxOptions.o csv.o csv_mesh.o

tractography_gpu.o: CUDA/tractography_gpu.cu
	$(NVCC) ${NVCCFLAGS} -c -o $@ $< -D EXPOSE_TREACHEROUS

probtrackx_gpu.o: probtrackx_gpu.cc
	$(NVCC) ${NVCCFLAGS} -c -o $@ $< -D EXPOSE_TREACHEROUS

probtrackx2_gpu${CUDA_VER}: ${PTX2GPUOBJS}
	${NVCC} ${NVCCFLAGS} -o $@ $^ ${NVCCLDFLAGS}
