name: GlobalArrays_CI

on:
  push:
  pull_request:
  release:
  schedule:
    - cron: '0 0 * * SUN'
  repository_dispatch:
    types: [backend_automation]
  workflow_dispatch:

jobs:
  build:
    if: "!contains(github.event.head_commit.message, 'ci skip')"
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
        experimental: [false]
        mpi_impl:
          - openmpi
          - mpich
        armci_network:
          - mpi3
          - mpi-ts
          - ofi
          - armci
          - mpi-pr
        f77:
          - gfortran-12
        cc:
          - clang
          - gcc
        include:
          - os: ubuntu-latest
            experimental: true
            mpi_impl: mpich
            armci_network: mpi-ts
            f77: gfortran-11
            cc: gcc-11
          - os: ubuntu-22.04
            experimental: true
            mpi_impl: mpich
            armci_network: mpi-pr
            f77: gfortran-10
            cc: gcc-10
            use_cmake: "Y"
          - os: ubuntu-latest
            experimental: true
            mpi_impl: intel
            armci_network: sockets
            config_opts: --enable-i4
            f77: ifort
            cc: icx
            oneapi: /opt/intel/oneapi
          - os: ubuntu-latest
            experimental: true
            mpi_impl: openmpi
            armci_network: mpi-ts
            config_opts: --enable-i4 --without-blas --enable-cxx --disable-f77
            f77: gfortran
            cc: gcc
          - os: macos-13
            experimental: true
            mpi_impl: mpich
            armci_network: mpi-pr
            f77: ifort
            cc: icc
            config_opts: LIBS=-lifcore
            oneapi: /Users/runner/apps/oneapi
          - os: ubuntu-22.04
            experimental: true 
            mpi_impl: mpich
            armci_network: mpi-pr
            f77: gfortran
            cc: gcc
            use_sicm: "Y"
          - os: ubuntu-22.04
            experimental: true 
            mpi_impl: mpich
            armci_network: mpi-ts
            config_opts: "--disable-f77 --enable-cxx"
            f77: gfortran-10
            cc: gcc-10
          - os: macos-13
            experimental: true 
            mpi_impl: mpich
            armci_network: mpi-ts
            config_opts: "--disable-static --enable-shared"
            f77: gfortran-13
            cc: clang
          - os: macos-13
            experimental: true
            use_cmake: "Y"
            mpi_impl: mpich
            armci_network: mpi-pr
            f77: gfortran-13
            cc: clang
          - os: macos-latest
            experimental: true
            use_cmake: "N"
            mpi_impl: mpich
            armci_network: mpi-pr
            f77: gfortran-14
            cc: gcc-14
          - os: ubuntu-22.04
            experimental: true
            use_cmake: "Y"
            mpi_impl: openmpi
            armci_network: mpi-pr
            f77: gfortran
            cc: gcc
          - os: ubuntu-22.04
            experimental: true
            use_cmake: "Y"
            mpi_impl: openmpi
            armci_network: mpi-ts
            f77: gfortran
            cc: gcc
          - os: ubuntu-22.04
            experimental: true
            mpi_impl: intel
            armci_network: mpi-ts
            f77: ifort
            cc: gcc
            oneapi: /opt/intel/oneapi
        exclude:
          - armci_network: ofi
            os: macos-latest
          - armci_network: mpi-pr
            mpi_impl: openmpi
          - armci_network: mpi3
            mpi_impl: openmpi
          - armci_network: ofi
            mpi_impl: openmpi
      fail-fast: false
    env:
        MPI_IMPL: ${{ matrix.mpi_impl }}
        PORT: ${{ matrix.armci_network }}
        ARMCI_NETWORK: ${{ matrix.armci_network }}
        F77: ${{ matrix.f77 }}
        CC: ${{ matrix.cc }}
        CONFIG_OPTS: ${{ matrix.config_opts}}
        USE_CMAKE: ${{ matrix.use_cmake }}
        USE_SICM: ${{ matrix.use_sicm }}
    continue-on-error: ${{ matrix.experimental }}
    steps: 
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 40
      - name: Cache install steps
        id: ga-cache-install
        uses: actions/cache@v4
        env:
          cache-name: cache-install-steps
        with:
          # cache files are stored in `~/apps` on Linux/macOS
          path: |
            apps
          key: ${{ runner.os }}-${{ matrix.mpi_impl}}-${{ matrix.armci_network}}-${{ matrix.cc }}-${{ matrix.f77 }}-${{ matrix.config_opts}}-ga-apps-v006

      - name: install_packages
        run: |
          case "${{ matrix.os }}" in
          ubuntu*|jessie|stretch|buster)
          sudo apt-get update -q -y
          echo F77 is "$F77"
          if [[ "$F77" =~ gfortran-[0-9][0-9] ]] || [[ "$CC" =~ gcc-[0-9][0-9] ]]; then
          if [[ "$CC" =~ gcc-[0-9][0-9] ]]; then
          version=$(echo "$CC" | cut -d - -f 2 )
          fi
          if [[ "$F77" =~ gfortran-[0-9][0-9] ]]; then
          version=$(echo "$F77" | cut -d - -f 2 )
          fi
          sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test && sudo apt-get -y install gcc-$version gfortran-$version g++-$version
          fi
          sudo apt-get install -q -y gfortran
          ;;
          macos*)
          brew update
          brew install coreutils automake || true
          ;;
          esac
          if [[ "$F77" == "ifort" ]] || [[ "$CC" == "icc" ]] || [[ "$CC" == "icx" ]]; then ./travis/install-intel.sh; source ${{ matrix.oneapi }}/setvars.sh --force;  fi
          echo F77 is `which "$F77"`
          echo F77 compiler version `"$F77" -v`
      - name: before_install
        if: steps.ga-cache-install.outputs.cache-hit != 'true'
        run: |
          pwd
          ls -lart
          mkdir -p $GITHUB_WORKSPACE/apps
          AUTO_CC="$CC"
          if [[ "$F77" == "ifort" ]] || [[ "$CC" == "icc" ]] || [[ "$CC" == "icx" ]]; then source ${{ matrix.oneapi }}/setvars.sh --force; AUTO_CC=cc;  fi
          CC="$AUTO_CC" sh ./travis/install-autotools.sh $GITHUB_WORKSPACE/apps
      - name: install
        run: |
          export CI_ROOT=$GITHUB_WORKSPACE/apps
          if [[ "$F77" == "ifort" ]] || [[ "$CC" == "icc" ]] || [[ "$CC" == "icx" ]]; then source ${{ matrix.oneapi }}/setvars.sh --force;  fi
          ./travis/install-mpi.sh $CI_ROOT $MPI_IMPL
          if [[ "$PORT" == "ofi" ]]; then ./travis/install-libfabric.sh $CI_ROOT; else true;  fi
          if [[ "$PORT" == "armci" ]]; then ./travis/install-armci-mpi.sh $CI_ROOT; else true; fi
          if [[ "$USE_SICM" == "Y" ]]; then ./travis/install-sicm.sh $HOME/no_cache; else true; fi
      - name: compile and test global arrays
        if: ${{ success() }}
        run: |
          if [[ "$F77" == "ifort" ]] || [[ "$CC" == "icc" ]] || [[ "$CC" == "icx" ]] ; then  source ${{ matrix.oneapi }}/setvars.sh --force;  fi
          ./travis/build-run.sh $GITHUB_WORKSPACE/apps $PORT $MPI_IMPL $USE_CMAKE $F77
      - name: after_failure
        if: ${{ failure() }}
        run: |
          pwd
          ls
          echo '***** cat config.log ****'
          find . -name config.log -exec cat {} ";" || true
          echo '***** cat global.fh *****'
          find . -name "global.fh"  -exec cat {} ";" || true
          echo '***** global.fh* location *****'
          find ../.. -name "global.fh*" || true
          echo '***** cat global.fh.in *****'
          find ../.. -name "global.fh.in" -exec cat {} ";" || true
          cat ./test-suite.log || true
          echo '***** CMakeOutput.log *****'
          find . -name CMakeOutput.log -exec cat {} ";" || true
          echo '***** CMakeError.log ******'
          find . -name CMakeError.log  -exec cat {} ";" || true
          echo '***********'
          cat /Users/runner/work/ga/ga/build/CMakeFiles/CMakeOutput.log || true
          echo '***********'
          cat /Users/runner/work/ga/ga/build/CMakeFiles/CMakeError.log || true
