| # This file defines pre-commit CI for libc++, libc++abi, and libunwind (on Github). |
| # |
| # We split the configurations in multiple stages with the intent of saving compute time |
| # when a job fails early in the pipeline. This is why the jobs are marked as `continue-on-error: false`. |
| # We try to run the CI configurations with the most signal in the first stage. |
| # |
| # Stages 1 & 2 are meant to be "smoke tests", and are meant to catch most build/test failures quickly and without using |
| # too many resources. |
| # Stage 3 is "everything else", and is meant to catch breakages on more niche or unique configurations. |
| # |
| # Therefore, we "fail-fast" for any failures during stages 1 & 2, meaning any job failing cancels all other running jobs, |
| # under the assumption that if the "smoke tests" fail, then the other configurations will likely fail in the same way. |
| # However, stage 3 does not fail fast, as it's more likely that any one job failing is a flake or a configuration-specific |
| # |
| name: Build and Test libc++ |
| on: |
| pull_request: |
| paths: |
| - 'libcxx/**' |
| - 'libcxxabi/**' |
| - 'libunwind/**' |
| - 'runtimes/**' |
| - 'cmake/**' |
| - '.github/workflows/libcxx-build-and-test.yaml' |
| schedule: |
| # Run nightly at 08:00 UTC (aka 00:00 Pacific, aka 03:00 Eastern) |
| - cron: '0 8 * * *' |
| |
| permissions: |
| contents: read # Default everything to read-only |
| |
| concurrency: |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number }} |
| cancel-in-progress: true |
| |
| jobs: |
| stage1: |
| if: github.repository_owner == 'llvm' |
| runs-on: llvm-premerge-libcxx-runners |
| continue-on-error: false |
| strategy: |
| fail-fast: false |
| matrix: |
| config: [ |
| 'frozen-cxx03-headers', |
| 'generic-cxx03', |
| 'generic-cxx26', |
| 'generic-modules' |
| ] |
| cc: [ 'clang-22' ] |
| cxx: [ 'clang++-22' ] |
| include: |
| - config: 'generic-gcc' |
| cc: 'gcc-15' |
| cxx: 'g++-15' |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: ${{ matrix.config }}.${{ matrix.cxx }} |
| run: libcxx/utils/ci/run-buildbot ${{ matrix.config }} |
| env: |
| CC: ${{ matrix.cc }} |
| CXX: ${{ matrix.cxx }} |
| - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 |
| if: always() |
| with: |
| name: ${{ matrix.config }}-${{ matrix.cxx }}-results |
| path: | |
| **/test-results.xml |
| **/*.abilist |
| **/CMakeConfigureLog.yaml |
| **/CMakeError.log |
| **/CMakeOutput.log |
| **/crash_diagnostics/* |
| stage2: |
| if: github.repository_owner == 'llvm' |
| runs-on: llvm-premerge-libcxx-runners |
| needs: [ stage1 ] |
| continue-on-error: false |
| strategy: |
| fail-fast: false |
| matrix: |
| config: [ |
| 'generic-cxx11', |
| 'generic-cxx14', |
| 'generic-cxx17', |
| 'generic-cxx20', |
| 'generic-cxx23' |
| ] |
| cc: [ 'clang-22' ] |
| cxx: [ 'clang++-22' ] |
| include: |
| - config: 'generic-gcc-cxx11' |
| cc: 'gcc-15' |
| cxx: 'g++-15' |
| - config: 'generic-cxx26' |
| cc: 'clang-21' |
| cxx: 'clang++-21' |
| - config: 'generic-cxx26' |
| cc: 'clang-20' |
| cxx: 'clang++-20' |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: ${{ matrix.config }} |
| run: libcxx/utils/ci/run-buildbot ${{ matrix.config }} |
| env: |
| CC: ${{ matrix.cc }} |
| CXX: ${{ matrix.cxx }} |
| - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 |
| if: always() # Upload artifacts even if the build or test suite fails |
| with: |
| name: ${{ matrix.config }}-${{ matrix.cxx }}-results |
| path: | |
| **/test-results.xml |
| **/*.abilist |
| **/CMakeConfigureLog.yaml |
| **/CMakeError.log |
| **/CMakeOutput.log |
| **/crash_diagnostics/* |
| stage3: |
| if: github.repository_owner == 'llvm' |
| needs: [ stage2 ] |
| continue-on-error: false |
| strategy: |
| fail-fast: false |
| max-parallel: 8 |
| matrix: |
| config: [ |
| 'generic-abi-unstable', |
| 'generic-hardening-mode-debug', |
| 'generic-hardening-mode-extensive', |
| 'generic-hardening-mode-extensive-observe-semantic', |
| 'generic-hardening-mode-fast', |
| 'generic-hardening-mode-fast-with-abi-breaks', |
| 'generic-merged', |
| 'generic-modules-cxx17-lsv', |
| 'generic-no-exceptions', |
| 'generic-no-experimental', |
| 'generic-no-filesystem', |
| 'generic-no-localization', |
| 'generic-no-terminal', |
| 'generic-no-random_device', |
| 'generic-no-threads', |
| 'generic-no-tzdb', |
| 'generic-no-unicode', |
| 'generic-no-wide-characters', |
| 'generic-no-rtti', |
| 'generic-optimized-speed', |
| 'generic-static', |
| 'bootstrapping-build' |
| ] |
| machine: [ 'llvm-premerge-libcxx-runners' ] |
| include: |
| - config: 'generic-cxx26' |
| machine: llvm-premerge-libcxx-runners |
| - config: 'generic-asan' |
| machine: llvm-premerge-libcxx-runners |
| - config: 'generic-tsan' |
| machine: llvm-premerge-libcxx-runners |
| - config: 'generic-ubsan' |
| machine: llvm-premerge-libcxx-runners |
| # Use a larger machine for MSAN to avoid timeout and memory allocation issues. |
| - config: 'generic-msan' |
| machine: llvm-premerge-libcxx-runners |
| runs-on: ${{ matrix.machine }} |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: ${{ matrix.config }} |
| run: libcxx/utils/ci/run-buildbot ${{ matrix.config }} |
| env: |
| CC: clang-22 |
| CXX: clang++-22 |
| - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 |
| if: always() |
| with: |
| name: ${{ matrix.config }}-results |
| path: | |
| **/test-results.xml |
| **/*.abilist |
| **/CMakeConfigureLog.yaml |
| **/CMakeError.log |
| **/CMakeOutput.log |
| **/crash_diagnostics/* |
| |
| macos: |
| needs: [ stage2 ] |
| strategy: |
| fail-fast: false |
| matrix: |
| include: |
| - config: generic-cxx03 |
| os: macos-15 |
| - config: generic-cxx23 |
| os: macos-15 |
| - config: generic-modules |
| os: macos-15 |
| - config: apple-configuration |
| os: macos-15 |
| # TODO: These jobs are intended to test back-deployment (building against ToT libc++ but running against an |
| # older system-provided libc++.dylib). Doing this properly would require building the test suite on a |
| # recent macOS using a recent Clang (hence recent Xcode), and then running the actual test suite on an |
| # older mac. We could do that by e.g. sharing artifacts between the two jobs. |
| # |
| # However, our Lit configuration currently doesn't provide a good way to do that in a batch, so our only |
| # alternative is to actually build on the same host that we're going to run on. Sadly, that doesn't work |
| # since older macOSes don't support newer Xcodes. For now, we run the "backdeployment" jobs on recent |
| # macOS versions as a way to avoid rotting that configuration, but it doesn't provide a lot of additional |
| # coverage. |
| - config: apple-system |
| os: macos-15 |
| - config: apple-system-hardened |
| os: macos-15 |
| runs-on: ${{ matrix.os }} |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0 |
| with: |
| # https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md |
| xcode-version: '26.0' |
| - uses: seanmiddleditch/gha-setup-ninja@3b1f8f94a2f8254bd26914c4ab9474d4f0015f67 # v6 |
| - name: Build and test |
| run: | |
| python3 -m venv .venv |
| source .venv/bin/activate |
| python -m pip install psutil |
| xcrun bash libcxx/utils/ci/run-buildbot ${{ matrix.config }} |
| env: |
| CC: clang |
| CXX: clang++ |
| - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 |
| if: always() # Upload artifacts even if the build or test suite fails |
| with: |
| name: macos-${{ matrix.config }}-results |
| path: | |
| **/test-results.xml |
| **/*.abilist |
| **/CMakeConfigureLog.yaml |
| **/CMakeError.log |
| **/CMakeOutput.log |
| **/crash_diagnostics/* |
| |
| windows: |
| needs: [ stage2 ] |
| strategy: |
| fail-fast: false |
| matrix: |
| include: |
| - { config: clang-cl-dll, mingw: false, cc: clang-cl, cxx: clang-cl } |
| - { config: clang-cl-static, mingw: false, cc: clang-cl, cxx: clang-cl } |
| - { config: clang-cl-no-vcruntime, mingw: false, cc: clang-cl, cxx: clang-cl } |
| - { config: clang-cl-debug, mingw: false, cc: clang-cl, cxx: clang-cl } |
| - { config: clang-cl-static-crt, mingw: false, cc: clang-cl, cxx: clang-cl } |
| - { config: mingw-dll, mingw: true, cc: cc, cxx: c++ } |
| - { config: mingw-dll, mingw: true, cc: i686-w64-mingw32-clang, cxx: i686-w64-mingw32-clang++ } |
| - { config: mingw-static, mingw: true, cc: cc, cxx: c++ } |
| - { config: mingw-incomplete-sysroot, mingw: true, cc: cc, cxx: c++ } |
| - { config: mingw-static, mingw: true, cc: cc, cxx: c++, runner: windows-11-arm } |
| runs-on: ${{ matrix.runner != '' && matrix.runner || 'windows-2022' }} |
| steps: |
| - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 |
| - name: Install dependencies |
| run: | |
| pip install psutil |
| - name: Install a current LLVM |
| if: ${{ matrix.mingw != true }} |
| run: | |
| choco install -y llvm --version=20.1.8 --allow-downgrade |
| - name: Install llvm-mingw |
| if: ${{ matrix.mingw == true }} |
| run: | |
| curl -LO https://github.com/mstorsjo/llvm-mingw/releases/download/20250709/llvm-mingw-20250709-ucrt-${{ matrix.runner == 'windows-11-arm' && 'aarch64' || 'x86_64' }}.zip |
| powershell Expand-Archive llvm-mingw*.zip -DestinationPath . |
| del llvm-mingw*.zip |
| mv llvm-mingw* c:\llvm-mingw |
| echo "c:\llvm-mingw\bin" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append |
| - name: Simulate a from-scratch build of llvm-mingw |
| if: ${{ matrix.config == 'mingw-incomplete-sysroot' }} |
| run: | |
| rm -r c:\llvm-mingw\include\c++ |
| rm -r c:\llvm-mingw\*-w64-mingw32\lib\libc++* |
| rm -r c:\llvm-mingw\*-w64-mingw32\lib\libunwind* |
| - name: Add Git Bash to the path |
| run: | |
| echo "c:\Program Files\Git\usr\bin" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append |
| - name: Set up the MSVC dev environment |
| if: ${{ matrix.mingw != true }} |
| uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0 |
| - name: Add the installed Clang at the start of the path |
| if: ${{ matrix.mingw != true }} |
| run: | |
| echo "c:\Program Files\LLVM\bin" | Out-File -FilePath $Env:GITHUB_PATH -Encoding utf8 -Append |
| - name: Build and test |
| run: bash libcxx/utils/ci/run-buildbot ${{ matrix.config }} |
| env: |
| CC: ${{ matrix.cc }} |
| CXX: ${{ matrix.cxx }} |