| @@ -0,0 +1,149 @@ | |||
| name: apple m | |||
| 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: macos-14 | |||
| strategy: | |||
| fail-fast: false | |||
| matrix: | |||
| build: [cmake, make] | |||
| fortran: [gfortran] | |||
| openmp: [0, 1] | |||
| ilp64: [0, 1] | |||
| 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 | |||
| brew install llvm | |||
| 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 | |||
| echo "/opt/homebrew/opt/llvm/bin" >>$GITHUB_PATH | |||
| echo "" >>$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: | | |||
| export LDFLAGS="-L/opt/homebrew/opt/llvm/lib" | |||
| export CPPFLAGS="-I/opt/homebrew/opt/llvm/include" | |||
| export CC="/opt/homebrew/opt/llvm/bin/clang" | |||
| case "${{ matrix.build }}" in | |||
| "make") | |||
| make -j$(nproc) DYNAMIC_ARCH=1 USE_OPENMP=${{matrix.openmp}} INTERFACE64=${{matrix.ilp64}} FC="ccache ${{ matrix.fortran }}" | |||
| ;; | |||
| "cmake") | |||
| export LDFLAGS="$LDFLAGS -Wl,-ld_classic" | |||
| mkdir build && cd build | |||
| cmake -DDYNAMIC_ARCH=1 \ | |||
| -DUSE_OPENMP=${{matrix.openmp}} \ | |||
| -DINTERFACE64=${{matrix.ilp64}} \ | |||
| -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 | |||