1#!/bin/bash -x 2 3set -e 4 5# This only exists in OS X, but it doesn't cause issues in Linux (the dir doesn't exist, so it's 6# ignored). 7export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" 8 9case $COMPILER in 10gcc-4.9) 11 export CC=gcc-4.9 12 export CXX=g++-4.9 13 ;; 14 15gcc-5) 16 export CC=gcc-5 17 export CXX=g++-5 18 ;; 19 20gcc-6) 21 export CC=gcc-6 22 export CXX=g++-6 23 ;; 24 25gcc-7) 26 export CC=gcc-7 27 export CXX=g++-7 28 ;; 29 30gcc-8) 31 export CC=gcc-8 32 export CXX=g++-8 33 ;; 34 35gcc-9) 36 export CC=gcc-9 37 export CXX=g++-9 38 ;; 39 40gcc-10) 41 export CC=gcc-10 42 export CXX=g++-10 43 ;; 44 45gcc-11) 46 export CC=gcc-11 47 export CXX=g++-11 48 ;; 49 50gcc-12) 51 export CC=gcc-12 52 export CXX=g++-12 53 ;; 54 55gcc-13) 56 export CC=gcc-13 57 export CXX=g++-13 58 ;; 59 60gcc-14) 61 export CC=gcc-14 62 export CXX=g++-14 63 ;; 64 65clang-3.5) 66 export CC=clang-3.5 67 export CXX=clang++-3.5 68 ;; 69 70clang-3.6) 71 export CC=clang-3.6 72 export CXX=clang++-3.6 73 ;; 74 75clang-3.7) 76 export CC=clang-3.7 77 export CXX=clang++-3.7 78 ;; 79 80clang-3.8) 81 export CC=clang-3.8 82 export CXX=clang++-3.8 83 ;; 84 85clang-3.9) 86 export CC=clang-3.9 87 export CXX=clang++-3.9 88 ;; 89 90clang-4.0) 91 export CC=clang-4.0 92 export CXX=clang++-4.0 93 ;; 94 95clang-5.0) 96 export CC=clang-5.0 97 export CXX=clang++-5.0 98 ;; 99 100clang-6.0) 101 export CC=clang-6.0 102 export CXX=clang++-6.0 103 ;; 104 105clang-7.0) 106 export CC=clang-7 107 export CXX=clang++-7 108 ;; 109 110clang-8.0) 111 export CC=clang-8 112 export CXX=clang++-8 113 ;; 114 115clang-9.0) 116 export CC=clang-9 117 export CXX=clang++-9 118 ;; 119 120clang-10.0) 121 export CC=clang-10 122 export CXX=clang++-10 123 ;; 124 125clang-11.0) 126 export CC=clang-11 127 export CXX=clang++-11 128 ;; 129 130clang-12.0) 131 export CC=clang-12 132 export CXX=clang++-12 133 ;; 134 135clang-13.0) 136 export CC=clang-13 137 export CXX=clang++-13 138 ;; 139 140clang-14.0) 141 export CC=clang-14 142 export CXX=clang++-14 143 ;; 144 145clang-15.0) 146 export CC=clang-15 147 export CXX=clang++-15 148 ;; 149 150clang-16.0) 151 export CC=clang-16 152 export CXX=clang++-16 153 ;; 154 155clang-17.0) 156 export CC=clang-17 157 export CXX=clang++-17 158 ;; 159 160clang-18.0) 161 export CC=clang-18 162 export CXX=clang++-18 163 ;; 164 165clang-default) 166 export CC=clang 167 export CXX=clang++ 168 ;; 169 170bazel) 171 ;; 172 173*) 174 echo "Unrecognized value of COMPILER: $COMPILER" 175 exit 1 176esac 177 178run_make() { 179 make -j$N_JOBS 180} 181 182if [[ "${COMPILER}" != "bazel" ]] 183then 184 # This is only needed in OS X but it has no effect on Linux so we can add it unconditionally. 185 BOOST_INCLUDE_FLAG="-I /usr/local/include/boost -I /usr/local/include" 186 # -Wdtor-name (part of -pedantic) is *very* pedantic. Following that results in weird-looking code. 187 # See https://bugs.llvm.org/show_bug.cgi?id=46979. 188 COMMON_CXX_FLAGS="$STLARG $BOOST_INCLUDE_FLAG -Werror -pedantic -Wno-unknown-warning-option -Wno-dtor-name -Winvalid-pch" 189 190 echo CXX version: $($CXX --version) 191 echo C++ Standard library location: $(echo '#include <vector>' | $CXX -x c++ -E - | grep 'vector\"' | awk '{print $3}' | sed 's@/vector@@;s@\"@@g' | head -n 1) 192 echo Normalized C++ Standard library location: $(readlink -f $(echo '#include <vector>' | $CXX -x c++ -E - | grep 'vector\"' | awk '{print $3}' | sed 's@/vector@@;s@\"@@g' | head -n 1)) 193 194 case "$1" in 195 DebugPlain) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O2") ;; 196 DebugPlainNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O2") ;; 197 DebugPlainNoPch) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O2" -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 198 DebugPlainNoPchNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O2" -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 199 DebugAsan) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O0 -fsanitize=address") ;; 200 DebugAsanNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O0 -fsanitize=address") ;; 201 DebugAsanNoPch) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O0 -fsanitize=address" -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 202 DebugAsanNoPchNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O0 -fsanitize=address" -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 203 DebugAsanUbsan) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O0 -fsanitize=address,undefined") ;; 204 DebugAsanUbsanNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O0 -fsanitize=address,undefined") ;; 205 DebugAsanUbsanNoPch) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O0 -fsanitize=address,undefined" -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 206 DebugAsanUbsanNoPchNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O0 -fsanitize=address,undefined" -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 207 DebugValgrind) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O2" -DRUN_TESTS_UNDER_VALGRIND=TRUE) ;; 208 DebugValgrindNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O2" -DRUN_TESTS_UNDER_VALGRIND=TRUE) ;; 209 DebugValgrindNoPch) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O2" -DRUN_TESTS_UNDER_VALGRIND=TRUE -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 210 DebugValgrindNoPchNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Debug -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS -DFRUIT_DEBUG=1 -DFRUIT_EXTRA_DEBUG=1 -D_GLIBCXX_DEBUG=1 -O2" -DRUN_TESTS_UNDER_VALGRIND=TRUE -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 211 ReleasePlain) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Release -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS") ;; 212 ReleasePlainNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Release -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS") ;; 213 ReleasePlainNoPch) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Release -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS" -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 214 ReleasePlainNoPchNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Release -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS" -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 215 ReleaseValgrind) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Release -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS" -DRUN_TESTS_UNDER_VALGRIND=TRUE) ;; 216 ReleaseValgrindNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Release -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS" -DRUN_TESTS_UNDER_VALGRIND=TRUE) ;; 217 ReleaseValgrindNoPch) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Release -DFRUIT_ENABLE_CLANG_TIDY=TRUE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS" -DRUN_TESTS_UNDER_VALGRIND=TRUE -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 218 ReleaseValgrindNoPchNoClangTidy) CMAKE_ARGS=(-DCMAKE_BUILD_TYPE=Release -DFRUIT_ENABLE_CLANG_TIDY=FALSE -DCMAKE_CXX_FLAGS="$COMMON_CXX_FLAGS" -DRUN_TESTS_UNDER_VALGRIND=TRUE -DFRUIT_TESTS_USE_PRECOMPILED_HEADERS=OFF) ;; 219 *) echo "Error: you need to specify one of the supported postsubmit modes (see postsubmit.sh)."; exit 1 ;; 220 esac 221 # Setting compilers only via env vars doesn't work when using recent versions of XCode. 222 CMAKE_ARGS+=(-DCMAKE_C_COMPILER=$CC -DCMAKE_CXX_COMPILER=$CXX) 223 224 SOURCES_PATH="$PWD" 225 226 # This is not needed on Travis CI, but it's sometimes needed when running postsubmit.sh locally, to avoid "import 227 # file mismatch" errors. 228 rm -rf tests/__pycache__/ tests/*.pyc tests/*/__pycache__/ tests/*/*.pyc 229 230 rm -rf build 231 mkdir build 232 cd build 233 cmake .. "${CMAKE_ARGS[@]}" 234 echo 235 echo "Content of CMakeFiles/CMakeError.log:" 236 if [ -f "CMakeFiles/CMakeError.log" ] 237 then 238 cat CMakeFiles/CMakeError.log 239 fi 240 echo 241 run_make 242 243 cd examples 244 run_make 245 cd .. 246 247 cd tests 248 run_make 249 250 python3 -m pytest -n auto -r a "$SOURCES_PATH"/tests 251 cd .. 252 253 make install 254else 255 # COMPILER=bazel 256 257 # In recent versions of Bazel (as of May 2020), --python_path is ignored unless 258 # --noincompatible_use_python_toolchains is also used. 259 # Ignoring --python_path is ok in Ubuntu 20.04 since 3.8 is the default Python there, but causes problems in docker 260 # images with older Ubuntu versions that have both 3.8 and another 3.x version installed. 261 BAZEL_FLAGS=("--python_path=$(which python3.8)" "--noincompatible_use_python_toolchains") 262 case "$1" in 263 DebugPlain) ;; 264 ReleasePlain) BAZEL_FLAGS+=("-c" "opt") ;; 265 *) echo "Error: you need to specify one of the supported postsubmit modes (see postsubmit.sh)."; exit 1 ;; 266 esac 267 268 cd extras/bazel_root/third_party/fruit 269 bazel build "${BAZEL_FLAGS[@]}" :fruit examples/... tests/... 270 bazel test "${BAZEL_FLAGS[@]}" --test_output=errors tests/... 271fi 272