pipeline {
    agent none

    options {
        timeout(time: 6, unit: 'HOURS')
    }

    stages {
        stage('Build') {
            parallel {
                stage('spack-serial') {
                    agent {
                        docker {
                          image 'ubuntu:22.04'
                          label 'docker'
                        }
                    }
                    steps {
                        sh '''
                          DEBIAN_FRONTEND=noninteractive && \
                          apt-get update && apt-get upgrade -y && apt-get install -y \
                          build-essential \
                          wget \
                          git \
                          bc \
                          python3-dev \
                          && \
                          apt-get clean && rm -rf /var/lib/apt/lists/*

                          rm -rf spack && \
                          git clone https://github.com/spack/spack.git && \
                          . ./spack/share/spack/setup-env.sh && \
                          spack install kokkos@develop+tests && \
                          spack load cmake && \
                          spack test run kokkos && \
                          spack test results -l
                          '''
                    }      
                }   
                stage('spack-cuda') {
                    agent {
                        docker {
                          image 'nvidia/cuda:12.1.0-devel-ubuntu22.04'
                          label 'nvidia-docker && ampere'
                        }
                    }
                    steps {
                        sh '''
                          DEBIAN_FRONTEND=noninteractive && \
                          apt-get update && apt-get upgrade -y && apt-get install -y \
                          build-essential \
                          wget \
                          git \
                          bc \
                          python3-dev \
                          gfortran \
                          && \
                          apt-get clean && rm -rf /var/lib/apt/lists/*

                          rm -rf spack && \
                          git clone https://github.com/spack/spack.git && \
                          . ./spack/share/spack/setup-env.sh && \
                          spack install kokkos@develop+cuda+wrapper+tests cuda_arch=80 ^cuda@12.1.0 && \
                          spack load cmake  && \
                          spack load kokkos-nvcc-wrapper && \
                          spack load cuda && \
                          spack load kokkos && \
                          spack test run kokkos && \
                          spack test results -l
                          '''
                    }      
                }   
                stage('GCC-14') {
                    agent {
                        docker {
                            image 'gcc:14.1'
                            label 'docker'
                        }
                    }
                    steps {
                        sh '''
                          wget https://github.com/Kitware/CMake/releases/download/v3.30.0/cmake-3.30.0-linux-x86_64.sh && \
                          chmod +x cmake-3.30.0-linux-x86_64.sh && ./cmake-3.30.0-linux-x86_64.sh --skip-license --prefix=/usr

                          mkdir -p build && cd build && \
                          cmake \
                            -DCMAKE_BUILD_TYPE=Release \
                            -DCMAKE_CXX_STANDARD=26 \
                            -DCMAKE_CXX_FLAGS=-Werror \
                            -DKokkos_ARCH_NATIVE=ON \
                            -DKokkos_ENABLE_COMPILER_WARNINGS=ON \
                            -DKokkos_ENABLE_BENCHMARKS=ON \
                            -DKokkos_ENABLE_EXAMPLES=ON \
                            -DKokkos_ENABLE_TESTS=ON \
                            -DKokkos_ENABLE_DEPRECATED_CODE_4=ON \
                            -DKokkos_ENABLE_SERIAL=ON \
                          .. && \
                          make -j8 && ctest --no-compress-output -T Test --verbose
                          '''
                    }
                    post {
                        always {
                            xunit([CTest(deleteOutputFiles: true, failIfNotNew: true, pattern: 'build/Testing/**/Test.xml', skipNoTestFiles: false, stopProcessingIfError: true)])
                        }
                    }
                }
                stage('HIP-ROCM-6.2') {
                    agent {
                        dockerfile {
                            filename 'Dockerfile.hipcc'
                            dir 'scripts/docker'
                            additionalBuildArgs '--build-arg BASE=rocm/dev-ubuntu-22.04:6.2-complete'
                            label 'rocm-docker && AMD_Radeon_Instinct_MI210'
                            args '-v /tmp/ccache.kokkos:/tmp/ccache --device=/dev/kfd --device=/dev/dri --security-opt seccomp=unconfined --group-add video --env HIP_VISIBLE_DEVICES=$HIP_VISIBLE_DEVICES'
                        }
                    }
                    environment {
                        // FIXME Test returns a wrong value
                        GTEST_FILTER = '-hip_hostpinned.view_allocation_large_rank'
                    }
                    steps {
                        sh 'ccache --zero-stats'
                        sh '''rm -rf build && mkdir -p build && cd build && \
                              cmake \
                                -DCMAKE_BUILD_TYPE=RelWithDebInfo \
                                -DCMAKE_CXX_COMPILER=hipcc \
                                -DCMAKE_CXX_FLAGS="-Werror -Wno-unused-command-line-argument" \
                                -DCMAKE_CXX_STANDARD=20 \
                                -DKokkos_ARCH_NATIVE=ON \
                                -DKokkos_ENABLE_COMPILER_WARNINGS=ON \
                                -DKokkos_ENABLE_DEPRECATED_CODE_4=ON \
                                -DKokkos_ENABLE_TESTS=ON \
                                -DKokkos_ENABLE_BENCHMARKS=ON \
                                -DKokkos_ENABLE_HIP=ON \
                              .. && \
                              make -j8 && ctest --no-compress-output -T Test --verbose'''
                    }
                    post {
                        always {
                            sh 'ccache --show-stats'
                            xunit([CTest(deleteOutputFiles: true, failIfNotNew: true, pattern: 'build/Testing/**/Test.xml', skipNoTestFiles: false, stopProcessingIfError: true)])
                        }
                    }
                }
            }
        }
    }
}
