ci/github: expand mac and win builds
[awesomized/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
9 "Linux" => "ubuntu-22.04", "ubuntu-22.04" => "gnu",
10 "Windows" => "windows-2022", "windows-2022" => "msvc",
11 "macOS" => "macos-12", "macos-12" => "clang",
12
13 "gnu" => [
14 "CC" => "gcc",
15 "CXX" => "g++",
16 ],
17 "clang" => [
18 "CC" => "clang",
19 "CXX" => "clang++",
20 ],
21 "msvc" => [
22 "CMAKE_GENERATOR" => "Visual Studio"
23 ],
24 "mingw" => [
25 "CMAKE_GENERATOR" => "MinGW Makefiles"
26 ]
27 ];
28 const MAP = [
29 "Linux" => [
30 'env.OS_VER' => [
31 "ubuntu-22.04" => [
32 'env.CC_VND' => [
33 "gnu" => [
34 'env.CC_VER' => [
35 "new" => "-12",
36 "cur" => "-11",
37 "old" => "-10",
38 ]
39 ],
40 "clang" => [
41 'env.CC_VER' => [
42 "new" => "-14",
43 "cur" => "-13",
44 ]
45 ]
46 ]
47 ],
48 "ubuntu-20.04" => [
49 'env.CC_VND' => [
50 "gnu" => [
51 'env.CC_VER' => [
52 "new" => "-10",
53 "cur" => "-9",
54 ]
55 ],
56 "clang" => [
57 'env.CC_VER' => [
58 "new" => "-12",
59 "cur" => "-11",
60 "old" => "-10"
61 ]
62 ]
63 ]
64 ],
65 ],
66 ],
67 "Windows" => [
68 'env.OS_VER' => [
69 "windows-2022" => [
70 'env.CC_VND' => [
71 "msvc" => [
72 "env.CC_VER" => [
73 "cur" => " 17 2022"
74 ]
75 ],
76 "mingw" => [
77 "env.CC_VER" => [
78 "cur" => ""
79 ]
80 ]
81 ]
82 ],
83 "windows-2019" => [
84 'env.CC_VND' => [
85 "msvc" => [
86 "env.CC_VER" => [
87 "cur" => " 16 2019"
88 ]
89 ],
90 "mingw" => [
91 "env.CC_VER" => [
92 "cur" => ""
93 ]
94 ]
95 ]
96 ],
97 ]
98 ],
99 "macOS" => []
100 ];
101 const ENV = [
102 "ubuntu-22.04" => [
103 "clang" => [
104 "new" => [
105 "CXXFLAGS" => "-stdlib=libc++",
106 "INSTALL_CXX" => "libc++-14-dev libc++abi-14-dev"
107 ],
108 "cur" => [
109 "CXXFLAGS" => "-stdlib=libc++",
110 "INSTALL_CXX" => "libc++-13-dev libc++abi-13-dev"
111 ],
112 ]
113 ],
114 "ubuntu-20.04" => [
115 "clang" => [
116 "new" => [
117 "CXXFLAGS" => "-stdlib=libc++",
118 "INSTALL_CXX" => "libc++-12-dev libc++abi-12-dev"
119 ],
120 "cur" => [
121 "CXXFLAGS" => "-stdlib=libc++",
122 "INSTALL_CXX" => "libc++-11-dev libc++abi-11-dev"
123 ],
124 "old" => [
125 "CXXFLAGS" => "-stdlib=libc++",
126 "INSTALL_CXX" => "libc++-10-dev libc++abi-10-dev"
127 ],
128 ]
129 ],
130 ];
131
132 function set_addpath($os_vnd, $paths) {
133 foreach ((array) $paths as $path) if ($os_vnd == "Windows") {
134 ?>
135 echo "<?=$path?>" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
136 <?php
137 } else {
138 ?>
139 echo 'PATH="$PATH:<?=$path?>"' >> ${GITHUB_ENV}
140 <?php
141 }
142 }
143 function step_setenv($os_vnd, $var, $val) {
144 if ($var === "PATH") {
145 return set_addpath($os_vnd, $val);
146 }
147 if ($os_vnd == "Windows") {
148 ?>
149 echo '<?=$var?>=<?=$val?>' | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
150 <?php
151 } else {
152 ?>
153 echo <?=$var?>="<?=$val?>" >> ${GITHUB_ENV}
154 <?php
155 }
156 }
157
158 /**
159 * @var bool $splat_map false = no splat map, null = default splat map, true = full splat map
160 */
161 function steps_setenv($os_vnd, $splat_map = null) {
162 if ($os_vnd === "Windows") {
163 ?>
164 - name: Prepare environment (Windows)
165 run: |
166 echo "c:\msys64\usr\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
167 echo "c:\msys64\mingw64\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
168 <?php
169 }
170 if ($splat_map !== false) {
171 foreach (MAP[$os_vnd] as $os_is => $os_vers) {
172 foreach ($os_vers as $os_ver => $cc_vnds_) {
173 if (!$splat_map && DEF[DEF["os"]] != $os_ver) continue;
174 foreach ($cc_vnds_ as $cc_vnd_is => $cc_vnds) {
175 foreach ($cc_vnds as $cc_vnd => $cc_vers_) {
176 if (!$splat_map && DEF[DEF[DEF["os"]]] != $cc_vnd) continue;
177 foreach ($cc_vers_ as $cc_ver_is => $cc_vers) {
178 foreach ($cc_vers as $cc_ver => $ver) {
179 if (!$splat_map && "cur" != $cc_ver) continue;
180 ?>
181 - name: Prepare environment (<?= "for $cc_ver $cc_vnd on $os_ver" ?>)
182 if: (<?="$os_is=='$os_ver') && ($cc_vnd_is=='$cc_vnd') && ($cc_ver_is=='$cc_ver'"?>)
183 run: |
184 <?php
185 foreach (DEF[$cc_vnd] as $env => $val) {
186 step_setenv($os_vnd, $env, $val . $ver);
187 }
188 if (isset(ENV[$os_ver][$cc_vnd][$cc_ver])) {
189 foreach (ENV[$os_ver][$cc_vnd][$cc_ver] as $env => $val) {
190 step_setenv($os_vnd, $env, $val);
191 }
192 }
193 }
194 }
195 }
196 }
197 }
198 }
199 }
200 }
201
202 function steps_getdeps($os_vnd) {
203 ?>
204 - name: Install dependencies (<?=$os_vnd?>)
205 if: runner.os == '<?=$os_vnd?>'
206 <?php
207 if ($os_vnd === "Linux") :
208 ?>
209 run: |
210 sudo apt-get update -y
211 sudo apt-get install -my \
212 libevent-dev \
213 libsasl2-dev \
214 libtbb-dev \
215 python3-sphinx \
216 ${INSTALL_MEMCACHED} \
217 ${INSTALL_CC} ${INSTALL_CXX}
218 sudo systemctl stop memcached || true
219 <?php
220 endif;
221 if ($os_vnd === "macOS") :
222 ?>
223 run: |
224 brew install bison flex libevent pkg-config sphinx-doc ${INSTALL_MEMCACHED}
225 brew services stop memcached || true
226 echo MEMCACHED_BINARY="/usr/local/bin/memcached" >> ${GITHUB_ENV}
227 <?php
228 endif;
229 if ($os_vnd === "Windows") :
230 ?>
231 uses: msys2/setup-msys2@v2
232 with:
233 release: false
234 path-type: inherit
235 install: >-
236 bison
237 flex
238 rsync
239 openssh
240 <?php
241 endif;
242 if ($os_vnd != "Windows") :
243 ?>
244 - name: Build memcached
245 if: runner.os != 'Windows'
246 run: |
247 if test -d memcached
248 then
249 cd memcached
250 ./autogen.sh
251 cp configure{,.old} && sed -e 's/-Werror//g' <configure.old >configure
252 ./configure CFLAGS="-O2 -pipe -fcommon" \
253 --prefix=${MEMCACHED_PREFIX} \
254 --enable-sasl \
255 --enable-sasl-pwdb \
256 --disable-coverage \
257 --disable-dependency-tracking \
258 --disable-docs \
259 --disable-extstore \
260 --disable-option-checking \
261 ;
262 make -j2
263 make install
264 cd ..
265 echo MEMCACHED_BINARY="${MEMCACHED_PREFIX}/bin/memcached" >> ${GITHUB_ENV}
266 fi
267 <?php
268 endif;
269 }
270
271 function steps_build() {
272 ?>
273 - name: Generate build tree (${{ env.CMAKE_BUILD_TYPE }})
274 run: cmake -DCMAKE_BUILD_TYPE=${{ env.CMAKE_BUILD_TYPE }} -S . -B build
275 - name: Build all with ${{ env.CXX }} ${{ env.CXXFLAGS }}
276 run: cmake --build build --config ${{ env.CMAKE_BUILD_TYPE }} -j2
277 <?php
278 }
279
280 function steps_test() {
281 ?>
282 - name: Test
283 if: env.BUILD_TESTING == 'ON'
284 run: cmake --build build --config ${{ env.CMAKE_BUILD_TYPE }} -j2 --target test
285 - name: Install
286 if: env.BUILD_TESTING == 'ON'
287 run: cmake --install build --config ${{ env.CMAKE_BUILD_TYPE }} --prefix /tmp
288 - name: Failed tests log
289 if: ${{ env.BUILD_TESTING == 'ON' && failure() }}
290 run: cat build/Testing/Temporary/LastTest.log || true
291 <?php
292 }
293
294 function steps_package() {
295 ?>
296 - name: Package
297 env:
298 PUSH_ARTIFACTS_ID: ${{ secrets.PUSH_ARTIFACTS_ID }}
299 if: env.PUSH_ARTIFACTS_ID != '' && env.CMAKE_BUILD_TYPE == 'Release'
300 run: |
301 cmake -DCMAKE_BUILD_TYPE=${{ env.CMAKE_BUILD_TYPE }} -S . -B build
302 cmake --build build --config ${{ env.CMAKE_BUILD_TYPE }} -j2 --target package
303 cmake -DCPACK_COMPONENT_INSTALL=ON build
304 cmake --build build --config ${{ env.CMAKE_BUILD_TYPE }} -j2 --target package
305 cmake --build build --config ${{ env.CMAKE_BUILD_TYPE }} -j2 --target push-artifacts
306 <?php
307 }
308
309 function steps_notify($os_vnd) {
310 ?>
311 - name: Notify Gitter
312 env:
313 GITTER: ${{ secrets.GITTER }}
314 if: (success() || failure()) && env.GITTER != ''
315 run: bash .github/notify-gitter.sh ${{ job.status }}
316 <?php
317 }
318
319 function steps($os_vnd, $splat_map = null) {
320 steps_setenv($os_vnd, $splat_map);
321 steps_getdeps($os_vnd);
322 steps_build();
323 steps_test();
324 steps_package();
325 steps_notify($os_vnd);
326 }
327
328 function defaults($os_vnd = DEF["os"]) {
329 $os_ver = DEF[$os_vnd];
330 $cc_vnd = DEF[$os_ver];
331 return "$os_ver, $cc_vnd";
332 }
333
334 function env_override($os_vnd, $cc_vnd = null) {
335 isset($cc_vnd) or $cc_vnd = DEF[DEF[$os_vnd]];
336 ?>
337 OS_VND: <?=$os_vnd?> #
338 OS_VER: <?=DEF[$os_vnd]?> #
339 CC_VND: <?=$cc_vnd?> #
340 CC_VER: cur
341 <?php
342 }
343
344 ?>
345 name: cmake-build-ci
346 on:
347 workflow_dispatch:
348 release:
349 types: [published]
350 push:
351 paths:
352 - ".github/workflows/cmake-build-ci*"
353 - "CMake*"
354 - "CPack*"
355 - "contrib/**"
356 - "include/**"
357 - "src/**"
358 - "test/**"
359 branches-ignore:
360 - gh-pages
361 pull_request:
362 branches:
363 - master
364 - v1.x
365 env:
366 # defaults
367 INSTALL_MEMCACHED: memcached
368 ENABLE_SASL: "OFF" # ^ almost no memcached distribution package has built in sasl support
369 ENABLE_HASH_HSIEH: "ON"
370 ENABLE_DTRACE: "OFF"
371 OS_VND: <?=DEF["os"]?> #
372 OS_VER: <?=DEF[DEF["os"]]?> #
373 CC_VND: <?=DEF[DEF[DEF["os"]]]?> #
374 CC_VER: cur
375
376 jobs:
377
378 # sanitizer
379 debug-sanitizer:
380 name: debug sanitizer
381 runs-on: <?=DEF[DEF["os"]]?> #
382 strategy:
383 matrix:
384 sanitizer: ['address;undefined', 'thread']
385 env:
386 CMAKE_BUILD_TYPE: "Debug"
387 BUILD_TESTING: "ON"
388 VERBOSE: "ON"
389 ENABLE_SANITIZERS: ${{ matrix.sanitizer }}
390 steps:
391 - uses: actions/checkout@v3
392 <?php steps("Linux"); ?>
393
394 # memcached
395 debug-memcached:
396 name: debug memcached
397 runs-on: <?=DEF[DEF["os"]]?> #
398 continue-on-error: true
399 strategy:
400 matrix:
401 memcached: ['master', '1.6.17', '1.6.9', '1.5.22', '1.5.6']
402 env:
403 CMAKE_BUILD_TYPE: "Debug"
404 BUILD_TESTING: "ON"
405 VERBOSE: "ON"
406 INSTALL_MEMCACHED: ""
407 MEMCACHED_PREFIX: "/tmp"
408 ENABLE_SASL: "ON"
409 steps:
410 - uses: actions/checkout@v3
411 - uses: actions/checkout@v3
412 with:
413 repository: memcached/memcached
414 path: memcached
415 ref: ${{ matrix.memcached }}
416 <?php steps("Linux"); ?>
417
418 # coverage linux
419 debug-coverage-linux:
420 name: debug coverage (<?=defaults()?>)
421 runs-on: <?=DEF[DEF["os"]]?> #
422 env:
423 CMAKE_BUILD_TYPE: "Debug"
424 BUILD_TESTING: "ON"
425 VERBOSE: "ON"
426 CFLAGS: "-O0 --coverage"
427 CXXFLAGS: "-O0 --coverage"
428 INSTALL_MEMCACHED: ""
429 MEMCACHED_PREFIX: "/tmp"
430 ENABLE_SASL: "ON"
431 steps:
432 - uses: actions/checkout@v3
433 - uses: actions/checkout@v3
434 with:
435 repository: memcached/memcached
436 path: memcached
437 ref: 1.6.7
438 <?php steps("Linux"); ?>
439 - uses: codecov/codecov-action@v3
440
441
442 # coverage mac
443 debug-coverage-mac:
444 name: debug coverage (<?=defaults("macOS")?>)
445 runs-on: <?=DEF["macOS"]?> #
446 env:
447 CMAKE_BUILD_TYPE: "Debug"
448 BUILD_TESTING: "ON"
449 VERBOSE: "ON"
450 CFLAGS: "-O0 --coverage"
451 CXXFLAGS: "-O0 --coverage"
452 <?php env_override("macOS")?>
453 continue-on-error: true
454 steps:
455 - uses: actions/checkout@v3
456 <?php steps("macOS", false); ?>
457 - uses: codecov/codecov-action@v3
458
459 # mac release builds
460 mac:
461 name: release
462 strategy:
463 fail-fast: false
464 matrix:
465 os_ver: [macos-12, macos-11, macos-10.15]
466 runs-on: ${{ matrix.os_ver }}
467 env:
468 CMAKE_BUILD_TYPE: "Release"
469 BUILD_DOCS_MANGZ: "ON"
470 <?php env_override("macOS")?>
471 continue-on-error: true
472 steps:
473 - uses: actions/checkout@v3
474 with:
475 fetch-depth: 0
476 <?php steps("macOS", false); ?>
477
478 # windows release builds
479 windows:
480 name: release
481 strategy:
482 fail-fast: false
483 matrix:
484 os_ver: [windows-2022, windows-2019]
485 cc_vnd: [msvc, mingw]
486 cc_ver: [cur]
487 runs-on: ${{ matrix.os_ver }}
488 continue-on-error: true
489 env:
490 CMAKE_BUILD_TYPE: "Release"
491 OS_VND: Windows
492 OS_VER: ${{ matrix.os_ver }}
493 CC_VND: ${{ matrix.cc_vnd }}
494 CC_VER: ${{ matrix.cc_ver }}
495 steps:
496 - uses: actions/checkout@v3
497 with:
498 fetch-depth: 0
499 <?php steps("Windows", true); ?>
500
501 # linux release builds
502 release:
503 strategy:
504 fail-fast: false
505 matrix:
506 os_ver: [ubuntu-22.04, ubuntu-20.04]
507 cc_vnd: [gnu, clang]
508 cc_ver: [new, cur, old]
509 runs-on: ${{ matrix.os_ver }}
510 continue-on-error: ${{ matrix.cc_vnd == 'clang' }}
511 env:
512 CMAKE_BUILD_TYPE: "Release"
513 BUILD_DOCS_MANGZ: "ON"
514 OS_VND: Linux
515 OS_VER: ${{ matrix.os_ver }}
516 CC_VND: ${{ matrix.cc_vnd }}
517 CC_VER: ${{ matrix.cc_ver }}
518 steps:
519 - uses: actions/checkout@v3
520 with:
521 fetch-depth: 0
522 <?php steps("Linux", true); ?>