name: arpack-ng
on: [push, pull_request]
jobs:
  ubuntu_latest_cmake:
    runs-on: ubuntu-latest
    steps:
      - name: Clone and check out repository code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{github.event.pull_request.head.ref}} # Branch where changes are implemented.
          repository: ${{github.event.pull_request.head.repo.full_name}} # Repo where changes are implemented.
      - name: Check commit
        run: |
          git log -1
      - name: Update OS
        run: sudo apt-get update
      - name: Install apt-get dependencies
        run: sudo apt-get install -y gfortran gcc g++ openmpi-bin libopenmpi-dev libblas-dev liblapack-dev libeigen3-dev cmake
      - name: Run job
        run: |
          mkdir build
          cd build
          cmake -DEXAMPLES=ON -DMPI=ON -DICB=ON -DEIGEN=ON ..
          make all
          CTEST_OUTPUT_ON_FAILURE=1 make test
          make package_source
  ubuntu_latest_cmake_install:
    runs-on: ubuntu-latest
    steps:
      - name: Clone and check out repository code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{github.event.pull_request.head.ref}} # Branch where changes are implemented.
          repository: ${{github.event.pull_request.head.repo.full_name}} # Repo where changes are implemented.
      - name: Check commit
        run: |
          git log -1
      - name: Update OS
        run: sudo apt-get update
      - name: Install apt-get dependencies
        run: sudo apt-get install -y gfortran gcc g++ openmpi-bin libopenmpi-dev libblas-dev liblapack-dev libeigen3-dev cmake
      - name: Run job
        run: |
          mkdir build
          cd build
          cmake ..
          bash ./tstCMakeInstall.sh
          bash ./tstCMakeInstall.sh 64-
          bash ./tstCMakeInstall.sh   -ILP64
          bash ./tstCMakeInstall.sh 64-ILP64
  ubuntu_latest_autotools:
    runs-on: ubuntu-latest
    steps:
      - name: Clone and check out repository code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{github.event.pull_request.head.ref}} # Branch where changes are implemented.
          repository: ${{github.event.pull_request.head.repo.full_name}} # Repo where changes are implemented.
      - name: Check commit
        run: |
          git log -1
      - name: Update OS
        run: sudo apt-get update
      - name: Install apt-get dependencies
        run: sudo apt-get install -y gfortran gcc g++ openmpi-bin libopenmpi-dev libblas-dev liblapack-dev libeigen3-dev automake autoconf pkg-config libtool
      - name: Run job
        run: |
          ./bootstrap
          ./configure --enable-mpi --enable-icb --enable-eigen
          make all
          make check
          make distcheck
  ubuntu_latest_autotools_install:
    runs-on: ubuntu-latest
    steps:
      - name: Clone and check out repository code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{github.event.pull_request.head.ref}} # Branch where changes are implemented.
          repository: ${{github.event.pull_request.head.repo.full_name}} # Repo where changes are implemented.
      - name: Check commit
        run: |
          git log -1
      - name: Update OS
        run: sudo apt-get update
      - name: Install apt-get dependencies
        run: sudo apt-get install -y gfortran gcc g++ openmpi-bin libopenmpi-dev libblas-dev liblapack-dev libeigen3-dev automake autoconf pkg-config libtool
      - name: Run job
        run: |
          ./bootstrap
          ./configure
          bash ./tstAutotoolsInstall.sh
          bash ./tstAutotoolsInstall.sh 64-
          bash ./tstAutotoolsInstall.sh   -ILP64
          bash ./tstAutotoolsInstall.sh 64-ILP64
  ubuntu_latest_cmake_python:
    runs-on: ubuntu-latest
    steps:
      - name: Clone and check out repository code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{github.event.pull_request.head.ref}} # Branch where changes are implemented.
          repository: ${{github.event.pull_request.head.repo.full_name}} # Repo where changes are implemented.
      - name: Check commit
        run: |
          git log -1
      - name: Update OS
        run: sudo apt-get update
      - name: Install apt-get dependencies
        run: sudo apt-get install -y gfortran gcc g++ openmpi-bin libopenmpi-dev libblas-dev liblapack-dev cmake libeigen3-dev
      - name: Install python dependencies
        run: sudo apt-get -y install python3-minimal python3-pip python3-numpy
      - name: Build boost-python for python3 (not provided by apt-cache)
        run : |
          sudo apt-get -y install wget
          wget https://sourceforge.net/projects/boost/files/boost/1.79.0/boost_1_79_0.tar.gz
          tar -xf boost_1_79_0.tar.gz
          cd boost_1_79_0
          ./bootstrap.sh --with-libraries=python --with-python=/usr/bin/python3 --with-toolset=gcc
          sudo ./b2 toolset=gcc install
          sudo apt-get install locate
          sudo updatedb
      - name: Run job
        run: |
          mkdir build
          cd build
          cmake -DEXAMPLES=ON -DMPI=ON -DICB=ON -DEIGEN=ON -DPYTHON3=ON ..
          make all
          CTEST_OUTPUT_ON_FAILURE=1 make test
  ubuntu_latest_autotools_ilp64:
    runs-on: ubuntu-latest
    steps:
      - name: Clone and check out repository code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{github.event.pull_request.head.ref}} # Branch where changes are implemented.
          repository: ${{github.event.pull_request.head.repo.full_name}} # Repo where changes are implemented.
      - name: Check commit
        run: |
          git log -1
      - name: Update OS
        run: sudo apt-get update
      - name: Install apt-get dependencies
        run: sudo apt-get install -y gfortran gcc g++ openmpi-bin libopenmpi-dev libblas-dev liblapack-dev automake autoconf pkg-config libtool libeigen3-dev
      - name: Install Intel MKL (ILP64 blas/lapack)
        run: echo yes | sudo apt-get -y install intel-mkl libmkl-dev
      - name: Run job
        run: |
          ./bootstrap
          ./configure --enable-icb --with-blas=mkl_gf_ilp64 --with-lapack=mkl_gf_ilp64
          make all
          make check
        env:
          FFLAGS: "-DMKL_ILP64 -I/usr/include/mkl"
          FCFLAGS: "-DMKL_ILP64 -I/usr/include/mkl"
          LIBS: "-Wl,--no-as-needed -L/usr/lib/x86_64-linux-gnu -lmkl_sequential -lmkl_core -lpthread -lm -ldl"
          INTERFACE64: "1"
  macos_latest_cmake:
    runs-on: macos-latest
    steps:
      - name: Clone and check out repository code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{github.event.pull_request.head.ref}} # Branch where changes are implemented.
          repository: ${{github.event.pull_request.head.repo.full_name}} # Repo where changes are implemented.
      - name: Check commit
        run: |
          git log -1
      - name: Install brew dependencies
        run: |
          brew reinstall gcc # brings gfortran on path
          brew install cmake mpich
      - name: Run job
        run: |
          mkdir -p build
          cd build
          export FC=mpif90 # Uses gfortran.
          export FFLAGS="-ff2c -fno-second-underscore"
          export CC=mpicc # Uses clang.
          export CFLAGS="-Qunused-arguments"
          export CXX=mpic++ # Uses clang++.
          export CXXFLAGS="-Qunused-arguments"
          cmake -DBLA_VENDOR=Apple -DEXAMPLES=ON -DICB=ON -DMPI=ON ..
          make all
          CTEST_OUTPUT_ON_FAILURE=1 make test
  macos_latest_cmake_python:
    runs-on: macos-latest
    steps:
      - name: Clone and check out repository code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{github.event.pull_request.head.ref}} # Branch where changes are implemented.
          repository: ${{github.event.pull_request.head.repo.full_name}} # Repo where changes are implemented.
      - name: Check commit
        run: |
          git log -1
      - name: Install brew dependencies
        run: |
          # Unlink and re-link to prevent errors when github mac runner images
          # install python outside of brew, for example:
          # https://github.com/orgs/Homebrew/discussions/3895
          # https://github.com/actions/setup-python/issues/577
          # https://github.com/actions/runner-images/issues/6459
          # https://github.com/actions/runner-images/issues/6507
          # https://github.com/actions/runner-images/issues/2322
          brew list -1 | grep python | while read formula; do brew unlink $formula; brew link --overwrite $formula; done
          brew reinstall gcc # brings gfortran on path
          brew install cmake eigen boost-python3 python3 numpy
      - name: Run job
        run: |
          mkdir -p build
          cd build
          export FC=gfortran
          export FFLAGS="-ff2c -fno-second-underscore"
          export CC=clang
          export CFLAGS="-Qunused-arguments"
          export CXX=clang++
          export CXXFLAGS="-Qunused-arguments"
          cmake -DBLA_VENDOR=Apple -DEXAMPLES=ON -DICB=ON -DPYTHON3=ON ..
          make all
          CTEST_OUTPUT_ON_FAILURE=1 make test
  macos_latest_autotools:
    runs-on: macos-latest
    steps:
      - name: Clone and check out repository code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{github.event.pull_request.head.ref}} # Branch where changes are implemented.
          repository: ${{github.event.pull_request.head.repo.full_name}} # Repo where changes are implemented.
      - name: Check commit
        run: |
          git log -1
      - name: Install brew dependencies
        run: |
          brew reinstall gcc # brings gfortran on path
          brew install autoconf automake libtool pkg-config mpich
      - name: Run job
        run: |
          ./bootstrap
          LIBS="-framework Accelerate" FFLAGS="-ff2c -fno-second-underscore" FCFLAGS="-ff2c -fno-second-underscore" ./configure --enable-icb --enable-mpi
          make all
          make check
  windows_latest_cmake:
    runs-on: windows-latest
    name: MinGW-w64 ${{ matrix.msystem }} INTERFACE64=${{ matrix.int64 }}/MPI=${{ matrix.mpi }}
    strategy:
      fail-fast: false
      matrix:
        msystem: [UCRT64, CLANG64]
        int64: [ON, OFF]
        mpi: [ON, OFF]
        exclude:
          - int64: ON
            mpi: ON
    defaults:
      run:
        # Use MSYS2 as default shell
        shell: msys2 {0}
    steps:
      - name: Install MSYS2 build environment
        uses: msys2/setup-msys2@v2
        with:
          update: true
          msystem: ${{ matrix.msystem }}
          install: >-
            base-devel
            git
          pacboy: >-
            cmake:p
            ninja:p
            cc:p
            fc:p
            eigen3:p
      - name: Install OpenBLAS and MS-MPI from MSYS2
        run: |
          if [[ ${{ matrix.int64 }} != ON ]]; then
            pacboy -S openblas:p --noconfirm
          else
            pacboy -S openblas64:p --noconfirm
          fi
          if [[ ${{ matrix.mpi }} = ON ]]; then
            # This installs only the link library.
            # The actual library will be installed in the next step.
            pacboy -S msmpi:p --noconfirm
          fi
      - name: Install MS-MPI (for mpiexec)
        uses: mpi4py/setup-mpi@v1
      - name: Clone and check out repository code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{github.event.pull_request.head.ref}} # Branch where changes are implemented.
          repository: ${{github.event.pull_request.head.repo.full_name}} # Repo where changes are implemented.
      - name: Check commit
        run: |
          git log -1
      - name: Run job
        run: |
          mkdir -p build && cd build
          echo "::group::Configure"
          if [[ ${{ matrix.int64 }} == ON ]]; then
            _blas_lib_flag="-DBLAS_LIBRARIES=openblas_64"
          fi
          cmake \
            -GNinja \
            -DICB=ON \
            -DEIGEN=ON \
            -DEXAMPLES=ON \
            -DMPI=${{ matrix.mpi }} \
            -DINTERFACE64=${{ matrix.int64 }} \
            ${_blas_lib_flag} \
            ..
          echo "::endgroup::"
          echo "::group::Build"
          cmake --build . -v
          echo "::endgroup::"
      - name: Run tests
        id: run-ctest
        run: |
          if [[ ${{ matrix.mpi }} == ON ]]; then
            export PATH="/c/Program Files/Microsoft MPI/Bin":$PATH # add mpiexec to msys2 path
          fi
          export PATH="${GITHUB_WORKSPACE}/build":$PATH # add libarpack.dll to msys2 path for tests that run in different directory
          cd build
          ctest
      - name: Re-run tests
        if: always() && (steps.run-ctest.outcome == 'failure')
        timeout-minutes: 60
        run: |
          if [[ ${{ matrix.mpi }} == ON ]]; then
            export PATH="/c/Program Files/Microsoft MPI/Bin":$PATH # add mpiexec to msys2 path
          fi
          export PATH="${GITHUB_WORKSPACE}/build":$PATH # add libarpack.dll to msys2 path for tests that run in different directory
          cd build
          echo "::group::Re-run ctest"
          ctest --rerun-failed --output-on-failure || true
          echo "::endgroup::"
          echo "::group::Log from these tests"
          [ ! -f Testing/Temporary/LastTest.log ] || cat Testing/Temporary/LastTest.log
          echo "::endgroup::"
          echo "::group::Content of arpackmm.run.log"
          [ ! -f EXAMPLES/MATRIX_MARKET/arpackmm.run.log ] || cat EXAMPLES/MATRIX_MARKET/arpackmm.run.log
          echo "::endgroup::"
