
###############################################################################
#                          MAKEFILE FOR FLCC LIBRARY                          #
#                                 VERSION 1.5                                 #
#                                                                             #
#                             DATE: January 2013                              #
#                           AUTHOR: Georgios Papamakarios                     #
#                     CONTACT INFO: gpapamak@auth.gr                          #
###############################################################################




########################## USER CONTROLLED ACTIONS ############################

# Uncomment the following line if you wish to install FLCC without CUDA
# DEF_NO_CUDA = -D NO_CUDA

# Uncomment the following line if you wish to install FLCC without FFTW
# DEF_NO_FFTW = -D NO_FFTW

# Uncomment the following line to install without the single-precision routines
# DEF_NO_SINGLE_PREC = -D NO_SINGLE_PREC

# Uncomment the following line to install without the double-precision routines
# DEF_NO_DOUBLE_PREC = -D NO_DOUBLE_PREC

# Set the C compiler to be used
CC = g++

# Set the level of optimization during compiling
OPTFLAGS = -O3

# Set the number of threads you would like FLCC to work with
# (a good choice should be the number of CPU cores of your system)
NUM_THREADS = 16

# Set the CUDA compiler to be used 
# (if you wish to install without CUDA, just ignore this)
NCC = nvcc

# Set the CUDA include and library paths
# (if you wish to install without CUDA, just ignore this)
CUDA_INC_PATH = /usr/local/cuda-5.0/include
CUDA_LIB_PATH = /usr/local/cuda-5.0/lib64

# Set the MEX compiler to be used 
# (if you don't wish to install the MATLAB interface, just ignore this)
MEX = mex

# Set the MATLAB include path
# (if you don't wish to install the MATLAB interface, just ignore this)
MATLAB_INC_PATH = /usr/local/MATLAB/R2012b/extern/include

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




############################# GENERAL MACROS ##################################

SRC = ./src
INC = ./inc
LIB = ./lib
OBJ = ./obj
MEXSRC = ./mex/src
MEXBIN = ./mex/bin
MEXOBJ = ./mex/obj
TESTSRC = ./test/src
TESTBIN = ./test/bin
TESTOBJ = ./test/obj

DEF_NUM_CPUS   = -D NUM_CPUS=$(NUM_THREADS)
DEF_THREADS_2D = -D THREADS_2D=16
DEF_THREADS_3D = -D THREADS_3D=8

DEFFLAGS  = $(DEF_NO_CUDA)          $(DEF_NO_FFTW)                            \
            $(DEF_NO_SINGLE_PREC)   $(DEF_NO_DOUBLE_PREC)                     \
            $(DEF_THREADS_2D)       $(DEF_THREADS_3D)                         \
		    $(DEF_NUM_CPUS)  
MEXCFLAGS = -fPIC
CFLAGS    = $(OPTFLAGS)   $(DEFFLAGS)   $(MEXCFLAGS) 
ifdef DEF_NO_DOUBLE_PREC
    CUDA_ARCH = -arch compute_10
else
    CUDA_ARCH = -arch compute_13
endif
NCFLAGS   = $(OPTFLAGS)   $(DEFFLAGS)   $(CUDA_ARCH)   -Xcompiler $(MEXCFLAGS)

INCLUDES   = -I$(INC) -I$(CUDA_INC_PATH) -I$(MATLAB_INC_PATH)
ifdef DEF_NO_CUDA
    LDFLAGS = -L$(LIB) 
else
    LDFLAGS = -L$(LIB) -L$(CUDA_LIB_PATH) -Wl,-rpath=$(CUDA_LIB_PATH)
endif
MEXLDFLAGS = -cxx -largeArrayDims -outdir $(MEXBIN) 

LIBS             = -lflcc -lpthread
CUDA_LIBS        = -lcufft -lcudart
FFTW_SINGLE_LIBS = -lfftw3f -lfftw3f_threads
FFTW_DOUBLE_LIBS = -lfftw3  -lfftw3_threads
FFTW_OTHER_LIBS  = -lm 

ifdef DEF_NO_SINGLE_PREC
    ifdef DEF_NO_DOUBLE_PREC
        FFTW_LIBS = $(FFTW_OTHER_LIBS) 
    else
        FFTW_LIBS = $(FFTW_DOUBLE_LIBS)  $(FFTW_OTHER_LIBS)  
    endif
else
    ifdef DEF_NO_DOUBLE_PREC
        FFTW_LIBS = $(FFTW_SINGLE_LIBS)  $(FFTW_OTHER_LIBS)
    else
        FFTW_LIBS = $(FFTW_SINGLE_LIBS)  $(FFTW_DOUBLE_LIBS)  $(FFTW_OTHER_LIBS)
    endif
endif

ifdef DEF_NO_CUDA
    ifdef DEF_NO_FFTW
        LDLIBS = $(LIBS)
    else
        LDLIBS = $(LIBS)  $(FFTW_LIBS)
    endif
