####################################################################
# configure for package gpuR
# Charles E. Determan Jr.
#
# Note - this assumes that when installing from environmental variables
# that the user wants the 64-bit install


CPPFLAGS="PKG_CPPFLAGS=-I../inst/include"
CXXFLAGS="PKG_CXXFLAGS="
LIBS="PKG_LIBS="
BUILD_LIB="BUILD_LIB="

if [ ! -z "OPENCL_FLAGS" ]; then
    echo "OPENCL_FLAGS not set, using default -DCL_HPP_MINIMUM_OPENCL_VERSION=110 -DCL_USE_DEPRECATED_OPENCL_1_2_APIS  -DCL_HPP_TARGET_OPENCL_VERSION=120"
    CPPFLAGS="${CPPFLAGS} -DCL_HPP_MINIMUM_OPENCL_VERSION=110 -DCL_USE_DEPRECATED_OPENCL_1_2_APIS -DCL_HPP_TARGET_OPENCL_VERSION=120"
else
    echo "Using OPENCL_FLAGS = " $OPENCL_FLAGS
fi

# check OS
case `uname` in
    Darwin* )
        echo "Darwin OS"

        if [ ! -z "$OPENCL_LIB" ]; then
            # custom paths
            echo "Using OPENCL_LIB = " $OPENCL_LIB
            LIBS="PKG_LIBS=-L$OPENCL_LIB -framework OpenCL -Wl,-rpath,$OPENCL_LIB"

            if ${OPENCL_INC+"false"}; then
                echo "OPENCL_INC not set, using default include directory"
                OPENCL_INC=/System/Library/Frameworks/OpenCL.framework/Headers/
            else
                echo "Using OPENCL_INC = " $OPENCL_INC
            fi

            CPPFLAGS="${CPPFLAGS} -I'${OPENCL_INC}'"

        elif [ ! -z "$CUDA_HOME" ]; then
            # CUDA SDK
            OPENCL_INC=$CUDA_HOME/include
            CPPFLAGS="${CPPFLAGS} -I'${OPENCL_INC}'"
            LIBS="PKG_LIBS=-L$CUDA_HOME/lib64 -framework OpenCL -Wl,-rpath,$CUDA_HOME/lib64"
        elif [ ! -z "$AMDAPPSDKROOT" ]; then
            # AMD SDK
            OPENCL_INC=$AMDAPPSDKROOT/include
            CPPFLAGS="${CPPFLAGS} -I'${OPENCL_INC}'"
            LIBS="PKG_LIBS=-L$AMDAPPSDKROOT/lib/x86_64 -framework OpenCL -Wl,-rpath,$AMDAPPSDKROOT/lib/x86_64"
        elif [ ! -z "$INTELOCLSDKROOT" ]; then
            # Intel SDK
            echo "using INTELOCLSDKROOT"
            OPENCL_INC=$INTELOCLSDKROOT/include
            CPPFLAGS="${CPPFLAGS} -I'${OPENCL_INC}'"
            LIBS="PKG_LIBS=-L$INTELOCLSDKROOT/lib/x64 -framework -Wl,-rpath,$INTELOCLSDKROOT/lib/x64"
        else
            echo "OPENCL_LIB not set, trying default lib location"
            LIBS="PKG_LIBS=-framework OpenCL"
            #BUILD_LIB="BUILD_LIB=../inst/include/loader/libOpenCL.a"
            
            echo "Checking OpenCL C++ API"

            if ${OPENCL_INC+"false"}; then
                echo "OPENCL_INC not set, using default include directory"
                OPENCL_INC=/System/Library/Frameworks/OpenCL.framework/Headers/
            else
                echo "Using OPENCL_INC = " $OPENCL_INC
            fi
        fi

        if test -e "$OPENCL_INC/cl2.hpp"; then
            CPPFLAGS="${CPPFLAGS} -I$OPENCL_INC -DHAVE_CL_CL2_HPP"
            echo "cl2.hpp header exists"
        else
            if test -e "$OPENCL_INC/cl.hpp"; then
                CPPFLAGS="${CPPFLAGS} -I$OPENCL_INC"
                echo "cl.hpp header exists"
            fi
        fi
        ;;
    Linux* )
        echo "Linux OS"

        if [ ! -z "$OPENCL_LIB" ]; then
            # custom paths
            echo "Using OPENCL_LIB =" $OPENCL_LIB
            LIBS="PKG_LIBS=-L$OPENCL_LIB -lOpenCL -Wl,-rpath,$OPENCL_LIB"
            if ${OPENCL_INC+"false"}; then
                echo "OPENCL_INC not set, using default include directory /usr/include"
                OPENCL_INC=/usr/include
            else
                echo "Using OPENCL_INC = " $OPENCL_INC
            fi
            CPPFLAGS="${CPPFLAGS} -I'${OPENCL_INC}'"

        elif [ ! -z "$CUDA_HOME" ]; then
            # CUDA SDK
            echo "using CUDA_HOME"
            OPENCL_INC=$CUDA_HOME/include
            LIBS="PKG_LIBS=-L$CUDA_HOME/lib64 -lOpenCL -Wl,-rpath,$CUDA_HOME/lib64"
            CPPFLAGS="${CPPFLAGS} -I'${OPENCL_INC}'"

        elif [ ! -z "$AMDAPPSDKROOT" ]; then
            # AMD SDK
            echo "using AMDAPPSDKROOT"
            OPENCL_INC=$AMDAPPSDKROOT/include
            LIBS="PKG_LIBS=-L$AMDAPPSDKROOT/lib/x86_64 -lOpenCL -Wl,-rpath,$AMDAPPSDKROOT/lib/x86_64"
            CPPFLAGS="${CPPFLAGS} -I'${OPENCL_INC}'"

        elif [ ! -z "$INTELOCLSDKROOT" ]; then
            # Intel SDK
            echo "using INTELOCLSDKROOT"
            OPENCL_INC=$INTELOCLSDKROOT/include
            LIBS="PKG_LIBS=-L$INTELOCLSDKROOT/lib/x64 -lOpenCL -Wl,-rpath,$INTELOCLSDKROOT/lib/x64"
            CPPFLAGS="${CPPFLAGS} -I'${OPENCL_INC}'"

        else
        
            # try searching for opencl library
            # if fails, build library from scratch
            
            if [ `ldconfig -p | grep 'libOpenCL\|lOpenCL' | wc -l` > 0 ]; then
                echo "found OpenCL library"
                LIBS="PKG_LIBS=-lOpenCL"
                
                echo "Checking OpenCL C++ API"
    
                if ${OPENCL_INC+"false"}; then
                    echo "OPENCL_INC not set, using default include directory /usr/include"
                    OPENCL_INC=/usr/include/
                else
                    echo "Using OPENCL_INC = " $OPENCL_INC
                fi
                CPPFLAGS="${CPPFLAGS} -I'${OPENCL_INC}'"
            else
                echo "no OpenCL found"
                # exit 1
                
                # setting defaults to compile from source
                echo "OPENCL_LIB not set, will be compiled from source"
                LIBS="PKG_LIBS=-L../inst/include/loader -lOpenCL -pthread"
                BUILD_LIB="BUILD_LIB=../inst/include/loader/libOpenCL.a"
    
                echo "Checking OpenCL C++ API"
    
                if ${OPENCL_INC+"false"}; then
                    echo "OPENCL_INC not set, using default include directory /usr/include"
                    OPENCL_INC=/usr/include/
                else
                    echo "Using OPENCL_INC = " $OPENCL_INC
                fi
                CPPFLAGS="${CPPFLAGS} -I'${OPENCL_INC}'"
            fi
            
        fi

        if test -e "$OPENCL_INC/CL/cl2.hpp"; then
            CPPFLAGS="${CPPFLAGS} -DHAVE_CL_CL2_HPP"
            echo "cl2.hpp header exists"
        else
            if test -e "$OPENCL_INC/CL/cl.hpp"; then
                echo "cl.hpp header exists"
            else
                echo "No OpenCL C++ API found, will use the headers contained in the package"
                CPPFLAGS="${CPPFLAGS} -I. -pthread"
            fi
        fi
        ;;
    Solaris*)
        echo "SOLARIS currently not supported"
    ;;
    *)
        echo "unknown: `uname`"
        ;;
esac

echo 'CXX_STD=CXX11' > src/Makevars
echo "${CPPFLAGS}" >> src/Makevars
echo "${CXXFLAGS}" >> src/Makevars
echo "${LIBS}" >> src/Makevars
echo "${BUILD_LIB}" >> src/Makevars
printf '\n$(SHLIB): $(BUILD_LIB)\n\n' >> src/Makevars
printf '../inst/include/loader/libOpenCL.a:\n' >> src/Makevars
printf '\tcd ../inst/include/loader/ && $(MAKE) libOpenCL.a \\\n' >> src/Makevars
printf '\tCC="$(CC)" CFLAGS="$(ALL_CFLAGS)" AR="$(AR)" RM="$(RM)" \\\n' >> src/Makevars
printf '\tICD_OS=icd_linux\n' >> src/Makevars

echo ""
echo "*********** Generated Makevars file ***********"
cat src/Makevars
echo "***********************************************"
