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