Merge pull request #4488 from martin-frbg/issue4475-2 #888
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: continuous build | |
on: [push, pull_request] | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
permissions: | |
contents: read # to fetch code (actions/checkout) | |
jobs: | |
build: | |
if: "github.repository == 'OpenMathLib/OpenBLAS'" | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest, macos-latest] | |
fortran: [gfortran, flang] | |
build: [cmake, make] | |
exclude: | |
- os: macos-latest | |
fortran: flang | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Print system information | |
run: | | |
if [ "$RUNNER_OS" == "Linux" ]; then | |
cat /proc/cpuinfo | |
elif [ "$RUNNER_OS" == "macOS" ]; then | |
sysctl -a | grep machdep.cpu | |
else | |
echo "::error::$RUNNER_OS not supported" | |
exit 1 | |
fi | |
- name: Install Dependencies | |
run: | | |
if [ "$RUNNER_OS" == "Linux" ]; then | |
sudo apt-get install -y gfortran cmake ccache libtinfo5 | |
elif [ "$RUNNER_OS" == "macOS" ]; then | |
# It looks like "gfortran" isn't working correctly unless "gcc" is re-installed. | |
brew reinstall gcc | |
brew install coreutils cmake ccache | |
else | |
echo "::error::$RUNNER_OS not supported" | |
exit 1 | |
fi | |
- name: Compilation cache | |
uses: actions/cache@v3 | |
with: | |
path: ~/.ccache | |
# We include the commit sha in the cache key, as new cache entries are | |
# only created if there is no existing entry for the key yet. | |
# GNU make and cmake call the compilers differently. It looks like | |
# that causes the cache to mismatch. Keep the ccache for both build | |
# tools separate to avoid polluting each other. | |
key: ccache-${{ runner.os }}-${{ matrix.build }}-${{ matrix.fortran }}-${{ github.ref }}-${{ github.sha }} | |
# Restore a matching ccache cache entry. Prefer same branch and same Fortran compiler. | |
restore-keys: | | |
ccache-${{ runner.os }}-${{ matrix.build }}-${{ matrix.fortran }}-${{ github.ref }} | |
ccache-${{ runner.os }}-${{ matrix.build }}-${{ matrix.fortran }} | |
ccache-${{ runner.os }}-${{ matrix.build }} | |
- name: Configure ccache | |
run: | | |
if [ "${{ matrix.build }}" = "make" ]; then | |
# Add ccache to path | |
if [ "$RUNNER_OS" = "Linux" ]; then | |
echo "/usr/lib/ccache" >> $GITHUB_PATH | |
elif [ "$RUNNER_OS" = "macOS" ]; then | |
echo "$(brew --prefix)/opt/ccache/libexec" >> $GITHUB_PATH | |
else | |
echo "::error::$RUNNER_OS not supported" | |
exit 1 | |
fi | |
fi | |
# Limit the maximum size and switch on compression to avoid exceeding the total disk or cache quota (5 GB). | |
test -d ~/.ccache || mkdir -p ~/.ccache | |
echo "max_size = 300M" > ~/.ccache/ccache.conf | |
echo "compression = true" >> ~/.ccache/ccache.conf | |
ccache -s | |
- name: Build OpenBLAS | |
run: | | |
if [ "${{ matrix.fortran }}" = "flang" ]; then | |
# download and install classic flang | |
cd /usr/ | |
sudo wget -nv https://github.com/flang-compiler/flang/releases/download/flang_20190329/flang-20190329-x86-70.tgz | |
sudo tar xf flang-20190329-x86-70.tgz | |
sudo rm flang-20190329-x86-70.tgz | |
cd - | |
fi | |
case "${{ matrix.build }}" in | |
"make") | |
make -j$(nproc) DYNAMIC_ARCH=1 USE_OPENMP=0 FC="ccache ${{ matrix.fortran }}" | |
;; | |
"cmake") | |
mkdir build && cd build | |
cmake -DDYNAMIC_ARCH=1 \ | |
-DNOFORTRAN=0 \ | |
-DBUILD_WITHOUT_LAPACK=0 \ | |
-DCMAKE_VERBOSE_MAKEFILE=ON \ | |
-DCMAKE_BUILD_TYPE=Release \ | |
-DCMAKE_Fortran_COMPILER=${{ matrix.fortran }} \ | |
-DCMAKE_C_COMPILER_LAUNCHER=ccache \ | |
-DCMAKE_Fortran_COMPILER_LAUNCHER=ccache \ | |
.. | |
cmake --build . | |
;; | |
*) | |
echo "::error::Configuration not supported" | |
exit 1 | |
;; | |
esac | |
- name: Show ccache status | |
continue-on-error: true | |
run: ccache -s | |
- name: Run tests | |
timeout-minutes: 60 | |
run: | | |
case "${{ matrix.build }}" in | |
"make") | |
MAKE_FLAGS='DYNAMIC_ARCH=1 USE_OPENMP=0' | |
echo "::group::Tests in 'test' directory" | |
make -C test $MAKE_FLAGS FC="ccache ${{ matrix.fortran }}" | |
echo "::endgroup::" | |
echo "::group::Tests in 'ctest' directory" | |
make -C ctest $MAKE_FLAGS FC="ccache ${{ matrix.fortran }}" | |
echo "::endgroup::" | |
echo "::group::Tests in 'utest' directory" | |
make -C utest $MAKE_FLAGS FC="ccache ${{ matrix.fortran }}" | |
echo "::endgroup::" | |
;; | |
"cmake") | |
cd build && ctest | |
;; | |
*) | |
echo "::error::Configuration not supported" | |
exit 1 | |
;; | |
esac | |
msys2: | |
if: "github.repository == 'OpenMathLib/OpenBLAS'" | |
runs-on: windows-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
msystem: [UCRT64, MINGW32, CLANG64, CLANG32] | |
idx: [int32, int64] | |
build-type: [Release] | |
include: | |
- msystem: UCRT64 | |
idx: int32 | |
target-prefix: mingw-w64-ucrt-x86_64 | |
fc-pkg: fc | |
- msystem: MINGW32 | |
idx: int32 | |
target-prefix: mingw-w64-i686 | |
fc-pkg: fc | |
- msystem: CLANG64 | |
idx: int32 | |
target-prefix: mingw-w64-clang-x86_64 | |
fc-pkg: fc | |
# Compiling with Flang 16 seems to cause test errors on machines | |
# with AVX512 instructions. Revisit after MSYS2 distributes Flang 17. | |
no-avx512-flags: -DNO_AVX512=1 | |
- msystem: CLANG32 | |
idx: int32 | |
target-prefix: mingw-w64-clang-i686 | |
fc-pkg: cc | |
c-lapack-flags: -DC_LAPACK=ON | |
- msystem: UCRT64 | |
idx: int64 | |
idx64-flags: -DBINARY=64 -DINTERFACE64=1 | |
target-prefix: mingw-w64-ucrt-x86_64 | |
fc-pkg: fc | |
- msystem: CLANG64 | |
idx: int64 | |
idx64-flags: -DBINARY=64 -DINTERFACE64=1 | |
target-prefix: mingw-w64-clang-x86_64 | |
fc-pkg: fc | |
# Compiling with Flang 16 seems to cause test errors on machines | |
# with AVX512 instructions. Revisit after MSYS2 distributes Flang 17. | |
no-avx512-flags: -DNO_AVX512=1 | |
- msystem: UCRT64 | |
idx: int32 | |
target-prefix: mingw-w64-ucrt-x86_64 | |
fc-pkg: fc | |
build-type: None | |
exclude: | |
- msystem: MINGW32 | |
idx: int64 | |
- msystem: CLANG32 | |
idx: int64 | |
defaults: | |
run: | |
# Use MSYS2 bash as default shell | |
shell: msys2 {0} | |
env: | |
CHERE_INVOKING: 1 | |
steps: | |
- name: Get CPU name | |
shell: pwsh | |
run : | | |
Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name | |
- name: Install build dependencies | |
uses: msys2/setup-msys2@v2 | |
with: | |
msystem: ${{ matrix.msystem }} | |
update: true | |
release: false # Use pre-installed version | |
install: >- | |
base-devel | |
${{ matrix.target-prefix }}-cc | |
${{ matrix.target-prefix }}-${{ matrix.fc-pkg }} | |
${{ matrix.target-prefix }}-cmake | |
${{ matrix.target-prefix }}-ninja | |
${{ matrix.target-prefix }}-ccache | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Prepare ccache | |
# Get cache location of ccache | |
# Create key that is used in action/cache/restore and action/cache/save steps | |
id: ccache-prepare | |
run: | | |
echo "ccachedir=$(cygpath -m $(ccache -k cache_dir))" >> $GITHUB_OUTPUT | |
# We include the commit sha in the cache key, as new cache entries are | |
# only created if there is no existing entry for the key yet. | |
echo "key=ccache-msys2-${{ matrix.msystem }}-${{ matrix.idx }}-${{ matrix.build-type }}-${{ github.ref }}-${{ github.sha }}" >> $GITHUB_OUTPUT | |
- name: Restore ccache | |
uses: actions/cache/restore@v3 | |
with: | |
path: ${{ steps.ccache-prepare.outputs.ccachedir }} | |
key: ${{ steps.ccache-prepare.outputs.key }} | |
# Restore a matching ccache cache entry. Prefer same branch. | |
restore-keys: | | |
ccache-msys2-${{ matrix.msystem }}-${{ matrix.idx }}-${{ matrix.build-type }}-${{ github.ref }} | |
ccache-msys2-${{ matrix.msystem }}-${{ matrix.idx }}-${{ matrix.build-type }} | |
- name: Configure ccache | |
# Limit the maximum size and switch on compression to avoid exceeding the total disk or cache quota. | |
run: | | |
which ccache | |
test -d ${{ steps.ccache-prepare.outputs.ccachedir }} || mkdir -p ${{ steps.ccache-prepare.outputs.ccachedir }} | |
echo "max_size = 250M" > ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf | |
echo "compression = true" >> ${{ steps.ccache-prepare.outputs.ccachedir }}/ccache.conf | |
ccache -p | |
ccache -s | |
echo $HOME | |
cygpath -w $HOME | |
- name: Configure OpenBLAS | |
run: | | |
mkdir build && cd build | |
cmake -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ | |
-DBUILD_SHARED_LIBS=ON \ | |
-DBUILD_STATIC_LIBS=ON \ | |
-DDYNAMIC_ARCH=ON \ | |
-DUSE_THREAD=ON \ | |
-DNUM_THREADS=64 \ | |
-DTARGET=CORE2 \ | |
${{ matrix.idx64-flags }} \ | |
${{ matrix.c-lapack-flags }} \ | |
${{ matrix.no-avx512-flags }} \ | |
-DCMAKE_C_COMPILER_LAUNCHER=ccache \ | |
-DCMAKE_Fortran_COMPILER_LAUNCHER=ccache \ | |
.. | |
- name: Build OpenBLAS | |
run: cd build && cmake --build . | |
- name: Show ccache status | |
continue-on-error: true | |
run: ccache -s | |
- name: Save ccache | |
# Save the cache after we are done (successfully) building | |
uses: actions/cache/save@v3 | |
with: | |
path: ${{ steps.ccache-prepare.outputs.ccachedir }} | |
key: ${{ steps.ccache-prepare.outputs.key }} | |
- name: Run tests | |
id: run-ctest | |
timeout-minutes: 60 | |
run: cd build && ctest | |
- name: Re-run tests | |
if: always() && (steps.run-ctest.outcome == 'failure') | |
timeout-minutes: 60 | |
run: | | |
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::" | |
cross_build: | |
if: "github.repository == 'OpenMathLib/OpenBLAS'" | |
runs-on: ubuntu-22.04 | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- target: mips64el | |
triple: mips64el-linux-gnuabi64 | |
opts: DYNAMIC_ARCH=1 TARGET=GENERIC | |
- target: riscv64 | |
triple: riscv64-linux-gnu | |
opts: TARGET=RISCV64_GENERIC | |
- target: mipsel | |
triple: mipsel-linux-gnu | |
opts: TARGET=MIPS1004K | |
- target: alpha | |
triple: alpha-linux-gnu | |
opts: TARGET=EV4 | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Install Dependencies | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y ccache gcc-${{ matrix.triple }} gfortran-${{ matrix.triple }} libgomp1-${{ matrix.target }}-cross | |
- name: Compilation cache | |
uses: actions/cache@v3 | |
with: | |
path: ~/.ccache | |
key: ccache-${{ runner.os }}-${{ matrix.target }}-${{ github.ref }}-${{ github.sha }} | |
restore-keys: | | |
ccache-${{ runner.os }}-${{ matrix.target }}-${{ github.ref }} | |
ccache-${{ runner.os }}-${{ matrix.target }} | |
- name: Configure ccache | |
run: | | |
# Limit the maximum size and switch on compression to avoid exceeding the total disk or cache quota (5 GB). | |
test -d ~/.ccache || mkdir -p ~/.ccache | |
echo "max_size = 300M" > ~/.ccache/ccache.conf | |
echo "compression = true" >> ~/.ccache/ccache.conf | |
ccache -s | |
- name: Build OpenBLAS | |
run: | | |
make -j$(nproc) HOSTCC="ccache gcc" CC="ccache ${{ matrix.triple }}-gcc" FC="ccache ${{ matrix.triple }}-gfortran" ARCH=${{ matrix.target }} ${{ matrix.opts }} |