| 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 }} |