|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +function failure() { |
| 4 | + echo "Oops, $* failed ;(" >&2 |
| 5 | + exit 2 |
| 6 | +} |
| 7 | + |
| 8 | +export ci_script_recursion="$((++ci_script_recursion))" |
| 9 | +if [ $ci_script_recursion -gt 3 ]; then |
| 10 | + failure "WTF: ci_script_recursion = $ci_script_recursion ?" |
| 11 | +fi |
| 12 | + |
| 13 | +IFS='|' read -r -a config_args <<< "${1:-}" |
| 14 | +IFS='|' read -r -a build_args <<< "${2:-}" |
| 15 | +IFS='|' read -r -a test_args <<< "${3:-}" |
| 16 | +set -euxo pipefail |
| 17 | + |
| 18 | +function provide_toolchain { |
| 19 | + set +ex |
| 20 | + export CC="$((which ${CC:-cc} || which gcc || which clang || which true) 2>/dev/null)" |
| 21 | + export CXX="$((which ${CXX:-c++} || which g++ || which clang++ || which true) 2>/dev/null)" |
| 22 | + echo "CC: ${CC} => $($CC --version | head -1)" |
| 23 | + echo "CXX: ${CXX} => $($CXX --version | head -1)" |
| 24 | + CMAKE="$(which cmake 2>/dev/null)" |
| 25 | + if [ -z "${CMAKE}" -o -z "$(which ninja 2>/dev/null)" ]; then |
| 26 | + SUDO=$(which sudo 2>&-) |
| 27 | + if [ -n "$(which apt 2>/dev/null)" ]; then |
| 28 | + ${SUDO} apt update && sudo apt install -y cmake ninja-build libgtest-dev |
| 29 | + elif [ -n "$(which dnf 2>/dev/null)" ]; then |
| 30 | + ${SUDO} dnf install -y cmake ninja-build gtest-devel |
| 31 | + elif [ -n "$(which yum 2>/dev/null)" ]; then |
| 32 | + ${SUDO} yum install -y cmake ninja-build gtest-devel |
| 33 | + fi |
| 34 | + CMAKE="$(which cmake 2>/dev/null) | echo false" |
| 35 | + fi |
| 36 | + CMAKE_VERSION=$(eval expr $("${CMAKE}" --version | sed -n 's/cmake version \([0-9]\{1,\}\)\.\([0-9]\{1,\}\)\.\([0-9]\{1,\}\)/\10000 + \200 + \3/p' || echo '00000')) |
| 37 | + echo "CMAKE: ${CMAKE} => $(${CMAKE} --version | head -1) ($CMAKE_VERSION)" |
| 38 | + set -euxo pipefail |
| 39 | +} |
| 40 | +
|
| 41 | +function default_test { |
| 42 | + GTEST_SHUFFLE=1 GTEST_RUNTIME_LIMIT=99 MALLOC_CHECK_=7 MALLOC_PERTURB_=42 \ |
| 43 | + ctest --output-on-failure --parallel 3 --schedule-random --no-tests=error \ |
| 44 | + "${test_args[@]+"${test_args[@]}"}" |
| 45 | +} |
| 46 | +
|
| 47 | +function default_build { |
| 48 | + local cmake_use_ninja="" |
| 49 | + if "${CMAKE}" --help | grep -iq ninja && [ -n "$(which ninja 2>/dev/null)" ] && echo " ${config_args[@]+"${config_args[@]}"}" | grep -qv -e ' -[GTA] '; then |
| 50 | + echo "NINJA: $(which ninja 2>/dev/null) => $(ninja --version | head -1)" |
| 51 | + cmake_use_ninja="-G Ninja" |
| 52 | + fi |
| 53 | + "${CMAKE}" ${cmake_use_ninja} "${config_args[@]+"${config_args[@]}"}" .. && "${CMAKE}" --build . "${build_args[@]+"${build_args[@]}"}" |
| 54 | +} |
| 55 | +
|
| 56 | +function default_ci { |
| 57 | + provide_toolchain |
| 58 | + local skipped=true |
| 59 | + local ok=true |
| 60 | + if [ -e CMakeLists.txt -a $CMAKE_VERSION -ge 30002 ]; then |
| 61 | + skipped=false |
| 62 | + mkdir @build && (cd @build && default_build && default_test && echo "Done (cmake)") || ok=false |
| 63 | + fi |
| 64 | + if [ -n "$CC" -a -n "${CI_MAKE_TARGET=test}" ] && [ -e GNUmakefile -o -e Makefile -o -e makefile ]; then |
| 65 | + skipped=false |
| 66 | + make -j2 all && make ${CI_MAKE_TARGET} && echo "Done (make)" || ok=false |
| 67 | + fi |
| 68 | + if [ $skipped = "true" ]; then |
| 69 | + echo "Skipped since CMAKE_VERSION ($CMAKE_VERSION) < 3.0.2 and no Makefile" |
| 70 | + elif [ $ok != "true" ]; then |
| 71 | + exit 1 |
| 72 | + fi |
| 73 | +} |
| 74 | +
|
| 75 | +git clean -x -f -d || echo "ignore 'git clean' error" |
| 76 | +git describe --tags || git show --oneline -s |
| 77 | +
|
| 78 | +if [ -z "${CI_ACTION:-}" ]; then |
| 79 | + CI_ACTION=default_ci |
| 80 | +fi |
| 81 | +
|
| 82 | +$CI_ACTION || failure $CI_ACTION |
0 commit comments