testing: tsan
[m6w6/libmemcached] / .github / workflows / cmake-build-ci.gen
1 #!/usr/bin/env php
2 <?php
3
4 echo "# Generated file; do not edit!\n";
5
6 const DEF = [
7 "os" => "Linux",
8 "Linux" => "ubuntu-20.04",
9 "macOS" => "macos-10.15",
10 "ubuntu-20.04" => "gnu",
11 "macos-10.15" => "clang",
12 "gnu" => [
13 "ver" => "cur",
14 "CC" => "gcc",
15 "CXX" => "g++",
16 ],
17 "clang" => [
18 "ver" => "apple",
19 "CC" => "clang",
20 "CXX" => "clang++",
21 ],
22 ];
23 const ENV = [
24 "ubuntu-20.04" => [
25 "gnu" => [
26 "new" => [
27 "INSTALL_CC" => "gcc-10",
28 "INSTALL_CXX" => "g++-10",
29 ]
30 ]
31 ],
32 "ubuntu-18.04" => [
33 "clang" => [
34 "old" => [
35 "CXXFLAGS" => "-stdlib=libc++"
36 ]
37 ]
38 ]
39 ];
40 const MAP = [
41 'env.OS_VER' => [
42 "ubuntu-20.04" => [
43 'env.CC_VND' => [
44 "gnu" => [
45 'env.CC_VER' => [
46 "new" => "-10",
47 "cur" => "-9",
48 "old" => "-8"
49 ]
50 ],
51 "clang" => [
52 'env.CC_VER' => [
53 "new" => "-10",
54 "cur" => "-9",
55 "old" => "-8"
56 ]
57 ]
58 ]
59 ],
60 "ubuntu-18.04" => [
61 'env.CC_VND' => [
62 "gnu" => [
63 'env.CC_VER' => [
64 "new" => "-9",
65 "cur" => "-8",
66 "old" => "-7"
67 ]
68 ],
69 "clang" => [
70 'env.CC_VER' => [
71 "new" => "-9",
72 "cur" => "-8",
73 "old" => "-6.0"
74 ]
75 ]
76 ]
77 ]
78 ]
79 ];
80
81 /**
82 * @var bool $splat_map false = no splat map, null = default splat map, true = full splat map
83 */
84 function steps_setenv($splat_map = null) {
85 if ($splat_map !== false) {
86 foreach (MAP as $os_is => $os_vers) {
87 foreach ($os_vers as $os_ver => $cc_vnds_) {
88 if (!$splat_map && DEF[DEF["os"]] != $os_ver) continue;
89 foreach ($cc_vnds_ as $cc_vnd_is => $cc_vnds) {
90 foreach ($cc_vnds as $cc_vnd => $cc_vers_) {
91 if (!$splat_map && DEF[DEF[DEF["os"]]] != $cc_vnd) continue;
92 foreach ($cc_vers_ as $cc_ver_is => $cc_vers) {
93 foreach ($cc_vers as $cc_ver => $ver) {
94 if (!$splat_map && DEF[DEF[DEF[DEF["os"]]]]["ver"] != $cc_ver) continue;
95 ?>
96 - name: Prepare environment (<?= "for $cc_ver $cc_vnd on $os_ver" ?>)
97 if: (<?="$os_is=='$os_ver') && ($cc_vnd_is=='$cc_vnd') && ($cc_ver_is=='$cc_ver'"?>)
98 run: |
99 echo CC="<?=DEF[$cc_vnd]["CC"] . $ver?>" >> ${GITHUB_ENV}
100 echo CXX="<?=DEF[$cc_vnd]["CXX"] . $ver?>" >> ${GITHUB_ENV}
101 <?php
102 if (isset(ENV[$os_ver][$cc_vnd][$cc_ver])) {
103 foreach (ENV[$os_ver][$cc_vnd][$cc_ver] as $env => $val) {
104 ?>
105 echo <?=$env?>="<?=$val?>" >> ${GITHUB_ENV}
106 <?php
107 }
108 }
109 }
110 }
111 }
112 }
113 }
114 }
115 }
116 }
117
118 function steps_getdeps() {
119 ?>
120 - name: Install dependencies (Linux)
121 if: runner.os == 'Linux'
122 run: |
123 sudo apt-get install \
124 libevent-dev \
125 libsasl2-dev \
126 libtbb-dev \
127 ${INSTALL_MEMCACHED} \
128 ${INSTALL_CC} ${INSTALL_CXX}
129 sudo systemctl stop memcached || true
130 - name: Install dependencies (Mac)
131 if: runner.os == 'macOS'
132 run: |
133 brew install bison flex ${INSTALL_MEMCACHED}
134 brew services stop memcached || true
135 echo MEMCACHED_BINARY="/usr/local/bin/memcached" >> ${GITHUB_ENV}
136 - name: Build memcached
137 run: |
138 if test -d memcached
139 then
140 cd memcached
141 ./autogen.sh
142 ./configure CFLAGS="-O2 -pipe" \
143 --prefix=${MEMCACHED_PREFIX} \
144 --enable-sasl \
145 --enable-sasl-pwdb \
146 --disable-coverage \
147 --disable-dependency-tracking \
148 --disable-docs \
149 --disable-extstore \
150 --disable-option-checking \
151 ;
152 make -j2
153 make install
154 cd ..
155 echo MEMCACHED_BINARY="${MEMCACHED_PREFIX}/bin/memcached" >> ${GITHUB_ENV}
156 fi
157 <?php
158 }
159
160 function steps_build() {
161 ?>
162 - name: Generate build tree (${{ env.CMAKE_BUILD_TYPE }})
163 run: cmake -S . -B build
164 - name: Build all with ${{ env.CXX }} ${{ env.CXXFLAGS }}
165 run: make -C build -j2 all
166 - name: Test
167 run: make -C build -j2 test
168 - name: Install
169 run: make -C build -j2 install DESTDIR=/tmp
170 - name: Failed tests log
171 if: ${{ failure() }}
172 run: cat build/Testing/Temporary/LastTest.log || true
173 <?php
174 }
175
176 function steps_notify() {
177 ?>
178 - name: Notify Gitter (success)
179 if: ${{ success() }}
180 run: |
181 REF=$(basename ${GITHUB_REF})
182 curl -sS "${{ secrets.GITTER }}" \
183 --data-urlencode "level=info" \
184 --data-urlencode "message=Github [${GITHUB_REPOSITORY}](https://github.com/${GITHUB_REPOSITORY}/commits/${REF}) (${REF}) [success](https://github.com/m6w6/libmemcached/actions/runs/${GITHUB_RUN_ID}) (${ImageOS}/${CC:-${CC_VND}-${CC_VER}})"
185 - name: Notify Gitter (failure)
186 if: ${{ failure() }}
187 run: |
188 REF=$(basename ${GITHUB_REF})
189 curl -sS "${{ secrets.GITTER }}" \
190 --data-urlencode "level=error" \
191 --data-urlencode "message=Github [${GITHUB_REPOSITORY}](https://github.com/${GITHUB_REPOSITORY}/commits/${REF}) (${REF}) [failure](https://github.com/m6w6/libmemcached/actions/runs/${GITHUB_RUN_ID}) (${ImageOS}/${CC:-${CC_VND}-${CC_VER}})"
192 <?php
193 }
194
195 function steps($splat_map = null) {
196 steps_setenv($splat_map);
197 steps_getdeps();
198 steps_build();
199 steps_notify();
200 }
201
202 function defaults() {
203 $os_ver = DEF[DEF["os"]];
204 $cc_vnd = DEF[$os_ver];
205 $cc_ver = DEF[$cc_vnd]["ver"];
206 return "$os_ver, $cc_vnd, $cc_ver";
207 }
208 ?>
209 name: cmake-build-ci
210 on:
211 push:
212 paths:
213 - "include/**"
214 - "src/**"
215 - "test/**"
216 - "CMake*"
217 - ".github/workflows/cmake-build-ci*"
218 branches-ignore:
219 - gh-pages
220 pull_request:
221 branches:
222 - master
223 - v1.x
224 env:
225 # defaults
226 INSTALL_MEMCACHED: memcached
227 CMAKE_BUILD_TYPE: Debug
228 BUILD_TESTING: "ON"
229 ENABLE_SASL: "OFF"
230 ENABLE_HASH_HSIEH: "ON"
231 ENABLE_DTRACE: "OFF"
232 VERBOSE: "ON"
233 OS_VND: <?=DEF["os"]?> #
234 OS_VER: <?=DEF[DEF["os"]]?> #
235 CC_VND: <?=DEF[DEF[DEF["os"]]]?> #
236 CC_VER: <?=DEF[DEF[DEF[DEF["os"]]]]["ver"]?> #
237
238 jobs:
239
240 # new memcached
241 dbg-new:
242 name: dbg-new (<?=defaults()?>)
243 runs-on: <?=DEF[DEF["os"]]?> #
244 env:
245 INSTALL_MEMCACHED:
246 MEMCACHED_PREFIX: /tmp
247 ENABLE_SASL: "ON"
248 CFLAGS: "-O0 --coverage"
249 CXXFLAGS: "-O0 --coverage"
250 steps:
251 - uses: actions/checkout@v2
252 - uses: actions/checkout@v2
253 with:
254 repository: memcached/memcached
255 path: memcached
256 ref: 1.6.7
257 <?php steps(); ?>
258 - uses: codecov/codecov-action@v1.0.13
259
260 # sanitizer build
261 dbg-san:
262 name: dbg-san (<?=defaults()?>)
263 runs-on: <?=DEF[DEF["os"]]?> #
264 env:
265 ENABLE_SANITIZERS: "address;undefined"
266 steps:
267 - uses: actions/checkout@v2
268 <?php steps(); ?>
269
270 # thread sanitizer build
271 dbg-tsan:
272 name: dbg-tsan (<?=defaults()?>)
273 runs-on: <?=DEF[DEF["os"]]?> #
274 env:
275 ENABLE_SANITIZERS: "thread"
276 ENABLE_MEMASLAP: "OFF"
277 steps:
278 - uses: actions/checkout@v2
279 <?php steps(); ?>
280
281 # mac build
282 dbg-mac:
283 name: dbg-mac (<?=DEF["macOS"]?>, <?=DEF[DEF["macOS"]]?>, <?=DEF[DEF[DEF["macOS"]]]["ver"]?>)
284 runs-on: <?=DEF["macOS"]?> #
285 env:
286 CFLAGS: -O0 --coverage
287 CXXFLAGS: -O0 --coverage
288 OS_VND: macOS
289 OS_VER: <?=DEF["macOS"]?> #
290 CC_VND: <?=DEF[DEF["macOS"]]?> #
291 CC_VER: <?=DEF[DEF[DEF["macOS"]]]["ver"]?> #
292 continue-on-error: true
293 steps:
294 - uses: actions/checkout@v2
295 <?php steps(false); ?>
296 - uses: codecov/codecov-action@v1.0.13
297
298 # release builds
299 release:
300 strategy:
301 fail-fast: false
302 matrix:
303 os_ver: [ubuntu-20.04, ubuntu-18.04]
304 cc_vnd: [gnu, clang]
305 cc_ver: [new, cur, old]
306 runs-on: ${{ matrix.os_ver }}
307 continue-on-error: ${{ matrix.cc_vnd == 'clang' }}
308 env:
309 CMAKE_BUILD_TYPE: Release
310 OS_VND: Linux
311 OS_VER: ${{ matrix.os_ver }}
312 CC_VND: ${{ matrix.cc_vnd }}
313 CC_VER: ${{ matrix.cc_ver }}
314 steps:
315 - uses: actions/checkout@v2
316 <?php steps(true); ?>