# This is a basic workflow to help you get started with Actions
name: SEACAS Variant builds

# Controls when the action will run. Triggers the workflow on push
on: 
  push:
    branches-ignore:
      - 'coverity'
  pull_request:

jobs:

  build-deps:

    runs-on: ubuntu-latest
    
    strategy:
      matrix:
        compiler: [ gnu, clang, mpi ]
        hdf5: [ V110 ]
        netcdf: [ 4.8.1 ]
        cgns: [ 4.2.0 ]
    steps:

      - uses: actions/checkout@v2

      - name: Install System dependencies
        shell: bash -l {0}
        run: sudo apt update && sudo apt install -y libaec-dev zlib1g-dev automake autoconf libcurl4-openssl-dev libjpeg-dev wget curl bzip2 m4 flex bison cmake libzip-dev openmpi-bin libopenmpi-dev

        ###
        # Installing TPL
        ###
      - name: Cache TPL-${{ matrix.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }}
        id: cache-TPL-mpi
        uses: actions/cache@v2
        with:
          path: ~/environments/${{ matrix.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }}
          key: TPL-v3-${{ runner.os }}-${{ matrix.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }}

      - name: Build TPL-${{ matrix.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }}
        if: steps.cache-TPL.outputs.cache-hit != 'true'
        run: |
          set -x
          COMPILER=${{ matrix.compiler }} H5VERSION=${{ matrix.hdf5}} GNU_PARALLEL=OFF INSTALL_PATH=${HOME}/environments/${{ matrix.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }} ./install-tpl.sh
          ls ${HOME} && ls ${HOME}/environments && ls ${HOME}/environments/${{ matrix.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }} && ls ${HOME}/environments/${{ matrix.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }}/lib


  build:
    needs: build-deps

    # The type of runner that the job will run on
    name: ${{ matrix.config.name }}
    runs-on: ${{ matrix.config.os }}
    strategy:
      fail-fast: false
      matrix:
        hdf5: [ V110 ]
        netcdf: [ 4.8.1 ]
        cgns: [ 4.2.0 ]
        config: 
        - {
            name: "Debug serial build",
            os: ubuntu-latest,
            compiler: "gnu",
            debug: "YES",
            threadsafe: "NO",
            fortran: "YES",
            use_kokkos: "NO",
            use_adios2: "NO",
            use_catalyst2: "NO",
            gtest: "NO",
            extra: "",
            sanitizer: "NO" # address, integer, thread, memory, undefined
          }
        - {
            name: "Debug parallel build",
            os: ubuntu-latest,
            compiler: "mpi",
            debug: "YES",
            threadsafe: "NO",
            fortran: "YES",
            use_kokkos: "NO",
            use_adios2: "NO",
            use_catalyst2: "NO",
            gtest: "NO",
            extra: "",
            sanitizer: "NO" # address, integer, thread, memory, undefined
          }
        - {
            name: "Threadsafe ON, No Fortran",
            os: ubuntu-latest,
            compiler: "gnu",
            debug: "YES",
            threadsafe: "YES",
            fortran: "NO",
            use_kokkos: "NO",
            use_adios2: "NO",
            use_catalyst2: "NO",
            gtest: "NO",
            extra: "",
            sanitizer: "thread" # address, integer, thread, memory, undefined
          }
        - {
            name: "Threadsafe ON, Parallel, No Fortran",
            os: ubuntu-latest,
            compiler: "mpi",
            debug: "YES",
            threadsafe: "YES",
            fortran: "NO",
            use_kokkos: "NO",
            use_adios2: "NO",
            use_catalyst2: "NO",
            gtest: "NO",
            extra: "",
            sanitizer: "thread" # address, integer, thread, memory, undefined
          }
        - {
            name: "Sanitize address, no fortran",
            os: ubuntu-latest,
            compiler: "clang",
            debug: "YES",
            threadsafe: "NO",
            fortran: "NO",
            use_kokkos: "NO",
            use_adios2: "NO",
            use_catalyst2: "NO",
            gtest: "NO",
            extra: "",
            sanitizer: "address" # address, integer, thread, memory, undefined
          }
        - {
            name: "Sanitize undefined",
            os: ubuntu-latest,
            compiler: "clang",
            debug: "YES",
            threadsafe: "NO",
            fortran: "YES",
            use_kokkos: "NO",
            use_adios2: "NO",
            use_catalyst2: "NO",
            gtest: "NO",
            extra: "",
            sanitizer: "undefined" # address, integer, thread, memory, undefined
          }
        - {
            name: "Sanitize integer",
            os: ubuntu-latest,
            compiler: "clang",
            debug: "YES",
            threadsafe: "NO",
            fortran: "NO",
            use_kokkos: "NO",
            use_adios2: "NO",
            use_catalyst2: "NO",
            gtest: "NO",
            extra: "",
            sanitizer: "integer" # address, integer, thread, memory, undefined
          }
        - {
            name: "GTest Enabled",
            os: ubuntu-latest,
            compiler: "gnu",
            debug: "YES",
            threadsafe: "NO",
            fortran: "YES",
            use_kokkos: "NO",
            use_adios2: "NO",
            use_catalyst2: "NO",
            gtest: "YES",
            extra: "",
            sanitizer: "NO" # address, integer, thread, memory, undefined
          }
        - {
            name: "No applications, legacy, or fortran",
            os: ubuntu-latest,
            compiler: "clang",
            debug: "NO",
            threadsafe: "NO",
            fortran: "NO",
            use_kokkos: "NO",
            use_adios2: "NO",
            use_catalyst2: "NO",
            gtest: "NO",
            extra: "APPLICATIONS=NO LEGACY=NO",
            sanitizer: "NO" # address, integer, thread, memory, undefined
          }
        - {
            name: "ADIOS2, parallel",
            os: ubuntu-latest,
            compiler: "mpi",
            debug: "NO",
            threadsafe: "NO",
            fortran: "YES",
            use_kokkos: "NO",
            use_adios2: "YES",
            use_catalyst2: "NO",
            gtest: "NO",
            extra: "",
            sanitizer: "NO" # address, integer, thread, memory, undefined
          }
        - {
            name: "CATALYST2, serial",
            os: ubuntu-latest,
            compiler: "clang",
            debug: "NO",
            threadsafe: "NO",
            fortran: "YES",
            use_kokkos: "NO",
            use_adios2: "NO",
            use_catalyst2: "YES",
            gtest: "NO",
            extra: "",
            sanitizer: "NO" # address, integer, thread, memory, undefined
          }
    steps:

      - uses: actions/checkout@v2

      - name: Install System dependencies
        shell: bash -l {0}
        run: sudo apt update && sudo apt install -y libaec-dev zlib1g-dev automake autoconf libcurl4-openssl-dev libjpeg-dev wget curl bzip2 m4 flex bison cmake libzip-dev openmpi-bin libopenmpi-dev

      - name: Fetch TPL Cache
        id: cache-TPL
        uses: actions/cache@v2
        with:
          path: ~/environments/${{ matrix.config.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }}
          key: TPL-v3-${{ runner.os }}-${{ matrix.config.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }}

      - name: Check Cache
        shell: bash -l {0}
        run: ls ${HOME} && ls ${HOME}/environments && ls ${HOME}/environments/${{ matrix.config.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }} && ls ${HOME}/environments/${{ matrix.config.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }}/lib

      - name: install additional TPL
        if: ${{ matrix.config.use_kokkos == 'YES' || matrix.config.use_adios2 == 'YES' || matrix.config.gtest == 'YES' || matrix.config.use_catalyst == 'YES' }}
        run: |
          set -x
          COMPILER=${{ matrix.config.compiler }} KOKKOS=${{ matrix.config.use_kokkos }} ADIOS2=${{ matrix.config.use_adios2 }} CATALYST2=${{ matrix.config.use_catalyst2 }} GNU_PARALLEL=OFF GTEST=${{ matrix.config.gtest }} INSTALL_PATH=${HOME}/environments/${{ matrix.config.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }} ./install-tpl.sh
          ls ${HOME} && ls ${HOME}/environments && ls ${HOME}/environments/${{ matrix.config.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }} && ls ${HOME}/environments/${{ matrix.config.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }}/lib
        
