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