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 update sudo apt-get install -y gfortran cmake ccache wget http://security.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_amd64.deb sudo apt install ./libtinfo5_6.3-2ubuntu0.1_amd64.deb 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] 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 - 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 - msystem: UCRT64 idx: int32 target-prefix: mingw-w64-ucrt-x86_64 fc-pkg: fc build-type: None exclude: - msystem: MINGW32 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 }} \ -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 }} neoverse_build: if: "github.repository == 'OpenMathLib/OpenBLAS'" runs-on: ubuntu-24.04-arm steps: - name: Checkout repository uses: actions/checkout@v3 - name: Install Dependencies run: | sudo apt-get update sudo apt-get install -y gcc gfortran make - name: Build OpenBLAS run: | make -j${nproc} TARGET=NEOVERSEN2 make -j${nproc} TARGET=NEOVERSEN2 lapack-test