summaryrefslogtreecommitdiff
path: root/cmark/.github/workflows/ci.yml
blob: 09ee0d6c3ca597ff00f4d37d6e0895355ee7cae5 (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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
name: CI tests

on:
  push:
    branches-ignore:
      - 'dependabot/**'
  pull_request:
  workflow_dispatch:

jobs:

  linter:

    runs-on: ubuntu-latest

    steps:

    - uses: actions/checkout@v6
    - name: Install clang-tidy
      run: |
        sudo apt-get install -y clang-tidy
    - name: lint with clang-tidy
      run: |
        make lint
      env:
        CC: clang
        CXX: clang++

  posix:

    strategy:
      fail-fast: false
      matrix:
        os: [linux, macos]
        cc: [clang, gcc]
        build_type: [shared, static]
        sanitizers: ['', ASan]

        include:
          # Translate human readable labels
          - os: 'linux'
            image: 'ubuntu-latest'
          - os: 'macos'
            image: 'macos-latest'
          - cc: 'clang'
            cxx: 'clang++'
          - cc: 'gcc'
            cxx: 'g++'
          - build_type: 'shared'
            cmake_shared: 'YES'
          - build_type: 'static'
            cmake_shared: 'NO'
          - sanitizers: 'ASan'
            san_cflags: '-fsanitize=address,undefined -fno-sanitize-recover=all'

          # When building shared libraries, they will be loaded
          # dynamically from Python when testing. This means that
          # we have to use a preloaded shared libasan.
          - sanitizers: 'ASan'
            os: 'linux'
            cc: 'gcc'
            build_type: 'shared'
            test_env: 'LD_PRELOAD=$(gcc -print-file-name=libasan.so)'
          - sanitizers: 'ASan'
            os: 'linux'
            cc: 'clang'
            build_type: 'shared'
            # clang defaults to -static-libsasn
            asan_cflags: '-shared-libasan'
            test_env: 'LD_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so)'

          # We have to disable LeakSanitizer in shared library builds
          # because we get false positives from Python.
          - sanitizers: 'ASan'
            build_type: 'shared'
            asan_opts: 'detect_leaks=0'

          # The static build can run with LeakSanitizer.
          # gcc defaults to -shared-libasan and needs -static-libasan
          - sanitizers: 'ASan'
            cc: 'gcc'
            build_type: 'static'
            asan_cflags: '-static-libasan'

        exclude:
          # gcc is just an alias for clang on macOS
          - os: 'macos'
            cc: 'gcc'
          # Shared libasan doesn't work with macOS system Python.
          - os: 'macos'
            sanitizers: 'ASan'
            build_type: 'shared'

    runs-on: ${{ matrix.image }}

    env:
       ASAN_OPTIONS: ${{ matrix.asan_opts }}
       CC: ${{ matrix.cc }}
       CXX: ${{ matrix.cxx }}
       CFLAGS: '${{ matrix.san_cflags }} ${{ matrix.asan_cflags }}'
       CXXFLAGS: '${{ matrix.san_cflags }} ${{ matrix.asan_cflags }}'

    steps:
    - uses: actions/checkout@v6
    - name: Build and test
      run: |
         cmake \
            -DBUILD_SHARED_LIBS=${{ matrix.cmake_shared }} \
            -DCMAKE_BUILD_TYPE=Debug \
            -S . -B build
         cmake --build build
         ${{ matrix.test_env }} ctest --test-dir build --output-on-failure

  windows:

    runs-on: windows-latest
    strategy:
      fail-fast: false
      matrix:
        build_type: [shared, static]
        include:
          - build_type: 'shared'
            cmake_shared: 'YES'
          - build_type: 'static'
            cmake_shared: 'NO'

    steps:
    - uses: actions/checkout@v6
    - uses: ilammy/msvc-dev-cmd@v1
    - name: Build and test
      run: |
        cmake ^
            -DBUILD_SHARED_LIBS=${{ matrix.cmake_shared }} ^
            -DCMAKE_BUILD_TYPE=Debug ^
            -S . -B build
        cmake --build build
        ctest --test-dir build -C Debug --output-on-failure
      shell: cmd
    - name: Upload artifact
      if: ${{ matrix.build_type == 'static' }}
      uses: actions/upload-artifact@v7
      with:
        name: cmark windows ${{ matrix.build_type }}
        path: build/src/Debug/cmark.exe
        if-no-files-found: error