blob: ef1250f985fb96058c0c40fd7e12ce856c278cd8 [file] [edit]
name: Build and Run Tests
on:
workflow_call:
inputs:
run-tests:
description: 'Whether to also run unit tests where possible.'
default: true
required: false
type: boolean
update-caches:
description: 'Whether to update the `ccache` or `bazel` caches, where possible.'
default: false
required: false
type: boolean
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}-${{ inputs.update-caches }}
cancel-in-progress: true
jobs:
cmake-linux-x86_64:
runs-on: ubuntu-22.04-8core
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Update apt
run: |
echo 'set man-db/auto-update false' | sudo debconf-communicate >/dev/null
sudo dpkg-reconfigure man-db
sudo apt update
- name: Install ninja
run: sudo apt install ninja-build
- name: Setup ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: v2-${{ github.job }}
max-size: "500M"
save: ${{ inputs.update-caches }}
- name: Create output directory
run: mkdir -p build
working-directory: ${{ github.workspace }}
- name: Configure and build
run: |
cmake .. -DCMAKE_BUILD_TYPE=Release -GNinja -DPTHREADPOOL_BUILD_TESTS=ON
cmake --build . -- "-j$((2*$(nproc)))"
working-directory: ${{ github.workspace }}/build
- name: Run tests
if: ${{ inputs.run-tests }}
run: ctest --output-on-failure --parallel $(nproc)
working-directory: ${{ github.workspace }}/build
cmake-linux-aarch64:
runs-on: arm-ubuntu-arm-22.04-8core
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Update apt
run: |
echo 'set man-db/auto-update false' | sudo debconf-communicate >/dev/null
sudo dpkg-reconfigure man-db
sudo apt update
- name: Install ninja
run: sudo apt install ninja-build
- name: Setup ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: v2-${{ github.job }}
max-size: "500M"
save: ${{ inputs.update-caches }}
- name: Create output directory
run: mkdir -p build
working-directory: ${{ github.workspace }}
- name: Configure and build
run: |
set -e
cmake .. -DCMAKE_BUILD_TYPE=Release -GNinja -DPTHREADPOOL_BUILD_TESTS=ON
cmake --build . -- "-j$((2*$(nproc)))"
working-directory: ${{ github.workspace }}/build
- name: Run tests
if: ${{ inputs.run-tests }}
run: ctest --output-on-failure --parallel $(nproc)
working-directory: ${{ github.workspace }}/build
cmake-windows-arm64:
runs-on: windows-2022-32core
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Setup ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: v2-${{ github.job }}
max-size: "500M"
save: ${{ inputs.update-caches }}
- name: Install Ninja
uses: seanmiddleditch/gha-setup-ninja@master
- name: Setup build environment
shell: bash
run: |
echo "VCVARSALL=$(vswhere -products \* -latest -property installationPath)\\VC\\Auxiliary\\Build\\vcvarsall.bat" >> $GITHUB_ENV
- name: Configure and build
run: scripts/build-windows-arm64.cmd
shell: cmd
working-directory: ${{ github.workspace }}
env:
CFLAGS: "/UNDEBUG"
CXXFLAGS: "/UNDEBUG"
cmake-windows-x64:
runs-on: windows-2022-32core
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Setup ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: v2-${{ github.job }}
max-size: "500M"
save: ${{ inputs.update-caches }}
- name: Install Ninja
uses: seanmiddleditch/gha-setup-ninja@master
- name: Setup build environment
shell: bash
run: |
echo "VCVARSALL=$(vswhere -products \* -latest -property installationPath)\\VC\\Auxiliary\\Build\\vcvarsall.bat" >> $GITHUB_ENV
- name: Configure and build
run: scripts/build-windows-x64.cmd
shell: cmd
working-directory: ${{ github.workspace }}
env:
CFLAGS: "/UNDEBUG"
CXXFLAGS: "/UNDEBUG"
- name: Run tests
if: ${{ inputs.run-tests }}
run: ctest -C Release --output-on-failure --parallel $NUMBER_OF_PROCESSORS
working-directory: ${{ github.workspace }}/build
cmake-windows-x86:
runs-on: windows-2022-32core
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Setup ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: v2-${{ github.job }}
max-size: "500M"
save: ${{ inputs.update-caches }}
- name: Install Ninja
uses: seanmiddleditch/gha-setup-ninja@master
- name: Setup build environment
shell: bash
run: |
echo "VCVARSALL=$(vswhere -products \* -latest -property installationPath)\\VC\\Auxiliary\\Build\\vcvarsall.bat" >> $GITHUB_ENV
- name: Configure and build
run: scripts/build-windows-x86.cmd
shell: cmd
working-directory: ${{ github.workspace }}
env:
CFLAGS: "/UNDEBUG"
CXXFLAGS: "/UNDEBUG"
- name: Run tests
if: ${{ inputs.run-tests }}
run: ctest -C Release --output-on-failure --parallel $NUMBER_OF_PROCESSORS
working-directory: ${{ github.workspace }}/build
cmake-macos-arm64:
runs-on: macos-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Install ninja
run: brew install ninja
- name: Setup ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: v2-${{ github.job }}
max-size: "500M"
save: ${{ inputs.update-caches }}
- name: Create output directory
run: mkdir -p build
working-directory: ${{ github.workspace }}
- name: Generate CMake project
run: |
cmake \
-G Ninja \
-DCMAKE_CONFIGURATION_TYPES=Release \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DHAVE_STD_REGEX=TRUE \
..
working-directory: ${{ github.workspace }}/build
- name: Build with Xcode
run: |
cmake \
--build . \
-j$((2*$(sysctl -n hw.ncpu)))
working-directory: ${{ github.workspace }}/build
cmake-android:
strategy:
matrix:
arch: [arm64, armv7, x86]
runs-on: ubuntu-22.04-8core
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Update apt
run: |
echo 'set man-db/auto-update false' | sudo debconf-communicate >/dev/null
sudo dpkg-reconfigure man-db
sudo apt update
- name: Install ninja
run: sudo apt install ninja-build
- name: Setup Android NDK
id: setup-ndk
uses: nttld/setup-ndk@v1
with:
ndk-version: r23b
add-to-path: false
- name: Setup ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: v2-${{ github.job }}-${{ matrix.arch }}
max-size: "500M"
save: ${{ inputs.update-caches }}
- name: Force compiler binary mtime
# The nttld/setup-ndk action downloads the compiler binaries and copies them to the
# tools-cache, where their mtimes are set to the current time. This is bad since ccache
# uses the compiler binary mtime to determine whether two compilations match. We solve
# this problem by coercing the mtime of the compiler binaries to a fixed value. Note that
# if the compiler does indeed change, this will also cause the path to change as it would
# imply using a different NDK version.
run: |
find ${{ steps.setup-ndk.outputs.ndk-path }} -wholename '*/bin/clang*' -executable -type f,l -exec touch -h -t 202408130000 {} +
- name: Configure and build
run: scripts/build-android-${{ matrix.arch }}.sh
working-directory: ${{ github.workspace }}
env:
ANDROID_NDK: ${{ steps.setup-ndk.outputs.ndk-path }}
cmake-ios-arm64:
runs-on: macos-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Create output directory
run: mkdir -p build
working-directory: ${{ github.workspace }}
- name: Generate CMake project
run: |
cmake \
-G Xcode \
-DCMAKE_SYSTEM_NAME=iOS \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DPTHREADPOOL_BUILD_BENCHMARKS=OFF \
-DPTHREADPOOL_BUILD_TESTS=OFF \
..
working-directory: ${{ github.workspace }}/build
- name: Build with Xcode
run: cmake --build . --parallel $(sysctl -n hw.ncpu) -- -quiet
working-directory: ${{ github.workspace }}/build
cmake-ios-x86_64:
runs-on: macos-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Create output directory
run: mkdir -p build
working-directory: ${{ github.workspace }}
- name: Generate CMake project
run: |
cmake \
-G Xcode \
-DCMAKE_SYSTEM_NAME=iOS \
-DCMAKE_OSX_ARCHITECTURES=x86_64 \
-DPTHREADPOOL_BUILD_BENCHMARKS=OFF \
-DPTHREADPOOL_BUILD_TESTS=OFF \
..
working-directory: ${{ github.workspace }}/build
- name: Build with Xcode
run: cmake --build . --parallel $(sysctl -n hw.ncpu) -- -sdk iphonesimulator -quiet
working-directory: ${{ github.workspace }}/build
bazel-linux-x86_64-clang-18:
runs-on: ubuntu-22.04-8core
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Update apt
run: |
echo 'set man-db/auto-update false' | sudo debconf-communicate >/dev/null
sudo dpkg-reconfigure man-db
sudo apt update
- name: Install clang-18
working-directory: ${{ github.workspace }}
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 18
- name: Restore bazel cache
uses: actions/cache/restore@v4
with:
path: "/home/runner/.cache/bazel"
key: v2-${{ github.job }}
restore-keys: |
v2-${{ github.job }}-
- name: Build and run tests
if: ${{ inputs.run-tests }}
env:
CC: clang-18
CXX: clang++-18
run: |
bazel test --test_output=errors :pthreadpool_test :pthreadpool_cxx_test
working-directory: ${{ github.workspace }}
- name: Compress disk cache
# Bazel's `--disk-cache` currently grows without bounds, so we remove files
# that haven't been accessed in 7+ days manually.
if: ${{ inputs.update-caches }}
run: find $HOME/.cache/bazel -type f -atime +7 -delete
- name: Save bazel cache
if: ${{ inputs.update-caches }}
uses: actions/cache/save@v4
with:
path: "/home/runner/.cache/bazel"
key: v2-${{ github.job }}-${{ github.sha }}
bazel-linux-aarch64-clang18:
runs-on: arm-ubuntu-arm-22.04-4core
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
- name: Update apt
run: |
echo 'set man-db/auto-update false' | sudo debconf-communicate >/dev/null
sudo dpkg-reconfigure man-db
sudo apt update
- name: Install clang-18
working-directory: ${{ github.workspace }}
run: |
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 18
- name: Restore bazel cache
uses: actions/cache/restore@v4
with:
path: "/home/runner/.cache/bazel"
key: v2-${{ github.job }}
restore-keys: |
v2-${{ github.job }}-
- name: Build and run tests
if: ${{ inputs.run-tests }}
env:
CC: clang-18
CXX: clang++-18
run: |
bazel test --verbose_failures --test_output=errors :pthreadpool_test :pthreadpool_cxx_test
working-directory: ${{ github.workspace }}
- name: Compress disk cache
# Bazel's `--disk-cache` currently grows without bounds, so we remove files
# that haven't been accessed in 7+ days manually.
if: ${{ inputs.update-caches }}
run: find $HOME/.cache/bazel -type f -atime +7 -delete
- name: Save bazel cache
if: ${{ inputs.update-caches }}
uses: actions/cache/save@v4
with:
path: "/home/runner/.cache/bazel"
key: v2-${{ github.job }}-${{ github.sha }}
bazel-linux-x86_64-gcc-9:
runs-on: ubuntu-22.04-8core
timeout-minutes: 60
env:
CC: gcc-9
CXX: g++-9
steps:
- uses: actions/checkout@v4
- name: Update apt
run: |
echo 'set man-db/auto-update false' | sudo debconf-communicate >/dev/null
sudo dpkg-reconfigure man-db
sudo apt update
- name: Install gcc-9
working-directory: ${{ github.workspace }}
run: |
sudo apt install gcc-9 g++-9
- name: Restore bazel cache
uses: actions/cache/restore@v4
with:
path: "/home/runner/.cache/bazel"
key: v2-${{ github.job }}
restore-keys: |
v2-${{ github.job }}-
- name: Build tests
run: |
bazel build ${BAZEL_DEFINES} :pthreadpool_test :pthreadpool_cxx_test
working-directory: ${{ github.workspace }}
- name: Run tests
if: ${{ inputs.run-tests }}
run: |
bazel test ${BAZEL_DEFINES} --test_output=errors :pthreadpool_test :pthreadpool_cxx_test
working-directory: ${{ github.workspace }}
- name: Compress disk cache
# Bazel's `--disk-cache` currently grows without bounds, so we remove files
# that haven't been accessed in 7+ days manually.
if: ${{ inputs.update-caches }}
run: find $HOME/.cache/bazel -type f -atime +7 -delete
- name: Save bazel cache
if: ${{ inputs.update-caches }}
uses: actions/cache/save@v4
with:
path: "/home/runner/.cache/bazel"
key: v2-${{ github.job }}-${{ github.sha }}