#!/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)"

NVCC_VERSION=$(nvcc --version | sed -n '/Cuda compilation tools/s/.* V//p')

FILTER_OUT=

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

if dpkg --compare-versions "${NVCC_VERSION}" lt "12.1~" ; then

#LargeKernelParameter.cu(58): Error: Formal parameter space overflowed (4104 bytes required, max 4096 bytes allowed) in function _Z13kernelDefault7param_tPi
#LargeKernelParameter.cu(75): Error: Formal parameter space overflowed (32008 bytes required, max 4096 bytes allowed) in function _Z16kernelLargeParam13param_large_tPi
FILTER_OUT="$FILTER_OUT Samples/6_Performance/LargeKernelParameter/Makefile"

fi

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"

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" \
