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