else
    ifdef DEF_NO_FFTW
        LDLIBS = $(LIBS)  $(CUDA_LIBS)
    else
        LDLIBS = $(LIBS)  $(CUDA_LIBS)  $(FFTW_LIBS)
    endif
endif

OBJECTS =                                                                     \
    $(OBJ)/conv2_host.o               $(OBJ)/conv3_host.o                     \
    $(OBJ)/lcorr2_host.o              $(OBJ)/lcorr3_host.o                    \
    $(OBJ)/FLCC_thread_functions_2d.o $(OBJ)/FLCC_thread_functions_3d.o       \
    $(OBJ)/FLCC_host_functions.o                                              \
    $(OBJ)/conv_plan.o                $(OBJ)/lcorr_plan.o                     \
    $(OBJ)/conv_exec.o                $(OBJ)/lcorr_exec.o                     \
    $(OBJ)/conv_destroy.o             $(OBJ)/lcorr_destroy.o                  \
    $(OBJ)/flcc_malloc.o              $(OBJ)/flcc_free.o                      \
    $(OBJ)/conv_plan_t.o              $(OBJ)/lcorr_plan_t.o                   \
    $(OBJ)/conv_exec_t.o              $(OBJ)/lcorr_exec_t.o                   \
    $(OBJ)/conv_destroy_t.o           $(OBJ)/lcorr_destroy_t.o

CUDA_OBJECTS =                                                                \
    $(OBJ)/conv2_dev.o                $(OBJ)/conv3_dev.o                      \
    $(OBJ)/fconv2_dev.o               $(OBJ)/fconv3_dev.o                     \
    $(OBJ)/conv2_testStream_dev.o     $(OBJ)/conv3_testStream_dev.o           \
    $(OBJ)/fconv2_testStream_dev.o    $(OBJ)/fconv3_testStream_dev.o          \
    $(OBJ)/lcorr2_dev.o               $(OBJ)/lcorr3_dev.o                     \
    $(OBJ)/flcorr2_dev.o              $(OBJ)/flcorr3_dev.o                    \
    $(OBJ)/lcorr2_testStream_dev.o    $(OBJ)/lcorr3_testStream_dev.o          \
    $(OBJ)/flcorr2_testStream_dev.o   $(OBJ)/flcorr3_testStream_dev.o         \
    $(OBJ)/FLCC_kernels_2d.o          $(OBJ)/FLCC_kernels_3d.o                \
    $(OBJ)/FLCC_cufft_wrappers.o

FFTW_OBJECTS =                                                                \
    $(OBJ)/fconv2_host.o              $(OBJ)/fconv3_host.o                    \
    $(OBJ)/fconv2_testStream_host.o   $(OBJ)/fconv3_testStream_host.o         \
    $(OBJ)/flcorr2_host.o             $(OBJ)/flcorr3_host.o                   \
    $(OBJ)/flcorr2_testStream_host.o  $(OBJ)/flcorr3_testStream_host.o        \
	$(OBJ)/FLCC_fftw_wrappers.o

MEX_OBJECTS =                                                                 \
    $(MEXOBJ)/conv_plan.o             $(MEXOBJ)/lcorr_plan.o                  \
    $(MEXOBJ)/conv_exec.o             $(MEXOBJ)/lcorr_exec.o                  \
    $(MEXOBJ)/conv_destroy.o          $(MEXOBJ)/lcorr_destroy.o

ifdef DEF_NO_CUDA
    ifdef DEF_NO_FFTW
        ALL_OBJECTS = $(OBJECTS)
    else
        ALL_OBJECTS = $(OBJECTS)  $(FFTW_OBJECTS)
    endif
else
    ifdef DEF_NO_FFTW
        ALL_OBJECTS = $(OBJECTS)  $(CUDA_OBJECTS)
    else
        ALL_OBJECTS = $(OBJECTS)  $(CUDA_OBJECTS)  $(FFTW_OBJECTS)
    endif
endif

ALL_LIBRARIES = $(LIB)/libflcc.a

SINGLE_TESTS =                                                                \
    $(TESTBIN)/conv_compare_2d_f      $(TESTBIN)/conv_compare_3d_f            \
    $(TESTBIN)/conv_get_times_2d_f    $(TESTBIN)/conv_get_times_3d_f          \
    $(TESTBIN)/conv_test_f            $(TESTBIN)/conv_select_f                \
    $(TESTBIN)/lcorr_compare_2d_f     $(TESTBIN)/lcorr_compare_3d_f           \
    $(TESTBIN)/lcorr_get_times_2d_f   $(TESTBIN)/lcorr_get_times_3d_f         \
    $(TESTBIN)/lcorr_test_f           $(TESTBIN)/lcorr_select_f

DOUBLE_TESTS =                                                                \
    $(TESTBIN)/conv_compare_2d_d      $(TESTBIN)/conv_compare_3d_d            \
    $(TESTBIN)/conv_get_times_2d_d    $(TESTBIN)/conv_get_times_3d_d          \
    $(TESTBIN)/conv_test_d            $(TESTBIN)/conv_select_d                \
    $(TESTBIN)/lcorr_compare_2d_d     $(TESTBIN)/lcorr_compare_3d_d           \
    $(TESTBIN)/lcorr_get_times_2d_d   $(TESTBIN)/lcorr_get_times_3d_d         \
    $(TESTBIN)/lcorr_test_d           $(TESTBIN)/lcorr_select_d

