summaryrefslogtreecommitdiff
path: root/.github/workflows/libc-overlay-tests.yml
blob: df9a20dce8eae5336080cb5d510da322c064a871 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# This workflow is for pre-commit testing of the LLVM-libc project.
name: LLVM-libc Pre-commit Overlay Tests
permissions:
  contents: read
on:
  pull_request:
    branches: [ "main" ]
    paths:
      - 'libc/**'
      - '.github/workflows/libc-overlay-tests.yml'

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      # Set fail-fast to false to ensure that feedback is delivered for all matrix combinations.
      fail-fast: false
      matrix:
        os: [ubuntu-24.04, ubuntu-24.04-arm, windows-2022, windows-2025, macos-14]
        include:
          # TODO: add linux gcc when it is fixed
          - os: ubuntu-24.04
            compiler:
              c_compiler: clang
              cpp_compiler: clang++
          - os: ubuntu-24.04-arm
            compiler:
              c_compiler: clang
              cpp_compiler: clang++
          - os: windows-2022
            compiler:
              c_compiler: clang-cl
              cpp_compiler: clang-cl
          - os: windows-2025
            compiler:
              c_compiler: clang-cl
              cpp_compiler: clang-cl
          - os: macos-14
            compiler:
              c_compiler: clang
              cpp_compiler: clang++
    
    steps:
    - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
    
    # Libc's build is relatively small comparing with other components of LLVM.
    # A fresh linux overlay takes about 180MiB of uncompressed disk space, which can
    # be compressed into ~40MiB. MacOS and Windows overlay builds are less than 10MiB
    # after compression. Limiting the cache size to 1G should be enough.
    # Prefer sccache as it is modern and it has a guarantee to work with MSVC.
    # Do not use direct GHAC access even though it is supported by sccache. GHAC rejects
    # frequent small object writes.
    - name: Setup ccache
      uses: hendrikmuhs/ccache-action@bfa03e1de4d7f7c3e80ad9109feedd05c4f5a716 # v1.2.19
      with:
        max-size: 1G
        key: libc_overlay_build_${{ matrix.os }}_${{ matrix.compiler.c_compiler }}
        variant: sccache
    
    # MPFR is required by some of the mathlib tests.
    - name: Prepare dependencies (Ubuntu)
      if: runner.os == 'Linux'
      run: |
        sudo apt-get update
        sudo apt-get install -y libmpfr-dev libgmp-dev libmpc-dev ninja-build
    
    # Chocolatey is shipped with Windows runners. Windows Server 2025 recommends WinGet.
    # Consider migrating to WinGet when Windows Server 2025 is available.
    - name: Prepare dependencies (Windows)
      if: runner.os == 'Windows'
      run: |
        choco install ninja
    
    - name: Prepare dependencies (macOS)
      if: runner.os == 'macOS'
      run: |
        brew install ninja

    - name: Set reusable strings
      id: strings
      shell: bash
      run: |
        echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT"

    # Use MinSizeRel to reduce the size of the build.
    # Notice that CMP0141=NEW and MSVC_DEBUG_INFORMATION_FORMAT=Embedded are required
    # by the sccache tool.
    - name: Configure CMake
      run: >
        cmake -B ${{ steps.strings.outputs.build-output-dir }}
        -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cpp_compiler }}
        -DCMAKE_C_COMPILER=${{ matrix.compiler.c_compiler }}
        -DCMAKE_BUILD_TYPE=Debug
        -DCMAKE_C_COMPILER_LAUNCHER=sccache
        -DCMAKE_CXX_COMPILER_LAUNCHER=sccache
        -DCMAKE_POLICY_DEFAULT_CMP0141=NEW
        -DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=Embedded
        -DLLVM_ENABLE_RUNTIMES=libc
        -G Ninja
        -S ${{ github.workspace }}/runtimes

    - name: Build
      run: >
        cmake 
        --build ${{ steps.strings.outputs.build-output-dir }} 
        --parallel 
        --target libc

    - name: Test
      run: >
        cmake 
        --build ${{ steps.strings.outputs.build-output-dir }} 
        --parallel 
        --target check-libc