xref: /aosp_15_r20/external/google-fruit/extras/scripts/postsubmit-helper.sh (revision a65addddcf69f38db5b288d787b6b7571a57bb8f)
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