ifdef DEF_NO_SINGLE_PREC
    ifdef DEF_NO_DOUBLE_PREC
        ALL_TESTS =
    else
        ALL_TESTS = $(DOUBLE_TESTS)  $(TESTBIN)/test_all_double  
    endif
else
    ifdef DEF_NO_DOUBLE_PREC
        ALL_TESTS = $(SINGLE_TESTS)  $(TESTBIN)/test_all_single
    else
        ALL_TESTS = $(SINGLE_TESTS)  $(TESTBIN)/test_all_single               \
		            $(DOUBLE_TESTS)  $(TESTBIN)/test_all_double
    endif
endif

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




################################# TARGETS #####################################

all:      tests   matlab   install

tests:    $(ALL_TESTS)     

matlab:   $(MEX_OBJECTS)   $(ALL_LIBRARIES)
	$(MEX) $(LDFLAGS) $(LDLIBS) $(MEXLDFLAGS) $(MEXOBJ)/conv_plan.o
	$(MEX) $(LDFLAGS) $(LDLIBS) $(MEXLDFLAGS) $(MEXOBJ)/conv_exec.o
	$(MEX) $(LDFLAGS) $(LDLIBS) $(MEXLDFLAGS) $(MEXOBJ)/conv_destroy.o
	$(MEX) $(LDFLAGS) $(LDLIBS) $(MEXLDFLAGS) $(MEXOBJ)/lcorr_plan.o
	$(MEX) $(LDFLAGS) $(LDLIBS) $(MEXLDFLAGS) $(MEXOBJ)/lcorr_exec.o
	$(MEX) $(LDFLAGS) $(LDLIBS) $(MEXLDFLAGS) $(MEXOBJ)/lcorr_destroy.o

install:  $(ALL_LIBRARIES)

