Skip to content

Commit 0e95839

Browse files
pmqsmadler
authored andcommitted
Add github workflow to build with all available C standards.
1 parent d9243a0 commit 0e95839

File tree

1 file changed

+208
-0
lines changed

1 file changed

+208
-0
lines changed

.github/workflows/c-std.yml

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
name: C Standard
2+
3+
# Compile with as many C standards as possible.
4+
# The worflow is setup to fail on any compilation warnings.
5+
6+
on:
7+
workflow_dispatch:
8+
push:
9+
pull_request:
10+
11+
jobs:
12+
13+
main:
14+
name: ${{ matrix.os.name }} ${{ matrix.compiler }} ${{ matrix.arch.name }} ${{ matrix.std.name }} ${{ matrix.builder }}
15+
runs-on: ${{ matrix.os.value }}
16+
strategy:
17+
fail-fast: false
18+
matrix:
19+
os:
20+
- name: Linux
21+
value: ubuntu-latest
22+
23+
- name: MacOS
24+
value: macos-latest
25+
26+
- name: Windows
27+
value: windows-latest
28+
cmake-opt: -G Ninja
29+
30+
compiler:
31+
- gcc
32+
- clang
33+
34+
arch:
35+
- name: 64-bit
36+
tag: amd64
37+
compiler-opt: -m64
38+
cmake-opt: -A x64
39+
40+
- name: 32-bit
41+
tag: i386
42+
compiler-opt: -m32
43+
cmake-opt: -A Win32
44+
45+
46+
builder:
47+
- configure
48+
- cmake
49+
50+
std:
51+
- name: c89
52+
value: c89
53+
54+
- name: gnu89
55+
value: gnu89
56+
57+
- name: c94
58+
value: iso9899:199409
59+
60+
- name: c99
61+
value: c99
62+
63+
- name: gnu99
64+
value: gnu99
65+
66+
- name: c11
67+
value: c11
68+
69+
- name: gnu11
70+
value: gnu11
71+
72+
- name: c17
73+
value: c17
74+
75+
- name: gnu17
76+
value: gnu17
77+
78+
- name: c2x
79+
value: c2x
80+
81+
- name: gnu2x
82+
value: gnu2x
83+
84+
exclude:
85+
# Don't run 32-bit on MacOS
86+
- { os: { name: MacOS },
87+
arch: { tag: i386 } }
88+
89+
# Don't run configure on Windows
90+
- { os: { name: Windows },
91+
builder: configure }
92+
93+
# Don't run gcc 32-bit on Windows
94+
- { os: { name: Windows },
95+
arch: { tag: i386 } }
96+
97+
steps:
98+
99+
- name: Checkout repository
100+
uses: actions/checkout@v4
101+
with:
102+
show-progress: 'false'
103+
104+
- name: Install packages (Linux)
105+
if: runner.os == 'Linux' && matrix.arch.tag == 'i386'
106+
run: |
107+
sudo apt-get update
108+
sudo apt install gcc-multilib libc6-dev-i386-cross
109+
110+
- name: Install packages (Windows)
111+
if: runner.os == 'Windows'
112+
run: |
113+
choco install --no-progress ninja
114+
115+
- name: Generate project files (configure)
116+
if: matrix.builder == 'configure'
117+
run: |
118+
./configure
119+
env:
120+
CC: ${{ matrix.compiler }}
121+
CFLAGS: -std=${{ matrix.std.value }} ${{ matrix.arch.compiler-opt }} -Werror -Wall -Wextra
122+
123+
- name: Compile source code (configure)
124+
if: matrix.builder == 'configure'
125+
run: make -j2
126+
127+
- name: Run test cases (configure)
128+
if: matrix.builder == 'configure'
129+
run: |
130+
make test
131+
make cover
132+
133+
- name: Generate project files (cmake)
134+
if: matrix.builder == 'cmake'
135+
run: |
136+
cmake -S . -B . -D CMAKE_BUILD_TYPE=Release -D ZLIB_BUILD_EXAMPLES=OFF ${{ matrix.os.cmake-opt }}
137+
env:
138+
CC: ${{ matrix.compiler }}
139+
CFLAGS: -std=${{ matrix.std.value }} ${{ matrix.arch.compiler-opt }} -Werror -Wall -Wextra
140+
141+
- name: Compile source code (cmake)
142+
if: matrix.builder == 'cmake'
143+
run: cmake --build . --config Release
144+
145+
- name: Run test cases (cmake)
146+
if: matrix.builder == 'cmake'
147+
run: ctest -C Release --output-on-failure --max-width 120
148+
149+
150+
msvc:
151+
name: ${{ matrix.os.name }} ${{ matrix.compiler }} ${{ matrix.arch.name }} ${{ matrix.std.name }} ${{ matrix.builder }}
152+
runs-on: ${{ matrix.os.value }}
153+
strategy:
154+
fail-fast: false
155+
matrix:
156+
os:
157+
- name: Windows
158+
value: windows-latest
159+
160+
compiler:
161+
- cl
162+
163+
arch:
164+
- name: 32-bit
165+
value: -A Win32
166+
167+
- name: 64-bit
168+
value: -A x64
169+
170+
builder:
171+
- cmake
172+
173+
std:
174+
- name: default
175+
value: ""
176+
177+
- name: C11
178+
value: /std:c11
179+
180+
- name: C17
181+
value: /std:c17
182+
183+
# not available on the runner yet
184+
# - name: C20
185+
# value: /std:c20
186+
187+
- name: latest
188+
value: /std:clatest
189+
190+
steps:
191+
192+
- name: Checkout repository
193+
uses: actions/checkout@v4
194+
with:
195+
show-progress: 'false'
196+
197+
- name: Generate project files (cmake)
198+
run: |
199+
cmake -S . -B . ${{ matrix.arch.value }} -D CMAKE_BUILD_TYPE=Release
200+
env:
201+
CC: ${{ matrix.compiler }}
202+
CFLAGS: /WX ${{ matrix.std.value }}
203+
204+
- name: Compile source code (cmake)
205+
run: cmake --build . --config Release -v
206+
207+
- name: Run test cases (cmake)
208+
run: ctest -C Release --output-on-failure --max-width 120

0 commit comments

Comments
 (0)