#!/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/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 'cudaStreamCreateWithFlags' in 'cdpAdvancedQuicksort.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaMemcpyAsync' in 'cdpAdvancedQuicksort.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaGetParameterBufferV2' in 'cdpAdvancedQuicksort.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaLaunchDeviceV2' in 'cdpAdvancedQuicksort.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaPeekAtLastError' in 'cdpAdvancedQuicksort.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaGetErrorString' in 'cdpAdvancedQuicksort.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaGetLastError' in 'cdpAdvancedQuicksort.o' (target: sm_53)
FILTER_OUT="$FILTER_OUT Samples/3_CUDA_Features/cdpAdvancedQuicksort/Makefile"

#nvlink error   : Undefined reference to 'cudaFree' in 'BezierLineCDP.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaMalloc' in 'BezierLineCDP.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaGetParameterBufferV2' in 'BezierLineCDP.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaLaunchDeviceV2' in 'BezierLineCDP.o' (target: sm_53)
FILTER_OUT="$FILTER_OUT Samples/3_CUDA_Features/cdpBezierTessellation/Makefile"

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

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

#nvlink error   : Undefined reference to 'cudaStreamCreateWithFlags' in 'cdpSimpleQuicksort.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaGetParameterBufferV2' in 'cdpSimpleQuicksort.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaLaunchDeviceV2' in 'cdpSimpleQuicksort.o' (target: sm_53)
#nvlink error   : Undefined reference to 'cudaStreamDestroy' in 'cdpSimpleQuicksort.o' (target: sm_53)
FILTER_OUT="$FILTER_OUT Samples/3_CUDA_Features/cdpSimpleQuicksort/Makefile"

#nvlink error   : Undefined reference to 'lut_[sd]p_[0-9]+_[0-9]+' in '/usr/lib/aarch64-linux-gnu/libcufft_static.a:cb{double,float}_32bit_{,bluestein_,prime_}callback_RT_PTX.o' (target: sm_87)
FILTER_OUT="$FILTER_OUT Samples/4_CUDA_Libraries/simpleCUFFT_callback/Makefile"

fi

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

# fatal error: cudaEGL.h: No such file or directory
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" \
