Files
arpack-ng/.github/workflows/jobs.yml
T
Markus Mützel 8a4ede774e CI: Use VecLibFort as shim library for Apple Accelerate/VecLib on macOS.
Currently, the CI rules are building ARPACK using the old `f2c` Fortran
ABI. However, all packages of applications written in Fortran that are
distributed by Homebrew are using the default GNU Fortran ABI.
Testing the package with the ABI expected by most macOS users would
probably be better than what is currently done in the CI setup.

Instead of building a version of ARPACK using that old, non-default `f2c`
Fortran ABI, use a library that "translates" from the default GNU Fortran
ABI to the old `f2c` ABI used by Apple Accelerate/VecLib.
2026-07-26 18:28:41 +02:00

360 lines
14 KiB
YAML

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@v7
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@v7
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@v7
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@v7
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@v7
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@v7
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@v7
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 open-mpi eigen veclibfort
- name: Run job
run: |
mkdir -p build
cd build
export FC=mpif90 # Uses gfortran.
export CC=mpicc # Uses clang.
export CFLAGS="-Qunused-arguments"
export CXX=mpic++ # Uses clang++.
export CXXFLAGS="-Qunused-arguments"
export VECLIBFORT_PREFIX=$(brew --prefix veclibfort)
cmake \
-DBLAS_LIBRARIES="${VECLIBFORT_PREFIX}/lib/libvecLibFort.dylib" \
-DLAPACK_LIBRARIES="${VECLIBFORT_PREFIX}/lib/libvecLibFort.dylib" \
-DEXAMPLES=ON -DICB=ON -DEIGEN=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@v7
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 veclibfort
- name: Run job
run: |
mkdir -p build
cd build
export FC=gfortran
export CC=clang
export CFLAGS="-Qunused-arguments"
export CXX=clang++
export CXXFLAGS="-Qunused-arguments"
export VECLIBFORT_PREFIX=$(brew --prefix veclibfort)
cmake \
-DBLAS_LIBRARIES="${VECLIBFORT_PREFIX}/lib/libvecLibFort.dylib" \
-DLAPACK_LIBRARIES="${VECLIBFORT_PREFIX}/lib/libvecLibFort.dylib" \
-DEXAMPLES=ON -DICB=ON -DEIGEN=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@v7
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 pkgconfig open-mpi eigen veclibfort
- name: Run job
run: |
./bootstrap
export VECLIBFORT_PREFIX=$(brew --prefix veclibfort)
BLAS_LIBS="-L${VECLIBFORT_PREFIX}/lib -lvecLibFort" \
LAPACK_LIBS="-L${VECLIBFORT_PREFIX}/lib -lvecLibFort" \
./configure --enable-icb --enable-eigen --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@v7
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
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
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::"