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