###
# Configure and build
###
      - name: Run cmake
        shell: bash -l {0}
        run: |
          echo $HOME
          mkdir build
          cd build
          NUMPROCS=2 ${{ matrix.config.extra }} THREADSAFE=${{ matrix.config.threadsafe }} DEBUG=${{ matrix.config.debug }} FORTRAN=${{ matrix.config.fortran }} SANITIZER=${{ matrix.config.sanitizer }} COMPILER=${{ matrix.config.compiler }} INSTALL_PATH=${HOME}/environments/${{ matrix.config.compiler }}-${{ matrix.hdf5 }}-${{ matrix.netcdf }}-${{ matrix.cgns }} bash ../cmake-config

      - name: Build 
        shell: bash -l {0}
        run: |
          cd build 
          make -j 4
        if: ${{ success() }}

      - name: Install
        shell: bash -l {0}
        run: |
          cd build 
          make -j 4 install
        if: ${{ success() }}

      - name: Run Non-sanitized Tests
        shell: bash -l {0}
        run: |
          cd build
          ctest -j 4 --output-on-failure 
        if: ${{ success() && matrix.config.sanitizer == 'NO' &&  matrix.config.threadsafe == 'NO' }}

      - name: Run sanitized/threadsafe Tests
        shell: bash -l {0}
        run: |
          cd build
          ctest -j 4 --output-on-failure --exclude-regex exodus3.py
        if: ${{ success() && (matrix.config.sanitizer != 'NO' ||  matrix.config.threadsafe != 'NO') }}