clean:
	-rm  $(OBJ)/*  $(TESTOBJ)/*  $(MEXOBJ)/*                                  \
         $(LIB)/*  $(TESTBIN)/*  $(MEXBIN)/*

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




############################### LINK TESTS ####################################

$(TESTBIN)/test_all_single:
	touch $(TESTBIN)/test_all_single
	echo > $(TESTBIN)/test_all_single
	echo "./conv_compare_2d_f  $(NUM_THREADS)" >> $(TESTBIN)/test_all_single
	echo "./conv_compare_3d_f  $(NUM_THREADS)" >> $(TESTBIN)/test_all_single
	echo "./lcorr_compare_2d_f $(NUM_THREADS)" >> $(TESTBIN)/test_all_single
	echo "./lcorr_compare_3d_f $(NUM_THREADS)" >> $(TESTBIN)/test_all_single
	chmod a+x $(TESTBIN)/test_all_single

$(TESTBIN)/test_all_double:
	touch $(TESTBIN)/test_all_double
	echo > $(TESTBIN)/test_all_double
	echo "./conv_compare_2d_d  $(NUM_THREADS)" >> $(TESTBIN)/test_all_double
	echo "./conv_compare_3d_d  $(NUM_THREADS)" >> $(TESTBIN)/test_all_double
	echo "./lcorr_compare_2d_d $(NUM_THREADS)" >> $(TESTBIN)/test_all_double
	echo "./lcorr_compare_3d_d $(NUM_THREADS)" >> $(TESTBIN)/test_all_double
	chmod a+x $(TESTBIN)/test_all_double

$(TESTBIN)/conv_compare_2d_f:        $(TESTOBJ)/conv_compare_2d_f.o           \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_compare_2d_f.o                                       \
	  -o $(TESTBIN)/conv_compare_2d_f                                         \
	     $(LDLIBS)

$(TESTBIN)/conv_compare_3d_f:        $(TESTOBJ)/conv_compare_3d_f.o           \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_compare_3d_f.o                                       \
	  -o $(TESTBIN)/conv_compare_3d_f                                         \
	     $(LDLIBS)

$(TESTBIN)/conv_get_times_2d_f:      $(TESTOBJ)/conv_get_times_2d_f.o         \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_get_times_2d_f.o                                     \
	  -o $(TESTBIN)/conv_get_times_2d_f                                       \
	     $(LDLIBS)

$(TESTBIN)/conv_get_times_3d_f:      $(TESTOBJ)/conv_get_times_3d_f.o         \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_get_times_3d_f.o                                     \
	  -o $(TESTBIN)/conv_get_times_3d_f                                       \
	     $(LDLIBS)

$(TESTBIN)/conv_test_f:              $(TESTOBJ)/conv_test_f.o                 \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_test_f.o                                             \
	  -o $(TESTBIN)/conv_test_f                                               \
	     $(LDLIBS)

$(TESTBIN)/conv_select_f:            $(TESTOBJ)/conv_select_f.o               \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_select_f.o                                           \
	  -o $(TESTBIN)/conv_select_f                                             \
	     $(LDLIBS)

$(TESTBIN)/lcorr_compare_2d_f:       $(TESTOBJ)/lcorr_compare_2d_f.o          \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_compare_2d_f.o                                      \
	  -o $(TESTBIN)/lcorr_compare_2d_f                                        \
	     $(LDLIBS)

$(TESTBIN)/lcorr_compare_3d_f:       $(TESTOBJ)/lcorr_compare_3d_f.o          \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_compare_3d_f.o                                      \
	  -o $(TESTBIN)/lcorr_compare_3d_f                                        \
	     $(LDLIBS)

$(TESTBIN)/lcorr_get_times_2d_f:     $(TESTOBJ)/lcorr_get_times_2d_f.o        \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_get_times_2d_f.o                                    \
	  -o $(TESTBIN)/lcorr_get_times_2d_f                                      \
	     $(LDLIBS)

$(TESTBIN)/lcorr_get_times_3d_f:     $(TESTOBJ)/lcorr_get_times_3d_f.o        \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_get_times_3d_f.o                                    \
	  -o $(TESTBIN)/lcorr_get_times_3d_f                                      \
	     $(LDLIBS)

$(TESTBIN)/lcorr_test_f:             $(TESTOBJ)/lcorr_test_f.o                \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_test_f.o                                            \
	  -o $(TESTBIN)/lcorr_test_f                                              \
	     $(LDLIBS)

$(TESTBIN)/lcorr_select_f:           $(TESTOBJ)/lcorr_select_f.o              \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_select_f.o                                          \
	  -o $(TESTBIN)/lcorr_select_f                                            \
	     $(LDLIBS)

$(TESTBIN)/conv_compare_2d_d:        $(TESTOBJ)/conv_compare_2d_d.o           \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_compare_2d_d.o                                       \
	  -o $(TESTBIN)/conv_compare_2d_d                                         \
	     $(LDLIBS)

$(TESTBIN)/conv_compare_3d_d:        $(TESTOBJ)/conv_compare_3d_d.o           \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_compare_3d_d.o                                       \
	  -o $(TESTBIN)/conv_compare_3d_d                                         \
	     $(LDLIBS)

$(TESTBIN)/conv_get_times_2d_d:      $(TESTOBJ)/conv_get_times_2d_d.o         \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_get_times_2d_d.o                                     \
	  -o $(TESTBIN)/conv_get_times_2d_d                                       \
	     $(LDLIBS)

$(TESTBIN)/conv_get_times_3d_d:      $(TESTOBJ)/conv_get_times_3d_d.o         \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_get_times_3d_d.o                                     \
	  -o $(TESTBIN)/conv_get_times_3d_d                                       \
	     $(LDLIBS)

$(TESTBIN)/conv_test_d:              $(TESTOBJ)/conv_test_d.o                 \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_test_d.o                                             \
	  -o $(TESTBIN)/conv_test_d                                               \
	     $(LDLIBS)

$(TESTBIN)/conv_select_d:            $(TESTOBJ)/conv_select_d.o               \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/conv_select_d.o                                           \
	  -o $(TESTBIN)/conv_select_d                                             \
	     $(LDLIBS)

$(TESTBIN)/lcorr_compare_2d_d:       $(TESTOBJ)/lcorr_compare_2d_d.o          \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_compare_2d_d.o                                      \
	  -o $(TESTBIN)/lcorr_compare_2d_d                                        \
	     $(LDLIBS)

$(TESTBIN)/lcorr_compare_3d_d:       $(TESTOBJ)/lcorr_compare_3d_d.o          \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_compare_3d_d.o                                      \
	  -o $(TESTBIN)/lcorr_compare_3d_d                                        \
	     $(LDLIBS)

$(TESTBIN)/lcorr_get_times_2d_d:     $(TESTOBJ)/lcorr_get_times_2d_d.o        \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_get_times_2d_d.o                                    \
	  -o $(TESTBIN)/lcorr_get_times_2d_d                                      \
	     $(LDLIBS)

$(TESTBIN)/lcorr_get_times_3d_d:     $(TESTOBJ)/lcorr_get_times_3d_d.o        \
                                     $(LIB)/libflcc.a
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_get_times_3d_d.o                                    \
	  -o $(TESTBIN)/lcorr_get_times_3d_d                                      \
	     $(LDLIBS)

$(TESTBIN)/lcorr_test_d:             $(TESTOBJ)/lcorr_test_d.o                \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_test_d.o                                            \
	  -o $(TESTBIN)/lcorr_test_d                                              \
	     $(LDLIBS)

$(TESTBIN)/lcorr_select_d:           $(TESTOBJ)/lcorr_select_d.o              \
                                     $(LIB)/libflcc.a 
	$(CC) $(CFLAGS) $(LDFLAGS)                                                \
	     $(TESTOBJ)/lcorr_select_d.o                                          \
	  -o $(TESTBIN)/lcorr_select_d                                            \
	     $(LDLIBS)
###############################################################################




############################ COMPILE TESTS ####################################

$(TESTOBJ)/conv_compare_2d_f.o:      $(TESTSRC)/single/conv_compare_2d_f.c    \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/conv_compare_2d_f.c                                \
	  -o $(TESTOBJ)/conv_compare_2d_f.o 

$(TESTOBJ)/conv_compare_3d_f.o:      $(TESTSRC)/single/conv_compare_3d_f.c    \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/conv_compare_3d_f.c                                \
	  -o $(TESTOBJ)/conv_compare_3d_f.o 

$(TESTOBJ)/conv_get_times_2d_f.o:    $(TESTSRC)/single/conv_get_times_2d_f.c  \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/conv_get_times_2d_f.c                              \
	  -o $(TESTOBJ)/conv_get_times_2d_f.o 

$(TESTOBJ)/conv_get_times_3d_f.o:    $(TESTSRC)/single/conv_get_times_3d_f.c  \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/conv_get_times_3d_f.c                              \
	  -o $(TESTOBJ)/conv_get_times_3d_f.o 

$(TESTOBJ)/conv_test_f.o:            $(TESTSRC)/single/conv_test_f.c          \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/conv_test_f.c                                      \
	  -o $(TESTOBJ)/conv_test_f.o 

$(TESTOBJ)/conv_select_f.o:          $(TESTSRC)/single/conv_select_f.c        \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/conv_select_f.c                                    \
	  -o $(TESTOBJ)/conv_select_f.o 

$(TESTOBJ)/lcorr_compare_2d_f.o:     $(TESTSRC)/single/lcorr_compare_2d_f.c   \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/lcorr_compare_2d_f.c                               \
	  -o $(TESTOBJ)/lcorr_compare_2d_f.o 

$(TESTOBJ)/lcorr_compare_3d_f.o:     $(TESTSRC)/single/lcorr_compare_3d_f.c   \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/lcorr_compare_3d_f.c                               \
	  -o $(TESTOBJ)/lcorr_compare_3d_f.o 

$(TESTOBJ)/lcorr_get_times_2d_f.o:   $(TESTSRC)/single/lcorr_get_times_2d_f.c \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/lcorr_get_times_2d_f.c                             \
	  -o $(TESTOBJ)/lcorr_get_times_2d_f.o 

$(TESTOBJ)/lcorr_get_times_3d_f.o:   $(TESTSRC)/single/lcorr_get_times_3d_f.c \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/lcorr_get_times_3d_f.c                             \
	  -o $(TESTOBJ)/lcorr_get_times_3d_f.o 

$(TESTOBJ)/lcorr_test_f.o:           $(TESTSRC)/single/lcorr_test_f.c         \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/lcorr_test_f.c                                     \
	  -o $(TESTOBJ)/lcorr_test_f.o 

$(TESTOBJ)/lcorr_select_f.o:         $(TESTSRC)/single/lcorr_select_f.c       \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/single/lcorr_select_f.c                                   \
	  -o $(TESTOBJ)/lcorr_select_f.o 

$(TESTOBJ)/conv_compare_2d_d.o:      $(TESTSRC)/double/conv_compare_2d_d.c    \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/conv_compare_2d_d.c                                \
	  -o $(TESTOBJ)/conv_compare_2d_d.o 

$(TESTOBJ)/conv_compare_3d_d.o:      $(TESTSRC)/double/conv_compare_3d_d.c    \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/conv_compare_3d_d.c                                \
	  -o $(TESTOBJ)/conv_compare_3d_d.o 

$(TESTOBJ)/conv_get_times_2d_d.o:    $(TESTSRC)/double/conv_get_times_2d_d.c  \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/conv_get_times_2d_d.c                              \
	  -o $(TESTOBJ)/conv_get_times_2d_d.o 

$(TESTOBJ)/conv_get_times_3d_d.o:    $(TESTSRC)/double/conv_get_times_3d_d.c  \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/conv_get_times_3d_d.c                              \
	  -o $(TESTOBJ)/conv_get_times_3d_d.o 

$(TESTOBJ)/conv_test_d.o:            $(TESTSRC)/double/conv_test_d.c          \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/conv_test_d.c                                      \
	  -o $(TESTOBJ)/conv_test_d.o 

$(TESTOBJ)/conv_select_d.o:          $(TESTSRC)/double/conv_select_d.c        \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/conv_select_d.c                                    \
	  -o $(TESTOBJ)/conv_select_d.o 

$(TESTOBJ)/lcorr_compare_2d_d.o:     $(TESTSRC)/double/lcorr_compare_2d_d.c   \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/lcorr_compare_2d_d.c                               \
	  -o $(TESTOBJ)/lcorr_compare_2d_d.o 

$(TESTOBJ)/lcorr_compare_3d_d.o:     $(TESTSRC)/double/lcorr_compare_3d_d.c   \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/lcorr_compare_3d_d.c                               \
	  -o $(TESTOBJ)/lcorr_compare_3d_d.o 

$(TESTOBJ)/lcorr_get_times_2d_d.o:   $(TESTSRC)/double/lcorr_get_times_2d_d.c \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/lcorr_get_times_2d_d.c                             \
	  -o $(TESTOBJ)/lcorr_get_times_2d_d.o 

$(TESTOBJ)/lcorr_get_times_3d_d.o:   $(TESTSRC)/double/lcorr_get_times_3d_d.c \
                                     $(TESTSRC)/compare.c                     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/lcorr_get_times_3d_d.c                             \
	  -o $(TESTOBJ)/lcorr_get_times_3d_d.o 

$(TESTOBJ)/lcorr_test_d.o:           $(TESTSRC)/double/lcorr_test_d.c         \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/lcorr_test_d.c                                     \
	  -o $(TESTOBJ)/lcorr_test_d.o 

$(TESTOBJ)/lcorr_select_d.o:         $(TESTSRC)/double/lcorr_select_d.c       \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(TESTSRC)/double/lcorr_select_d.c                                   \
	  -o $(TESTOBJ)/lcorr_select_d.o 
###############################################################################




########################### CREATE LIBRARY FILE ###############################

$(LIB)/libflcc.a:                    $(ALL_OBJECTS)
	ar r  $(LIB)/libflcc.a  $(ALL_OBJECTS)

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




#################### COMPILE MATLAB INTERFACE FUNCTIONS #######################

$(MEXOBJ)/conv_plan.o:               $(MEXSRC)/conv_plan.c                    \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(MEXSRC)/conv_plan.c                                                \
	  -o $(MEXOBJ)/conv_plan.o 

$(MEXOBJ)/conv_exec.o:               $(MEXSRC)/conv_exec.c                    \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(MEXSRC)/conv_exec.c                                                \
	  -o $(MEXOBJ)/conv_exec.o 

$(MEXOBJ)/conv_destroy.o:            $(MEXSRC)/conv_destroy.c                 \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(MEXSRC)/conv_destroy.c                                             \
	  -o $(MEXOBJ)/conv_destroy.o 

$(MEXOBJ)/lcorr_plan.o:              $(MEXSRC)/lcorr_plan.c                   \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(MEXSRC)/lcorr_plan.c                                               \
	  -o $(MEXOBJ)/lcorr_plan.o

$(MEXOBJ)/lcorr_exec.o:              $(MEXSRC)/lcorr_exec.c                   \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(MEXSRC)/lcorr_exec.c                                               \
	  -o $(MEXOBJ)/lcorr_exec.o 

$(MEXOBJ)/lcorr_destroy.o:           $(MEXSRC)/lcorr_destroy.c                \
                                     $(INC)/flcc.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(MEXSRC)/lcorr_destroy.c                                            \
	  -o $(MEXOBJ)/lcorr_destroy.o 

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




#################### COMPILE USER INTERFACE FUNCTIONS #########################

$(OBJ)/conv_plan.o:                  $(SRC)/api/conv_plan.c                   \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/conv_plan.c                                               \
	  -o $(OBJ)/conv_plan.o 

$(OBJ)/conv_exec.o:                  $(SRC)/api/conv_exec.c                   \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/conv_exec.c                                               \
	  -o $(OBJ)/conv_exec.o 

$(OBJ)/conv_destroy.o:               $(SRC)/api/conv_destroy.c                \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/conv_destroy.c                                            \
	  -o $(OBJ)/conv_destroy.o 

$(OBJ)/lcorr_plan.o:                 $(SRC)/api/lcorr_plan.c                  \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/lcorr_plan.c                                              \
	  -o $(OBJ)/lcorr_plan.o 

$(OBJ)/lcorr_exec.o:                 $(SRC)/api/lcorr_exec.c                  \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/lcorr_exec.c                                              \
	  -o $(OBJ)/lcorr_exec.o 

$(OBJ)/lcorr_destroy.o:              $(SRC)/api/lcorr_destroy.c               \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/lcorr_destroy.c                                           \
	  -o $(OBJ)/lcorr_destroy.o 

$(OBJ)/flcc_malloc.o:                $(SRC)/api/flcc_malloc.c                 \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/flcc_malloc.c                                             \
	  -o $(OBJ)/flcc_malloc.o 

$(OBJ)/flcc_free.o:                  $(SRC)/api/flcc_free.c                   \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/flcc_free.c                                               \
	  -o $(OBJ)/flcc_free.o 

$(OBJ)/conv_plan_t.o:				 $(SRC)/api/templates/conv_plan_t.c       \
									 $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/templates/conv_plan_t.c                                   \
	  -o $(OBJ)/conv_plan_t.o

$(OBJ)/conv_exec_t.o:                $(SRC)/api/templates/conv_exec_t.c       \
									 $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/templates/conv_exec_t.c                                   \
	  -o $(OBJ)/conv_exec_t.o

$(OBJ)/conv_destroy_t.o:             $(SRC)/api/templates/conv_destroy_t.c    \
									 $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/templates/conv_destroy_t.c                                \
	  -o $(OBJ)/conv_destroy_t.o

$(OBJ)/lcorr_plan_t.o:				 $(SRC)/api/templates/lcorr_plan_t.c      \
									 $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/templates/lcorr_plan_t.c                                  \
	  -o $(OBJ)/lcorr_plan_t.o

$(OBJ)/lcorr_exec_t.o:               $(SRC)/api/templates/lcorr_exec_t.c      \
									 $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/templates/lcorr_exec_t.c                                  \
	  -o $(OBJ)/lcorr_exec_t.o

$(OBJ)/lcorr_destroy_t.o:            $(SRC)/api/templates/lcorr_destroy_t.c   \
									 $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h                  \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/api/templates/lcorr_destroy_t.c                               \
	  -o $(OBJ)/lcorr_destroy_t.o
###############################################################################




#################### COMPILE CONVOLUTION BASIC FUNCTIONS ######################

$(OBJ)/conv2_dev.o:                  $(SRC)/conv/conv2_dev.cu                 \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/conv/conv2_dev.cu                                             \
	  -o $(OBJ)/conv2_dev.o 

$(OBJ)/conv3_dev.o:                  $(SRC)/conv/conv3_dev.cu                 \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/conv/conv3_dev.cu                                             \
	  -o $(OBJ)/conv3_dev.o 

$(OBJ)/fconv2_dev.o:                 $(SRC)/conv/fconv2_dev.cu                \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/conv/fconv2_dev.cu                                            \
	  -o $(OBJ)/fconv2_dev.o 

$(OBJ)/fconv3_dev.o:                 $(SRC)/conv/fconv3_dev.cu                \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/conv/fconv3_dev.cu                                            \
	  -o $(OBJ)/fconv3_dev.o 

$(OBJ)/conv2_testStream_dev.o:       $(SRC)/conv/conv2_testStream_dev.cu      \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/conv/conv2_testStream_dev.cu                                  \
	  -o $(OBJ)/conv2_testStream_dev.o 

$(OBJ)/conv3_testStream_dev.o:       $(SRC)/conv/conv3_testStream_dev.cu      \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/conv/conv3_testStream_dev.cu                                  \
	  -o $(OBJ)/conv3_testStream_dev.o 

$(OBJ)/fconv2_testStream_dev.o:      $(SRC)/conv/fconv2_testStream_dev.cu     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/conv/fconv2_testStream_dev.cu                                 \
	  -o $(OBJ)/fconv2_testStream_dev.o 

$(OBJ)/fconv3_testStream_dev.o:      $(SRC)/conv/fconv3_testStream_dev.cu     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/conv/fconv3_testStream_dev.cu                                 \
	  -o $(OBJ)/fconv3_testStream_dev.o 

$(OBJ)/conv2_host.o:                 $(SRC)/conv/conv2_host.c                 \
                                     $(INC)/FLCC_general_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/conv/conv2_host.c                                             \
	  -o $(OBJ)/conv2_host.o 

$(OBJ)/conv3_host.o:                 $(SRC)/conv/conv3_host.c                 \
                                     $(INC)/FLCC_general_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/conv/conv3_host.c                                             \
	  -o $(OBJ)/conv3_host.o

$(OBJ)/fconv2_host.o:                $(SRC)/conv/fconv2_host.c                \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/conv/fconv2_host.c                                            \
	  -o $(OBJ)/fconv2_host.o 

$(OBJ)/fconv3_host.o:                $(SRC)/conv/fconv3_host.c                \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/conv/fconv3_host.c                                            \
	  -o $(OBJ)/fconv3_host.o 

$(OBJ)/fconv2_testStream_host.o:     $(SRC)/conv/fconv2_testStream_host.c     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/conv/fconv2_testStream_host.c                                 \
	  -o $(OBJ)/fconv2_testStream_host.o 

$(OBJ)/fconv3_testStream_host.o:     $(SRC)/conv/fconv3_testStream_host.c     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/conv/fconv3_testStream_host.c                                 \
	  -o $(OBJ)/fconv3_testStream_host.o 

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




#################### COMPILE LCC BASIC FUNCTIONS ##############################

$(OBJ)/lcorr2_dev.o:                 $(SRC)/lcorr/lcorr2_dev.cu               \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/lcorr/lcorr2_dev.cu                                           \
	  -o $(OBJ)/lcorr2_dev.o 

$(OBJ)/lcorr3_dev.o:                 $(SRC)/lcorr/lcorr3_dev.cu               \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/lcorr/lcorr3_dev.cu                                           \
	  -o $(OBJ)/lcorr3_dev.o 

$(OBJ)/flcorr2_dev.o:                $(SRC)/lcorr/flcorr2_dev.cu              \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/lcorr/flcorr2_dev.cu                                          \
	  -o $(OBJ)/flcorr2_dev.o 

$(OBJ)/flcorr3_dev.o:                $(SRC)/lcorr/flcorr3_dev.cu              \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/lcorr/flcorr3_dev.cu                                          \
	  -o $(OBJ)/flcorr3_dev.o 

$(OBJ)/lcorr2_testStream_dev.o:      $(SRC)/lcorr/lcorr2_testStream_dev.cu    \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/lcorr/lcorr2_testStream_dev.cu                                \
	  -o $(OBJ)/lcorr2_testStream_dev.o 

$(OBJ)/lcorr3_testStream_dev.o:      $(SRC)/lcorr/lcorr3_testStream_dev.cu    \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/lcorr/lcorr3_testStream_dev.cu                                \
	  -o $(OBJ)/lcorr3_testStream_dev.o 

$(OBJ)/flcorr2_testStream_dev.o:     $(SRC)/lcorr/flcorr2_testStream_dev.cu   \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/lcorr/flcorr2_testStream_dev.cu                               \
	  -o $(OBJ)/flcorr2_testStream_dev.o 

$(OBJ)/flcorr3_testStream_dev.o:     $(SRC)/lcorr/flcorr3_testStream_dev.cu   \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/lcorr/flcorr3_testStream_dev.cu                               \
	  -o $(OBJ)/flcorr3_testStream_dev.o 

$(OBJ)/lcorr2_host.o:                $(SRC)/lcorr/lcorr2_host.c               \
                                     $(INC)/FLCC_general_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/lcorr/lcorr2_host.c                                           \
	  -o $(OBJ)/lcorr2_host.o 

$(OBJ)/lcorr3_host.o:                $(SRC)/lcorr/lcorr3_host.c               \
                                     $(INC)/FLCC_general_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/lcorr/lcorr3_host.c                                           \
	  -o $(OBJ)/lcorr3_host.o 

$(OBJ)/flcorr2_host.o:               $(SRC)/lcorr/flcorr2_host.c              \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/lcorr/flcorr2_host.c                                          \
	  -o $(OBJ)/flcorr2_host.o 

$(OBJ)/flcorr3_host.o:               $(SRC)/lcorr/flcorr3_host.c              \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/lcorr/flcorr3_host.c                                          \
	  -o $(OBJ)/flcorr3_host.o 

$(OBJ)/flcorr2_testStream_host.o:    $(SRC)/lcorr/flcorr2_testStream_host.c   \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/lcorr/flcorr2_testStream_host.c                               \
	  -o $(OBJ)/flcorr2_testStream_host.o 

$(OBJ)/flcorr3_testStream_host.o:    $(SRC)/lcorr/flcorr3_testStream_host.c   \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/lcorr/flcorr3_testStream_host.c                               \
	  -o $(OBJ)/flcorr3_testStream_host.o 

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




#################### COMPILE COMMON BASIC FUNCTIONS ###########################

$(OBJ)/FLCC_fftw_wrappers.o:         $(SRC)/common/FLCC_fftw_wrappers.c       \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/common/FLCC_fftw_wrappers.c                                   \
	  -o $(OBJ)/FLCC_fftw_wrappers.o

$(OBJ)/FLCC_cufft_wrappers.o:        $(SRC)/common/FLCC_cufft_wrappers.cu     \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/common/FLCC_cufft_wrappers.cu                                 \
	  -o $(OBJ)/FLCC_cufft_wrappers.o

$(OBJ)/FLCC_kernels_2d.o:            $(SRC)/common/FLCC_kernels_2d.cu         \
                                     $(SRC)/common/opt/convolution2d_kernel.c \
                                     $(SRC)/common/opt/lcorrelation2d_kernel.c\
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/common/FLCC_kernels_2d.cu                                     \
	  -o $(OBJ)/FLCC_kernels_2d.o

$(OBJ)/FLCC_kernels_3d.o:            $(SRC)/common/FLCC_kernels_3d.cu         \
                                     $(SRC)/common/opt/convolution3d_kernel.c \
                                     $(SRC)/common/opt/lcorrelation3d_kernel.c\
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_cuda_defs.h 
	$(NCC) $(NCFLAGS) $(INCLUDES)                                             \
	  -c $(SRC)/common/FLCC_kernels_3d.cu                                     \
	  -o $(OBJ)/FLCC_kernels_3d.o

$(OBJ)/FLCC_thread_functions_2d.o:   $(SRC)/common/FLCC_thread_functions_2d.c \
                                     $(INC)/gen_direct2_thread.h              \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h 
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/common/FLCC_thread_functions_2d.c                             \
	  -o $(OBJ)/FLCC_thread_functions_2d.o      

$(OBJ)/FLCC_thread_functions_3d.o:   $(SRC)/common/FLCC_thread_functions_3d.c \
                                     $(INC)/gen_direct3_thread.h              \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h 
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/common/FLCC_thread_functions_3d.c                             \
	  -o $(OBJ)/FLCC_thread_functions_3d.o      

$(OBJ)/FLCC_host_functions.o:        $(SRC)/common/FLCC_host_functions.c      \
                                     $(INC)/FLCC_general_defs.h               \
                                     $(INC)/FLCC_fftw_defs.h 
	$(CC) $(CFLAGS) $(INCLUDES)                                               \
	  -c $(SRC)/common/FLCC_host_functions.c                                  \
	  -o $(OBJ)/FLCC_host_functions.o           

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



