Skip to content

Commit e762099

Browse files
authored
fix: Make ci match conan specified toolchain correctly (#8)
- Force setup-cpp to install the same llvm version according to `llvm-<version>` when `compiler: llvm-<version>` and `clang-tidy: <version>` differs. - Match conan profile name with a regex pattern.
1 parent e2672fa commit e762099

7 files changed

Lines changed: 182 additions & 108 deletions

File tree

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
name: "parse_environment"
2+
description: "Parse environment"
3+
inputs:
4+
os:
5+
required: true
6+
description: "Operating system"
7+
compiler:
8+
required: true
9+
description: "Compiler"
10+
outputs:
11+
os_name:
12+
description: "Operating system name (ubuntu converted to linux)"
13+
value: ${{ steps.os.outputs.name }}
14+
os_version:
15+
description: "Operating system version (if not set in inputs.os, set to latest)"
16+
value: ${{ steps.os.outputs.version }}
17+
arch:
18+
description: "Architecture"
19+
value: ${{ steps.arch.outputs.value }}
20+
compiler_name:
21+
description: "Compiler name (llvm converted to clang)"
22+
value: ${{ steps.compiler.outputs.name }}
23+
compiler_version:
24+
description: "Compiler version (if not set in inputs.compiler, set to latest)"
25+
value: ${{ steps.compiler.outputs.version }}
26+
gcov_executable:
27+
description: "The corresponding gcov_executable (Available only for clang and gcc)"
28+
value: ${{ steps.gcov.outputs.value }}
29+
30+
runs:
31+
using: "composite"
32+
steps:
33+
- name: Parse os and os version
34+
id: os
35+
shell: bash
36+
env:
37+
VALUE: ${{ contains(matrix.os, '-') && matrix.os || format('{0}-{1}', matrix.os, 'latest') }}
38+
run: |
39+
export NAME=${VALUE%%-*}
40+
echo name=${NAME/ubuntu/linux} >> "$GITHUB_OUTPUT"
41+
42+
export VERSION=${VALUE##*-}
43+
echo version=$VERSION >> "$GITHUB_OUTPUT"
44+
45+
- name: Parse architecture
46+
id: arch
47+
shell: bash
48+
run: |
49+
echo value=${{ steps.os.outputs.name == 'macos' && steps.os.outputs.version >= '14' && 'armv8' || 'x86_64' }} >> "$GITHUB_OUTPUT"
50+
51+
- name: Parse compiler and compiler version
52+
id: compiler
53+
shell: bash
54+
env:
55+
VALUE: ${{ contains(matrix.compiler, '-') && matrix.compiler || format('{0}-{1}', matrix.compiler, 'latest') }}
56+
run: |
57+
export NAME=${VALUE%%-*}
58+
echo name=${NAME/llvm/clang} >> "$GITHUB_OUTPUT"
59+
60+
export VERSION=${VALUE##*-}
61+
echo version=$VERSION >> "$GITHUB_OUTPUT"
62+
63+
- name: Parse gcov
64+
id: gcov
65+
shell: bash
66+
run: |
67+
echo "value=${{ contains(matrix.compiler, 'llvm') && 'llvm-cov gcov' || contains(matrix.compiler, 'gcc') && format('{0}-{1}', 'gcov', steps.compiler.outputs.version) || '' }}" >> "$GITHUB_OUTPUT"
Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
name: "setup_cache"
22
description: "sets up the shared cache"
33
inputs:
4-
compiler:
4+
key:
55
required: true
6-
description: "Compiler"
7-
build_type:
8-
required: true
9-
description: "Build type"
10-
developer_mode:
11-
required: true
12-
description: "Developer mode"
6+
description: "Cache key"
7+
restore_key:
8+
description: "Restore key when cache misses"
139

1410
runs:
1511
using: "composite"
@@ -20,14 +16,14 @@ runs:
2016
path: |
2117
~/.cache/pip
2218
~/.ccache
23-
key: ${{ runner.os }}-${{ inputs.compiler }}-${{ inputs.build_type }}-${{ inputs.developer_mode }}-${{ hashFiles('**/CMakeLists.txt') }}
19+
key: ${{ inputs.key }}-${{ hashFiles('**/CMakeLists.txt') }}
2420
restore-keys: |
25-
${{ runner.os }}-${{ inputs.compiler }}-${{ inputs.build_type }}
21+
${{ inputs.restore_key != '' && inputs.restore_key || inputs.key }}
2622
2723
- name: Cache conan
2824
uses: actions/cache@v4.0.2
2925
with:
3026
path: ~/.conan2/p
31-
key: ${{ runner.os }}-${{ inputs.compiler }}-${{ inputs.build_type }}-${{ inputs.developer_mode }}-${{ hashFiles('conanfile.py', 'conanfile.txt') }}
27+
key: ${{ inputs.key }}-${{ hashFiles('conanfile.py', 'conanfile.txt') }}
3228
restore-keys: |
33-
${{ runner.os }}-${{ inputs.compiler }}-${{ inputs.build_type }}
29+
${{ inputs.restore_key != '' && inputs.restore_key || inputs.key }}

.github/actions/setup_conan/action.yml

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
name: "setup_conan"
22
description: "sets up conan"
33
inputs:
4-
os:
4+
os_name:
5+
required: true
6+
description: "Operating system name"
7+
os_version:
58
required: true
6-
description: "Operating system"
9+
description: "Operating system version"
710
arch:
811
required: true
9-
description: "Architecutre"
10-
compiler:
12+
description: "Architecture"
13+
compiler_name:
1114
required: true
12-
description: "Compiler"
15+
description: "Compiler name"
16+
compiler_version:
17+
required: true
18+
description: "Compiler version"
1319
build_type:
1420
required: true
1521
description: "Build type"
@@ -32,18 +38,6 @@ outputs:
3238
args:
3339
description: "The corresponding args that should be used in conan commands afterwards"
3440
value: ${{ steps.output.outputs.args }}
35-
os_name:
36-
description: "Operating system name (ubuntu converted to linux)"
37-
value: ${{ steps.parse_os.outputs.name }}
38-
os_version:
39-
description: "Operating system version (if not set in inputs.os, set to latest)"
40-
value: ${{ steps.parse_os.outputs.version }}
41-
compiler_name:
42-
description: "Compiler name (llvm converted to clang)"
43-
value: ${{ steps.parse_compiler.outputs.name }}
44-
compiler_version:
45-
description: "Compiler version (if not set in inputs.compiler, set to latest)"
46-
value: ${{ steps.parse_compiler.outputs.version }}
4741

4842
runs:
4943
using: "composite"
@@ -58,44 +52,20 @@ runs:
5852
run: |
5953
conan profile detect
6054
61-
- name: Parse os and os version
62-
id: parse_os
63-
shell: bash
64-
env:
65-
VALUE: ${{ contains(matrix.os, '-') && matrix.os || format('{0}-{1}', matrix.os, 'latest') }}
66-
run: |
67-
export NAME=${VALUE%%-*}
68-
echo name=${NAME/ubuntu/linux} >> "$GITHUB_OUTPUT"
69-
70-
export VERSION=${VALUE##*-}
71-
echo version=$VERSION >> "$GITHUB_OUTPUT"
72-
73-
- name: Parse compiler and compiler version
74-
id: parse_compiler
75-
shell: bash
76-
env:
77-
VALUE: ${{ contains(matrix.compiler, '-') && matrix.compiler || format('{0}-{1}', matrix.compiler, 'latest') }}
78-
run: |
79-
export NAME=${VALUE%%-*}
80-
echo name=${NAME/llvm/clang} >> "$GITHUB_OUTPUT"
81-
82-
export VERSION=${VALUE##*-}
83-
echo version=$VERSION >> "$GITHUB_OUTPUT"
84-
8555
- name: Output
8656
id: output
8757
shell: bash
8858
run: |
8959
echo "home=$(conan config home)" >> "$GITHUB_OUTPUT"
9060
91-
export HOST_PROFILE=$(python3 script/match_conan_profile.py "${{ steps.parse_os.outputs.name }}-${{ steps.parse_os.outputs.version }}-${{ inputs.arch }}-${{ steps.parse_compiler.outputs.name }}-${{ steps.parse_compiler.outputs.version }}-${{ inputs.build_type }}")
61+
export HOST_PROFILE=$(python3 script/match_conan_profile.py "${{ inputs.os_name }}-${{ inputs.os_version }}-${{ inputs.arch }}-${{ inputs.compiler_name }}-${{ inputs.compiler_version }}-${{ inputs.build_type }}")
9262
echo "host_profile=$HOST_PROFILE" >> "$GITHUB_OUTPUT"
9363
9464
export BUILD_PROFILE=default
9565
echo "build_profile=$BUILD_PROFILE" >> "$GITHUB_OUTPUT"
9666
9767
export
98-
echo "args=-pr:b '$BUILD_PROFILE' -pr:h '$HOST_PROFILE' -s:h 'build_type=${{ inputs.build_type }}' ${{ inputs.args }}" >> "$GITHUB_OUTPUT"
68+
echo "args=-pr:b '$BUILD_PROFILE' -s:b 'build_type=Release' -pr:h '$HOST_PROFILE' -s:h 'build_type=${{ inputs.build_type }}' ${{ inputs.args }}" >> "$GITHUB_OUTPUT"
9969
10070
- name: Install conan config folder
10171
shell: bash

.github/workflows/ci.yml

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -66,52 +66,52 @@ jobs:
6666
developer_mode: ON
6767

6868
include:
69-
# Inject gcov_executable variable
70-
- compiler: llvm
71-
gcov_executable: "llvm-cov gcov"
72-
- compiler: llvm-16.0.6
73-
gcov_executable: "llvm-cov gcov"
74-
- compiler: gcc-13
75-
gcov_executable: gcov-13
76-
7769
# Enable package for release build
7870
- build_type: Release
7971
developer_mode: OFF
8072
package_generator: ZIP
8173

8274
steps:
83-
- name: Linux - Maximize build disk space
84-
uses: easimon/maximize-build-space@v10
85-
if: runner.os == 'Linux'
86-
with:
87-
root-reserve-mb: 30720
88-
swap-size-mb: 1024
89-
remove-android: "true"
90-
remove-docker-images: "true"
91-
remove-dotnet: "true"
75+
# Use this if a fairly large library is requried, like building and using llvm as a library.
76+
# - name: Linux - Maximize build disk space
77+
# uses: easimon/maximize-build-space@v10
78+
# if: runner.os == 'Linux'
79+
# with:
80+
# root-reserve-mb: 30720
81+
# swap-size-mb: 1024
82+
# remove-android: "true"
83+
# remove-docker-images: "true"
84+
# remove-dotnet: "true"
9285

9386
- uses: actions/checkout@v4
9487

88+
- name: Parse environment
89+
id: parsed
90+
uses: ./.github/actions/parse_environment
91+
with:
92+
os: ${{ matrix.os }}
93+
compiler: ${{ matrix.compiler }}
94+
9595
- name: Setup cache
9696
uses: ./.github/actions/setup_cache
9797
with:
98-
compiler: ${{ matrix.compiler }}
99-
build_type: ${{ matrix.build_type }}
100-
developer_mode: ${{ matrix.developer_mode }}
98+
key: ${{ steps.parsed.outputs.os_name }}-${{ steps.parsed.outputs.os_version }}-${{ steps.parsed.outputs.compiler_name }}-${{ steps.parsed.outputs.compiler_version }}-${{ matrix.build_type }}-${{ matrix.developer_mode }}
99+
restore_key: ${{ steps.parsed.outputs.os_name }}-${{ steps.parsed.outputs.os_version }}-${{ steps.parsed.outputs.compiler_name }}-${{ steps.parsed.outputs.compiler_version }}-${{ matrix.build_type }}
101100

102101
- name: Setup cpp
103102
uses: aminya/setup-cpp@v0.37.0
104103
with:
105104
compiler: ${{ matrix.compiler }}
106-
vcvarsall: ${{ contains(matrix.os, 'windows') }}
105+
vcvarsall: ${{ runner.os == 'Windows' }}
107106

108107
cmake: true
109108
ninja: true
110109
ccache: true
111110
python: true
112111

112+
# llvm and clang-tidy version should match according to https://github.com/aminya/setup-cpp/issues/249
113+
clangtidy: ${{ startsWith(matrix.compiler, 'llvm-') && steps.parsed.outputs.compiler_version || 'true' }}
113114
cppcheck: true
114-
clangtidy: true
115115

116116
gcovr: 7.2 # The default version 5.2 stucks on macos gcc
117117
opencppcoverage: true
@@ -120,44 +120,46 @@ jobs:
120120
uses: ./.github/actions/setup_conan
121121
id: conan
122122
with:
123-
os: ${{ matrix.os }}
124-
arch: x86_64
125-
compiler: ${{ matrix.compiler }}
123+
os_name: ${{ steps.parsed.outputs.os_name }}
124+
os_version: ${{ steps.parsed.outputs.os_version }}
125+
arch: ${{ steps.parsed.outputs.arch }}
126+
compiler_name: ${{ steps.parsed.outputs.compiler_name }}
127+
compiler_version: ${{ steps.parsed.outputs.compiler_version }}
126128
build_type: ${{ matrix.build_type }}
127129

128130
- name: Configure cmake
129131
run: |
130-
cmake --preset ${{ steps.conan.outputs.compiler_name }} ${{ steps.conan.outputs.compiler_name == 'msvc' && '-A x64 -T v143' || '' }} -D ENABLE_DEVELOPER_MODE:BOOL=${{ matrix.developer_mode }} -D OPT_ENABLE_COVERAGE:BOOL=${{ matrix.build_type == 'Debug' }}
132+
cmake --preset ${{ steps.parsed.outputs.compiler_name }} ${{ steps.parsed.outputs.compiler_name == 'msvc' && '-A x64 -T v143' || '' }} -D ENABLE_DEVELOPER_MODE:BOOL=${{ matrix.developer_mode }} -D OPT_ENABLE_COVERAGE:BOOL=${{ matrix.build_type == 'Debug' }}
131133
132134
- name: Build and test
133135
run: |
134136
conan build . ${{ steps.conan.outputs.args }}
135137
136138
- name: Unix - Coverage
137139
if: runner.os != 'Windows'
138-
working-directory: build/${{ steps.conan.outputs.compiler_name }}
140+
working-directory: build/${{ steps.parsed.outputs.compiler_name }}
139141
run: |
140142
ctest -C ${{ matrix.build_type }}
141-
gcovr -j ${{ env.nproc }} --delete --root ../../ --print-summary --xml-pretty --xml coverage.xml . --gcov-executable '${{ matrix.gcov_executable }}'
143+
gcovr -j ${{ env.nproc }} --delete --root ../../ --print-summary --xml-pretty --xml coverage.xml . --gcov-executable '${{ steps.parsed.outputs.gcov_executable }}'
142144
143145
- name: Windows - Coverage
144146
if: runner.os == 'Windows'
145-
working-directory: build/${{ steps.conan.outputs.compiler_name }}
147+
working-directory: build/${{ steps.parsed.outputs.compiler_name }}
146148
run: |
147149
OpenCppCoverage.exe --export_type cobertura:coverage.xml --cover_children -- ctest -C ${{ matrix.build_type }}
148150
149151
- name: Publish to codecov
150152
uses: codecov/codecov-action@v4.4.0
151153
with:
152-
files: ./build/${{ steps.conan.outputs.compiler_name }}/coverage.xml
154+
files: ./build/${{ steps.parsed.outputs.compiler_name }}/coverage.xml
153155
flags: ${{ runner.os }}
154156
name: ${{ runner.os }}-coverage
155157
token: ${{ secrets.CODECOV_TOKEN }}
156158
verbose: true
157159

158160
- name: CPack
159161
if: matrix.package_generator != ''
160-
working-directory: build/${{ steps.conan.outputs.compiler_name }}
162+
working-directory: build/${{ steps.parsed.outputs.compiler_name }}
161163
run: |
162164
cpack -C ${{ matrix.build_type }} -G ${{ matrix.package_generator }} -B _package -V
163165
@@ -166,4 +168,4 @@ jobs:
166168
if: ${{ startsWith(github.ref, 'refs/tags/') && matrix.package_generator != '' }}
167169
with:
168170
files: |
169-
build/${{ steps.conan.outputs.compiler_name }}/_package/*.*
171+
build/${{ steps.parsed.outputs.compiler_name }}/_package/*.*

0 commit comments

Comments
 (0)