#!/bin/sh
set -e

CXX=${1:-g++}

AUTOPKGTEST_TMP=${AUTOPKGTEST_TMP:-$(mktemp -d)}

parallel=$(echo " $DEB_BUILD_OPTIONS " | sed -rn 's/.* parallel=([0-9]+) .*/\1/p')

cp -a /usr/share/doc/nvidia-cuda-toolkit/examples $AUTOPKGTEST_TMP
cd $AUTOPKGTEST_TMP/examples

uname_m="$(uname -m)"

FILTER_OUT=

# Samples/0_Introduction/matrixMulDynlinkJIT/cuda_drvapi_dynlink.c is non-distributable
FILTER_OUT="$FILTER_OUT Samples/0_Introduction/matrixMulDynlinkJIT/Makefile"

if [ "$uname_m" != "amd64" ]; then

# fatal error: cudla.h: No such file or directory
FILTER_OUT="$FILTER_OUT Samples/4_CUDA_Libraries/cuDLAErrorReporting/Makefile"
FILTER_OUT="$FILTER_OUT Samples/4_CUDA_Libraries/cuDLAHybridMode/Makefile"

fi

if [ "$uname_m" = "aarch64" ]; then

#nvlink error   : Undefined reference to '__cudaCDP2GetLastError' in 'cdpAdvancedQuicksort.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2PeekAtLastError' in 'cdpAdvancedQuicksort.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2GetErrorString' in 'cdpAdvancedQuicksort.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2StreamCreateWithFlags' in 'cdpAdvancedQuicksort.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2MemcpyAsync' in 'cdpAdvancedQuicksort.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2GetParameterBufferV2' in 'cdpAdvancedQuicksort.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2LaunchDeviceV2' in 'cdpAdvancedQuicksort.o' (target: sm_87)
FILTER_OUT="$FILTER_OUT Samples/3_CUDA_Features/cdpAdvancedQuicksort/Makefile"

#nvlink error   : Undefined reference to '__cudaCDP2Free' in 'BezierLineCDP.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2Malloc' in 'BezierLineCDP.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2GetParameterBufferV2' in 'BezierLineCDP.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2LaunchDeviceV2' in 'BezierLineCDP.o' (target: sm_87)
FILTER_OUT="$FILTER_OUT Samples/3_CUDA_Features/cdpBezierTessellation/Makefile"

#nvlink error   : Undefined reference to '__cudaCDP2GetParameterBufferV2' in 'cdpQuadtree.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2LaunchDeviceV2' in 'cdpQuadtree.o' (target: sm_87)
FILTER_OUT="$FILTER_OUT Samples/3_CUDA_Features/cdpQuadtree/Makefile"

#nvlink error   : Undefined reference to '__cudaCDP2GetParameterBufferV2' in 'cdpSimplePrint.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2LaunchDeviceV2' in 'cdpSimplePrint.o' (target: sm_87)
FILTER_OUT="$FILTER_OUT Samples/3_CUDA_Features/cdpSimplePrint/Makefile"

#nvlink error   : Undefined reference to '__cudaCDP2StreamCreateWithFlags' in 'cdpSimpleQuicksort.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2StreamDestroy' in 'cdpSimpleQuicksort.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2GetParameterBufferV2' in 'cdpSimpleQuicksort.o' (target: sm_87)
#nvlink error   : Undefined reference to '__cudaCDP2LaunchDeviceV2' in 'cdpSimpleQuicksort.o' (target: sm_87)
FILTER_OUT="$FILTER_OUT Samples/3_CUDA_Features/cdpSimpleQuicksort/Makefile"

fi

if [ "$uname_m" = "ppc64le" ]; then

#undefined reference to `cuEGLStreamConsumerAcquireFrame'
#undefined reference to `cuEGLStreamConsumerConnect'
#undefined reference to `cuEGLStreamConsumerDisconnect'
#undefined reference to `cuEGLStreamConsumerReleaseFrame'
#undefined reference to `cuEGLStreamProducerConnect'
#undefined reference to `cuEGLStreamProducerDisconnect'
#undefined reference to `cuEGLStreamProducerPresentFrame'
#undefined reference to `cuEGLStreamProducerReturnFrame'
#undefined reference to `cuEventCreateFromEGLSync'
#undefined reference to `cuGraphicsEGLRegisterImage'
#undefined reference to `cuGraphicsEGLRegisterImage'
#undefined reference to `cuGraphicsResourceGetMappedEglFrame'
FILTER_OUT="$FILTER_OUT Samples/2_Concepts_and_Techniques/EGLStream_CUDA_CrossGPU/Makefile"
FILTER_OUT="$FILTER_OUT Samples/2_Concepts_and_Techniques/EGLStream_CUDA_Interop/Makefile"
FILTER_OUT="$FILTER_OUT Samples/2_Concepts_and_Techniques/EGLSync_CUDAEvent_Interop/Makefile"

#/usr/include/boost/numeric/interval/detail/ppc_rounding_control.hpp:31:51: error: narrowing conversion of ‘18444492273895866370’ from ‘long long unsigned int’ to ‘boost::long_long_type’ {aka ‘long long int’} [-Wnarrowing]
#/usr/include/boost/numeric/interval/detail/ppc_rounding_control.hpp:32:53: error: narrowing conversion of ‘18444492273895866371’ from ‘long long unsigned int’ to ‘boost::long_long_type’ {aka ‘long long int’} [-Wnarrowing]
#/usr/include/boost/numeric/interval/detail/ppc_rounding_control.hpp:33:55: error: narrowing conversion of ‘18444492273895866368’ from ‘long long unsigned int’ to ‘boost::long_long_type’ {aka ‘long long int’} [-Wnarrowing]
#/usr/include/boost/numeric/interval/detail/ppc_rounding_control.hpp:34:56: error: narrowing conversion of ‘18444492273895866369’ from ‘long long unsigned int’ to ‘boost::long_long_type’ {aka ‘long long int’} [-Wnarrowing]
#1040524
if ! echo '#include <boost/numeric/interval.hpp>' | $CXX -x c++ -c - ; then
	FILTER_OUT="$FILTER_OUT Samples/2_Concepts_and_Techniques/interval/Makefile"
fi

fi

make ${parallel:+-j${parallel}} -k \
	HOST_COMPILER="$CXX" \
	OMPI_CXX="$CXX" \
	DISTRO="ubuntu" \
	EXTRA_NVCCFLAGS="-Wno-deprecated-gpu-targets -Wno-deprecated-declarations" \
	CUDA_INSTALL_TARGET_DIR= \
	FILTER_OUT="$FILTER_OUT" \
