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