xref: /netbsd-src/external/apache2/llvm/dist/libcxx/utils/ci/run-buildbot (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg#!/usr/bin/env bash
2*4d6fc14bSjoerg#===----------------------------------------------------------------------===##
3*4d6fc14bSjoerg#
4*4d6fc14bSjoerg# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*4d6fc14bSjoerg# See https://llvm.org/LICENSE.txt for license information.
6*4d6fc14bSjoerg# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*4d6fc14bSjoerg#
8*4d6fc14bSjoerg#===----------------------------------------------------------------------===##
9*4d6fc14bSjoerg
10*4d6fc14bSjoergset -ex
11*4d6fc14bSjoergset -o pipefail
12*4d6fc14bSjoergunset LANG
13*4d6fc14bSjoergunset LC_ALL
14*4d6fc14bSjoergunset LC_COLLATE
15*4d6fc14bSjoerg
16*4d6fc14bSjoergPROGNAME="$(basename "${0}")"
17*4d6fc14bSjoerg
18*4d6fc14bSjoergfunction usage() {
19*4d6fc14bSjoergcat <<EOF
20*4d6fc14bSjoergUsage:
21*4d6fc14bSjoerg${PROGNAME} [options] <BUILDER>
22*4d6fc14bSjoerg
23*4d6fc14bSjoerg[-h|--help]         Display this help and exit.
24*4d6fc14bSjoerg
25*4d6fc14bSjoerg--llvm-root <DIR>   Path to the root of the LLVM monorepo. By default, we try
26*4d6fc14bSjoerg                    to figure it out based on the current working directory.
27*4d6fc14bSjoerg
28*4d6fc14bSjoerg--build-dir <DIR>   The directory to use for building the library. By default,
29*4d6fc14bSjoerg                    this is '<llvm-root>/build/<builder>'.
30*4d6fc14bSjoerg
31*4d6fc14bSjoerg--osx-roots <DIR>   Path to pre-downloaded macOS dylibs. By default, we download
32*4d6fc14bSjoerg                    them from Green Dragon. This is only relevant at all when
33*4d6fc14bSjoerg                    running back-deployment testing if one wants to override
34*4d6fc14bSjoerg                    the old dylibs we use to run the tests with different ones.
35*4d6fc14bSjoergEOF
36*4d6fc14bSjoerg}
37*4d6fc14bSjoerg
38*4d6fc14bSjoergwhile [[ $# -gt 0 ]]; do
39*4d6fc14bSjoerg    case ${1} in
40*4d6fc14bSjoerg        -h|--help)
41*4d6fc14bSjoerg            usage
42*4d6fc14bSjoerg            exit 0
43*4d6fc14bSjoerg            ;;
44*4d6fc14bSjoerg        --llvm-root)
45*4d6fc14bSjoerg            MONOREPO_ROOT="${2}"
46*4d6fc14bSjoerg            shift; shift
47*4d6fc14bSjoerg            ;;
48*4d6fc14bSjoerg        --build-dir)
49*4d6fc14bSjoerg            BUILD_DIR="${2}"
50*4d6fc14bSjoerg            shift; shift
51*4d6fc14bSjoerg            ;;
52*4d6fc14bSjoerg        --osx-roots)
53*4d6fc14bSjoerg            OSX_ROOTS="${2}"
54*4d6fc14bSjoerg            shift; shift
55*4d6fc14bSjoerg            ;;
56*4d6fc14bSjoerg        *)
57*4d6fc14bSjoerg            BUILDER="${1}"
58*4d6fc14bSjoerg            shift
59*4d6fc14bSjoerg            ;;
60*4d6fc14bSjoerg    esac
61*4d6fc14bSjoergdone
62*4d6fc14bSjoerg
63*4d6fc14bSjoergMONOREPO_ROOT="${MONOREPO_ROOT:="$(git rev-parse --show-toplevel)"}"
64*4d6fc14bSjoergBUILD_DIR="${BUILD_DIR:=${MONOREPO_ROOT}/build/${BUILDER}}"
65*4d6fc14bSjoergINSTALL_DIR="${BUILD_DIR}/install"
66*4d6fc14bSjoerg
67*4d6fc14bSjoerg# If we can find Ninja/CMake provided by Xcode, use those since we know their
68*4d6fc14bSjoerg# version will generally work with the Clang shipped in Xcode (e.g. if Clang
69*4d6fc14bSjoerg# knows about -std=c++20, the CMake bundled in Xcode will probably know about
70*4d6fc14bSjoerg# that flag too).
71*4d6fc14bSjoergif xcrun --find ninja &>/dev/null; then NINJA="$(xcrun --find ninja)"; else NINJA="ninja"; fi
72*4d6fc14bSjoergif xcrun --find cmake &>/dev/null; then CMAKE="$(xcrun --find cmake)"; else CMAKE="cmake"; fi
73*4d6fc14bSjoerg
74*4d6fc14bSjoergfunction clean() {
75*4d6fc14bSjoerg    rm -rf "${BUILD_DIR}"
76*4d6fc14bSjoerg}
77*4d6fc14bSjoerg
78*4d6fc14bSjoergfunction generate-cmake-base() {
79*4d6fc14bSjoerg    echo "--- Generating CMake"
80*4d6fc14bSjoerg    ${CMAKE} \
81*4d6fc14bSjoerg          -B "${BUILD_DIR}" \
82*4d6fc14bSjoerg          -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \
83*4d6fc14bSjoerg          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
84*4d6fc14bSjoerg          -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
85*4d6fc14bSjoerg          -DLLVM_LIT_ARGS="-sv --show-unsupported --xunit-xml-output test-results.xml" \
86*4d6fc14bSjoerg          "${@}"
87*4d6fc14bSjoerg}
88*4d6fc14bSjoerg
89*4d6fc14bSjoergfunction generate-cmake() {
90*4d6fc14bSjoerg    generate-cmake-base \
91*4d6fc14bSjoerg          -S "${MONOREPO_ROOT}/llvm" \
92*4d6fc14bSjoerg          -DLLVM_ENABLE_PROJECTS="libcxx;libunwind;libcxxabi" \
93*4d6fc14bSjoerg          -DLIBCXX_CXX_ABI=libcxxabi \
94*4d6fc14bSjoerg          "${@}"
95*4d6fc14bSjoerg}
96*4d6fc14bSjoerg
97*4d6fc14bSjoergfunction generate-cmake-libcxx-win() {
98*4d6fc14bSjoerg    # TODO: Clang-cl in MSVC configurations don't have access to compiler_rt
99*4d6fc14bSjoerg    # builtins helpers for int128 division. See
100*4d6fc14bSjoerg    # https://reviews.llvm.org/D91139#2429595 for a comment about longterm
101*4d6fc14bSjoerg    # intent for handling the issue. In the meantime, define
102*4d6fc14bSjoerg    # -D_LIBCPP_HAS_NO_INT128 (both when building the library itself and
103*4d6fc14bSjoerg    # when building tests) to allow enabling filesystem for running tests,
104*4d6fc14bSjoerg    # even if it uses a non-permanent ABI.
105*4d6fc14bSjoerg
106*4d6fc14bSjoerg    generate-cmake-base \
107*4d6fc14bSjoerg          -S "${MONOREPO_ROOT}/libcxx" \
108*4d6fc14bSjoerg          -DCMAKE_C_COMPILER=clang-cl \
109*4d6fc14bSjoerg          -DCMAKE_CXX_COMPILER=clang-cl \
110*4d6fc14bSjoerg          -DLIBCXX_ENABLE_FILESYSTEM=YES \
111*4d6fc14bSjoerg          -DCMAKE_CXX_FLAGS="-D_LIBCPP_HAS_NO_INT128" \
112*4d6fc14bSjoerg          -DLIBCXX_TEST_COMPILER_FLAGS="-D_LIBCPP_HAS_NO_INT128" \
113*4d6fc14bSjoerg          "${@}"
114*4d6fc14bSjoerg}
115*4d6fc14bSjoerg
116*4d6fc14bSjoergfunction check-cxx-cxxabi() {
117*4d6fc14bSjoerg    echo "--- Installing libc++ and libc++abi to a fake location"
118*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}" install-cxx install-cxxabi
119*4d6fc14bSjoerg
120*4d6fc14bSjoerg    echo "+++ Running the libc++ tests"
121*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}" check-cxx
122*4d6fc14bSjoerg
123*4d6fc14bSjoerg    echo "+++ Running the libc++abi tests"
124*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}" check-cxxabi
125*4d6fc14bSjoerg}
126*4d6fc14bSjoerg
127*4d6fc14bSjoerg# TODO: The goal is to test this against all configurations. We should also move
128*4d6fc14bSjoerg#       this to the Lit test suite instead of being a separate CMake target.
129*4d6fc14bSjoergfunction check-abi-list() {
130*4d6fc14bSjoerg    echo "+++ Running the libc++ ABI list test"
131*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}" check-cxx-abilist || (
132*4d6fc14bSjoerg        echo "+++ Generating the libc++ ABI list after failed check"
133*4d6fc14bSjoerg        ${NINJA} -vC "${BUILD_DIR}" generate-cxx-abilist
134*4d6fc14bSjoerg        false
135*4d6fc14bSjoerg    )
136*4d6fc14bSjoerg}
137*4d6fc14bSjoerg
138*4d6fc14bSjoergfunction check-cxx-benchmarks() {
139*4d6fc14bSjoerg    echo "--- Running the benchmarks"
140*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}" check-cxx-benchmarks
141*4d6fc14bSjoerg}
142*4d6fc14bSjoerg
143*4d6fc14bSjoerg# Print the version of a few tools to aid diagnostics in some cases
144*4d6fc14bSjoerg${CMAKE} --version
145*4d6fc14bSjoerg${NINJA} --version
146*4d6fc14bSjoerg
147*4d6fc14bSjoergcase "${BUILDER}" in
148*4d6fc14bSjoergcheck-format)
149*4d6fc14bSjoerg    clean
150*4d6fc14bSjoerg    echo "+++ Checking formatting"
151*4d6fc14bSjoerg    # We need to set --extensions so that clang-format checks extensionless files.
152*4d6fc14bSjoerg    mkdir -p ${BUILD_DIR}
153*4d6fc14bSjoerg    git-clang-format \
154*4d6fc14bSjoerg        --binary /usr/bin/clang-format --diff \
155*4d6fc14bSjoerg        --extensions ',h,hh,hpp,hxx,c,cc,cxx,cpp' HEAD~1 \
156*4d6fc14bSjoerg        -- \
157*4d6fc14bSjoerg            libcxx/{benchmarks,include,src,test} \
158*4d6fc14bSjoerg            libcxxabi/{fuzz,include,src,test} \
159*4d6fc14bSjoerg        | tee ${BUILD_DIR}/clang-format.patch
160*4d6fc14bSjoerg    # Check if the diff is empty, fail otherwise.
161*4d6fc14bSjoerg    ! grep -q '^--- a' ${BUILD_DIR}/clang-format.patch
162*4d6fc14bSjoerg;;
163*4d6fc14bSjoergcheck-generated-output)
164*4d6fc14bSjoerg    # `! foo` doesn't work properly with `set -e`, use `! foo || false` instead.
165*4d6fc14bSjoerg    # https://stackoverflow.com/questions/57681955/set-e-does-not-respect-logical-not
166*4d6fc14bSjoerg    clean
167*4d6fc14bSjoerg    echo "+++ Checking the output of the generator scripts"
168*4d6fc14bSjoerg    mkdir -p ${BUILD_DIR}
169*4d6fc14bSjoerg    # Reject patches that don't update the generated output correctly.
170*4d6fc14bSjoerg    python3 libcxx/utils/generate_feature_test_macro_components.py
171*4d6fc14bSjoerg    python3 libcxx/utils/generate_header_inclusion_tests.py
172*4d6fc14bSjoerg    python3 libcxx/utils/generate_header_tests.py
173*4d6fc14bSjoerg    git diff | tee ${BUILD_DIR}/generated_output.patch
174*4d6fc14bSjoerg    # Check if the diffs are empty, fail otherwise.
175*4d6fc14bSjoerg    ! grep -q '^--- a' ${BUILD_DIR}/generated_output.patch || false
176*4d6fc14bSjoerg    # Reject patches that introduce non-ASCII characters or hard tabs.
177*4d6fc14bSjoerg    # Depends on LC_COLLATE set at the top of this script.
178*4d6fc14bSjoerg    ! grep -rn '[^ -~]' libcxx/include/ || false
179*4d6fc14bSjoerg    # Check that no dependency cycles have been introduced.
180*4d6fc14bSjoerg    python3 libcxx/utils/graph_header_deps.py >/dev/null
181*4d6fc14bSjoerg;;
182*4d6fc14bSjoerggeneric-cxx03)
183*4d6fc14bSjoerg    export CC=clang
184*4d6fc14bSjoerg    export CXX=clang++
185*4d6fc14bSjoerg    clean
186*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx03.cmake" \
187*4d6fc14bSjoerg                   -DLIBCXX_TEST_CONFIG="${MONOREPO_ROOT}/libcxx/test/configs/libcxx-trunk-shared.cfg.in"
188*4d6fc14bSjoerg    check-cxx-cxxabi
189*4d6fc14bSjoerg    check-abi-list
190*4d6fc14bSjoerg;;
191*4d6fc14bSjoerggeneric-cxx11)
192*4d6fc14bSjoerg    export CC=clang
193*4d6fc14bSjoerg    export CXX=clang++
194*4d6fc14bSjoerg    clean
195*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx11.cmake" \
196*4d6fc14bSjoerg                   -DLIBCXX_TEST_CONFIG="${MONOREPO_ROOT}/libcxx/test/configs/libcxx-trunk-shared.cfg.in"
197*4d6fc14bSjoerg    check-cxx-cxxabi
198*4d6fc14bSjoerg    check-abi-list
199*4d6fc14bSjoerg;;
200*4d6fc14bSjoerggeneric-cxx14)
201*4d6fc14bSjoerg    export CC=clang
202*4d6fc14bSjoerg    export CXX=clang++
203*4d6fc14bSjoerg    clean
204*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx14.cmake" \
205*4d6fc14bSjoerg                   -DLIBCXX_TEST_CONFIG="${MONOREPO_ROOT}/libcxx/test/configs/libcxx-trunk-shared.cfg.in"
206*4d6fc14bSjoerg    check-cxx-cxxabi
207*4d6fc14bSjoerg    check-abi-list
208*4d6fc14bSjoerg;;
209*4d6fc14bSjoerggeneric-cxx17)
210*4d6fc14bSjoerg    export CC=clang
211*4d6fc14bSjoerg    export CXX=clang++
212*4d6fc14bSjoerg    clean
213*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx17.cmake" \
214*4d6fc14bSjoerg                   -DLIBCXX_TEST_CONFIG="${MONOREPO_ROOT}/libcxx/test/configs/libcxx-trunk-shared.cfg.in"
215*4d6fc14bSjoerg    check-cxx-cxxabi
216*4d6fc14bSjoerg    check-abi-list
217*4d6fc14bSjoerg;;
218*4d6fc14bSjoerggeneric-cxx20)
219*4d6fc14bSjoerg    export CC=clang
220*4d6fc14bSjoerg    export CXX=clang++
221*4d6fc14bSjoerg    clean
222*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx20.cmake" \
223*4d6fc14bSjoerg                   -DLIBCXX_TEST_CONFIG="${MONOREPO_ROOT}/libcxx/test/configs/libcxx-trunk-shared.cfg.in"
224*4d6fc14bSjoerg    check-cxx-cxxabi
225*4d6fc14bSjoerg    check-abi-list
226*4d6fc14bSjoerg;;
227*4d6fc14bSjoerggeneric-cxx2b)
228*4d6fc14bSjoerg    export CC=clang-tot
229*4d6fc14bSjoerg    export CXX=clang++-tot
230*4d6fc14bSjoerg    clean
231*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx2b.cmake" \
232*4d6fc14bSjoerg                   -DLIBCXX_TEST_CONFIG="${MONOREPO_ROOT}/libcxx/test/configs/libcxx-trunk-shared.cfg.in"
233*4d6fc14bSjoerg    check-cxx-cxxabi
234*4d6fc14bSjoerg    check-abi-list
235*4d6fc14bSjoerg;;
236*4d6fc14bSjoerggeneric-debug-iterators)
237*4d6fc14bSjoerg    export CC=clang-tot
238*4d6fc14bSjoerg    export CXX=clang++-tot
239*4d6fc14bSjoerg    clean
240*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-debug-iterators.cmake"
241*4d6fc14bSjoerg    check-cxx-cxxabi
242*4d6fc14bSjoerg    check-abi-list
243*4d6fc14bSjoerg;;
244*4d6fc14bSjoerggeneric-noexceptions)
245*4d6fc14bSjoerg    export CC=clang
246*4d6fc14bSjoerg    export CXX=clang++
247*4d6fc14bSjoerg    clean
248*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-noexceptions.cmake"
249*4d6fc14bSjoerg    check-cxx-cxxabi
250*4d6fc14bSjoerg;;
251*4d6fc14bSjoerggeneric-static)
252*4d6fc14bSjoerg    export CC=clang
253*4d6fc14bSjoerg    export CXX=clang++
254*4d6fc14bSjoerg    clean
255*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-static.cmake" \
256*4d6fc14bSjoerg                   -DLIBCXX_TEST_CONFIG="${MONOREPO_ROOT}/libcxx/test/configs/libcxx-trunk-static.cfg.in"
257*4d6fc14bSjoerg    check-cxx-cxxabi
258*4d6fc14bSjoerg;;
259*4d6fc14bSjoerggeneric-32bit)
260*4d6fc14bSjoerg    export CC=clang
261*4d6fc14bSjoerg    export CXX=clang++
262*4d6fc14bSjoerg    clean
263*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-32bits.cmake"
264*4d6fc14bSjoerg    check-cxx-cxxabi
265*4d6fc14bSjoerg;;
266*4d6fc14bSjoerggeneric-gcc)
267*4d6fc14bSjoerg    export CC=gcc
268*4d6fc14bSjoerg    export CXX=g++
269*4d6fc14bSjoerg    clean
270*4d6fc14bSjoerg    generate-cmake
271*4d6fc14bSjoerg    check-cxx-cxxabi
272*4d6fc14bSjoerg;;
273*4d6fc14bSjoerggeneric-asan)
274*4d6fc14bSjoerg    export CC=clang
275*4d6fc14bSjoerg    export CXX=clang++
276*4d6fc14bSjoerg    clean
277*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-asan.cmake"
278*4d6fc14bSjoerg    check-cxx-cxxabi
279*4d6fc14bSjoerg;;
280*4d6fc14bSjoerggeneric-msan)
281*4d6fc14bSjoerg    export CC=clang
282*4d6fc14bSjoerg    export CXX=clang++
283*4d6fc14bSjoerg    clean
284*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-msan.cmake"
285*4d6fc14bSjoerg    check-cxx-cxxabi
286*4d6fc14bSjoerg;;
287*4d6fc14bSjoerggeneric-tsan)
288*4d6fc14bSjoerg    export CC=clang
289*4d6fc14bSjoerg    export CXX=clang++
290*4d6fc14bSjoerg    clean
291*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-tsan.cmake"
292*4d6fc14bSjoerg    check-cxx-cxxabi
293*4d6fc14bSjoerg;;
294*4d6fc14bSjoerggeneric-ubsan)
295*4d6fc14bSjoerg    export CC=clang
296*4d6fc14bSjoerg    export CXX=clang++
297*4d6fc14bSjoerg    clean
298*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-ubsan.cmake"
299*4d6fc14bSjoerg    check-cxx-cxxabi
300*4d6fc14bSjoerg;;
301*4d6fc14bSjoerggeneric-with_llvm_unwinder)
302*4d6fc14bSjoerg    export CC=clang
303*4d6fc14bSjoerg    export CXX=clang++
304*4d6fc14bSjoerg    clean
305*4d6fc14bSjoerg    generate-cmake -DLIBCXXABI_USE_LLVM_UNWINDER=ON
306*4d6fc14bSjoerg    check-cxx-cxxabi
307*4d6fc14bSjoerg;;
308*4d6fc14bSjoerggeneric-singlethreaded)
309*4d6fc14bSjoerg    export CC=clang
310*4d6fc14bSjoerg    export CXX=clang++
311*4d6fc14bSjoerg    clean
312*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-singlethreaded.cmake"
313*4d6fc14bSjoerg    check-cxx-cxxabi
314*4d6fc14bSjoerg;;
315*4d6fc14bSjoerggeneric-no-debug)
316*4d6fc14bSjoerg    export CC=clang
317*4d6fc14bSjoerg    export CXX=clang++
318*4d6fc14bSjoerg    clean
319*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-debug.cmake"
320*4d6fc14bSjoerg    check-cxx-cxxabi
321*4d6fc14bSjoerg;;
322*4d6fc14bSjoerggeneric-no-filesystem)
323*4d6fc14bSjoerg    export CC=clang
324*4d6fc14bSjoerg    export CXX=clang++
325*4d6fc14bSjoerg    clean
326*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-filesystem.cmake"
327*4d6fc14bSjoerg    check-cxx-cxxabi
328*4d6fc14bSjoerg;;
329*4d6fc14bSjoerggeneric-no-random_device)
330*4d6fc14bSjoerg    export CC=clang
331*4d6fc14bSjoerg    export CXX=clang++
332*4d6fc14bSjoerg    clean
333*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-random_device.cmake"
334*4d6fc14bSjoerg    check-cxx-cxxabi
335*4d6fc14bSjoerg;;
336*4d6fc14bSjoerggeneric-no-localization)
337*4d6fc14bSjoerg    export CC=clang
338*4d6fc14bSjoerg    export CXX=clang++
339*4d6fc14bSjoerg    clean
340*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-localization.cmake"
341*4d6fc14bSjoerg    check-cxx-cxxabi
342*4d6fc14bSjoerg;;
343*4d6fc14bSjoergx86_64-apple-system)
344*4d6fc14bSjoerg    export CC=clang
345*4d6fc14bSjoerg    export CXX=clang++
346*4d6fc14bSjoerg    clean
347*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Apple.cmake"
348*4d6fc14bSjoerg    check-cxx-cxxabi
349*4d6fc14bSjoerg;;
350*4d6fc14bSjoergx86_64-apple-system-noexceptions)
351*4d6fc14bSjoerg    export CC=clang
352*4d6fc14bSjoerg    export CXX=clang++
353*4d6fc14bSjoerg    clean
354*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Apple.cmake" \
355*4d6fc14bSjoerg                   -DLIBCXX_ENABLE_EXCEPTIONS=OFF \
356*4d6fc14bSjoerg                   -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF
357*4d6fc14bSjoerg    check-cxx-cxxabi
358*4d6fc14bSjoerg;;
359*4d6fc14bSjoergx86_64-apple-system-backdeployment-*)
360*4d6fc14bSjoerg    clean
361*4d6fc14bSjoerg
362*4d6fc14bSjoerg    if [[ "${OSX_ROOTS}" == "" ]]; then
363*4d6fc14bSjoerg        echo "--- Downloading previous macOS dylibs"
364*4d6fc14bSjoerg        PREVIOUS_DYLIBS_URL="https://dl.dropboxusercontent.com/s/liu4fmc53qzlfly/libcxx-roots.tar.gz"
365*4d6fc14bSjoerg        OSX_ROOTS="${BUILD_DIR}/macos-roots"
366*4d6fc14bSjoerg        mkdir -p "${OSX_ROOTS}"
367*4d6fc14bSjoerg        curl "${PREVIOUS_DYLIBS_URL}" | tar -xz --strip-components=1 -C "${OSX_ROOTS}"
368*4d6fc14bSjoerg    fi
369*4d6fc14bSjoerg
370*4d6fc14bSjoerg    DEPLOYMENT_TARGET="${BUILDER#x86_64-apple-system-backdeployment-}"
371*4d6fc14bSjoerg
372*4d6fc14bSjoerg    # TODO: On Apple platforms, we never produce libc++abi.1.dylib, always libc++abi.dylib.
373*4d6fc14bSjoerg    #       Fix that in the build so that the tests stop searching for @rpath/libc++abi.1.dylib.
374*4d6fc14bSjoerg    cp "${OSX_ROOTS}/macOS/libc++abi/${DEPLOYMENT_TARGET}/libc++abi.dylib" \
375*4d6fc14bSjoerg       "${OSX_ROOTS}/macOS/libc++abi/${DEPLOYMENT_TARGET}/libc++abi.1.dylib"
376*4d6fc14bSjoerg
377*4d6fc14bSjoerg    PARAMS="target_triple=x86_64-apple-macosx${DEPLOYMENT_TARGET}"
378*4d6fc14bSjoerg    PARAMS+=";cxx_runtime_root=${OSX_ROOTS}/macOS/libc++/${DEPLOYMENT_TARGET}"
379*4d6fc14bSjoerg    PARAMS+=";abi_runtime_root=${OSX_ROOTS}/macOS/libc++abi/${DEPLOYMENT_TARGET}"
380*4d6fc14bSjoerg    PARAMS+=";use_system_cxx_lib=True"
381*4d6fc14bSjoerg
382*4d6fc14bSjoerg    export CC=clang
383*4d6fc14bSjoerg    export CXX=clang++
384*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Apple.cmake" \
385*4d6fc14bSjoerg                   -DLIBCXX_TEST_PARAMS="${PARAMS}" \
386*4d6fc14bSjoerg                   -DLIBCXXABI_TEST_PARAMS="${PARAMS}"
387*4d6fc14bSjoerg
388*4d6fc14bSjoerg    check-cxx-cxxabi
389*4d6fc14bSjoerg;;
390*4d6fc14bSjoergbenchmarks)
391*4d6fc14bSjoerg    export CC=clang
392*4d6fc14bSjoerg    export CXX=clang++
393*4d6fc14bSjoerg    clean
394*4d6fc14bSjoerg    generate-cmake
395*4d6fc14bSjoerg    check-cxx-benchmarks
396*4d6fc14bSjoerg;;
397*4d6fc14bSjoergdocumentation)
398*4d6fc14bSjoerg    export CC=clang
399*4d6fc14bSjoerg    export CXX=clang++
400*4d6fc14bSjoerg    clean
401*4d6fc14bSjoerg    generate-cmake -DLLVM_ENABLE_SPHINX=ON
402*4d6fc14bSjoerg
403*4d6fc14bSjoerg    echo "+++ Generating documentation"
404*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}" docs-libcxx-html
405*4d6fc14bSjoerg;;
406*4d6fc14bSjoergunified-standalone)
407*4d6fc14bSjoerg    export CC=clang
408*4d6fc14bSjoerg    export CXX=clang++
409*4d6fc14bSjoerg
410*4d6fc14bSjoerg    clean
411*4d6fc14bSjoerg
412*4d6fc14bSjoerg    echo "--- Generating CMake"
413*4d6fc14bSjoerg    ${CMAKE} \
414*4d6fc14bSjoerg          -S "${MONOREPO_ROOT}/libcxx/utils/ci/runtimes" \
415*4d6fc14bSjoerg          -B "${BUILD_DIR}" \
416*4d6fc14bSjoerg          -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \
417*4d6fc14bSjoerg          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
418*4d6fc14bSjoerg          -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
419*4d6fc14bSjoerg          -DLLVM_ENABLE_PROJECTS="libcxx;libcxxabi;libunwind"
420*4d6fc14bSjoerg
421*4d6fc14bSjoerg    check-cxx-cxxabi
422*4d6fc14bSjoerg;;
423*4d6fc14bSjoergruntimes-build)
424*4d6fc14bSjoerg    export CC=clang
425*4d6fc14bSjoerg    export CXX=clang++
426*4d6fc14bSjoerg
427*4d6fc14bSjoerg    clean
428*4d6fc14bSjoerg
429*4d6fc14bSjoerg    echo "--- Generating CMake"
430*4d6fc14bSjoerg    ${CMAKE} \
431*4d6fc14bSjoerg          -S "${MONOREPO_ROOT}/llvm" \
432*4d6fc14bSjoerg          -B "${BUILD_DIR}" \
433*4d6fc14bSjoerg          -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \
434*4d6fc14bSjoerg          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
435*4d6fc14bSjoerg          -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
436*4d6fc14bSjoerg          -DLLVM_ENABLE_PROJECTS="clang" \
437*4d6fc14bSjoerg          -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
438*4d6fc14bSjoerg          -DLLVM_RUNTIME_TARGETS="x86_64-unknown-linux-gnu"
439*4d6fc14bSjoerg
440*4d6fc14bSjoerg    echo "+++ Running the libc++ and libc++abi tests"
441*4d6fc14bSjoerg    ${NINJA} -C "${BUILD_DIR}" check-runtimes
442*4d6fc14bSjoerg
443*4d6fc14bSjoerg    echo "--- Installing libc++ and libc++abi to a fake location"
444*4d6fc14bSjoerg    ${NINJA} -C "${BUILD_DIR}" install-cxx install-cxxabi
445*4d6fc14bSjoerg;;
446*4d6fc14bSjoerglegacy-test-config)
447*4d6fc14bSjoerg    export CC=clang
448*4d6fc14bSjoerg    export CXX=clang++
449*4d6fc14bSjoerg    clean
450*4d6fc14bSjoerg    generate-cmake -DLIBCXX_TEST_CONFIG="${MONOREPO_ROOT}/libcxx/test/configs/legacy.cfg.in"
451*4d6fc14bSjoerg    check-cxx-cxxabi
452*4d6fc14bSjoerg;;
453*4d6fc14bSjoerglegacy-standalone)
454*4d6fc14bSjoerg    export CC=clang
455*4d6fc14bSjoerg    export CXX=clang++
456*4d6fc14bSjoerg
457*4d6fc14bSjoerg    clean
458*4d6fc14bSjoerg
459*4d6fc14bSjoerg    echo "--- Generating CMake"
460*4d6fc14bSjoerg    ${CMAKE} \
461*4d6fc14bSjoerg          -S "${MONOREPO_ROOT}/libcxx" \
462*4d6fc14bSjoerg          -B "${BUILD_DIR}/libcxx" \
463*4d6fc14bSjoerg          -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \
464*4d6fc14bSjoerg          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
465*4d6fc14bSjoerg          -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
466*4d6fc14bSjoerg          -DLLVM_PATH="${MONOREPO_ROOT}/llvm" \
467*4d6fc14bSjoerg          -DLIBCXX_CXX_ABI=libcxxabi \
468*4d6fc14bSjoerg          -DLIBCXX_CXX_ABI_INCLUDE_PATHS="${MONOREPO_ROOT}/libcxxabi/include" \
469*4d6fc14bSjoerg          -DLIBCXX_CXX_ABI_LIBRARY_PATH="${BUILD_DIR}/libcxxabi/lib"
470*4d6fc14bSjoerg
471*4d6fc14bSjoerg    ${CMAKE} \
472*4d6fc14bSjoerg          -S "${MONOREPO_ROOT}/libcxxabi" \
473*4d6fc14bSjoerg          -B "${BUILD_DIR}/libcxxabi" \
474*4d6fc14bSjoerg          -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \
475*4d6fc14bSjoerg          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
476*4d6fc14bSjoerg          -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
477*4d6fc14bSjoerg          -DLLVM_PATH="${MONOREPO_ROOT}/llvm" \
478*4d6fc14bSjoerg          -DLIBCXXABI_LIBCXX_PATH="${MONOREPO_ROOT}/libcxx" \
479*4d6fc14bSjoerg          -DLIBCXXABI_LIBCXX_INCLUDES="${BUILD_DIR}/libcxx/include/c++/v1" \
480*4d6fc14bSjoerg          -DLIBCXXABI_LIBCXX_LIBRARY_PATH="${BUILD_DIR}/libcxx/lib"
481*4d6fc14bSjoerg
482*4d6fc14bSjoerg    echo "+++ Generating libc++ headers"
483*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}/libcxx" generate-cxx-headers
484*4d6fc14bSjoerg
485*4d6fc14bSjoerg    echo "+++ Building libc++abi"
486*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}/libcxxabi" cxxabi
487*4d6fc14bSjoerg
488*4d6fc14bSjoerg    echo "+++ Building libc++"
489*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}/libcxx" cxx
490*4d6fc14bSjoerg
491*4d6fc14bSjoerg    echo "+++ Running the libc++ tests"
492*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}/libcxx" check-cxx
493*4d6fc14bSjoerg
494*4d6fc14bSjoerg    echo "+++ Running the libc++abi tests"
495*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}/libcxxabi" check-cxxabi
496*4d6fc14bSjoerg;;
497*4d6fc14bSjoergaarch64)
498*4d6fc14bSjoerg    clean
499*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/AArch64.cmake"
500*4d6fc14bSjoerg    check-cxx-cxxabi
501*4d6fc14bSjoerg;;
502*4d6fc14bSjoergaarch64-noexceptions)
503*4d6fc14bSjoerg    clean
504*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/AArch64.cmake" \
505*4d6fc14bSjoerg    -DLIBCXX_ENABLE_EXCEPTIONS=OFF \
506*4d6fc14bSjoerg    -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF
507*4d6fc14bSjoerg    check-cxx-cxxabi
508*4d6fc14bSjoerg;;
509*4d6fc14bSjoerg# Aka Armv8 32 bit
510*4d6fc14bSjoergarmv8)
511*4d6fc14bSjoerg    clean
512*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv8Arm.cmake"
513*4d6fc14bSjoerg    check-cxx-cxxabi
514*4d6fc14bSjoerg;;
515*4d6fc14bSjoergarmv8-noexceptions)
516*4d6fc14bSjoerg    clean
517*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv8Thumb-noexceptions.cmake"
518*4d6fc14bSjoerg    check-cxx-cxxabi
519*4d6fc14bSjoerg;;
520*4d6fc14bSjoerg# Armv7 32 bit. One building Arm only one Thumb only code.
521*4d6fc14bSjoergarmv7)
522*4d6fc14bSjoerg    clean
523*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv7Arm.cmake"
524*4d6fc14bSjoerg    check-cxx-cxxabi
525*4d6fc14bSjoerg;;
526*4d6fc14bSjoergarmv7-noexceptions)
527*4d6fc14bSjoerg    clean
528*4d6fc14bSjoerg    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv7Thumb-noexceptions.cmake"
529*4d6fc14bSjoerg    check-cxx-cxxabi
530*4d6fc14bSjoerg;;
531*4d6fc14bSjoergwindows-dll)
532*4d6fc14bSjoerg    clean
533*4d6fc14bSjoerg    # TODO: Currently, building with the experimental library breaks running
534*4d6fc14bSjoerg    # tests (the test linking look for the c++experimental library with the
535*4d6fc14bSjoerg    # wrong name, and the statically linked c++experimental can't be linked
536*4d6fc14bSjoerg    # correctly when libc++ visibility attributes indicate dllimport linkage
537*4d6fc14bSjoerg    # anyway), thus just disable the experimental library. Remove this
538*4d6fc14bSjoerg    # setting when cmake and the test driver does the right thing automatically.
539*4d6fc14bSjoerg    generate-cmake-libcxx-win -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF
540*4d6fc14bSjoerg    echo "+++ Running the libc++ tests"
541*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}" check-cxx
542*4d6fc14bSjoerg;;
543*4d6fc14bSjoergwindows-static)
544*4d6fc14bSjoerg    clean
545*4d6fc14bSjoerg    generate-cmake-libcxx-win -DLIBCXX_ENABLE_SHARED=OFF
546*4d6fc14bSjoerg    echo "+++ Running the libc++ tests"
547*4d6fc14bSjoerg    ${NINJA} -vC "${BUILD_DIR}" check-cxx
548*4d6fc14bSjoerg;;
549*4d6fc14bSjoerg*)
550*4d6fc14bSjoerg    echo "${BUILDER} is not a known configuration"
551*4d6fc14bSjoerg    exit 1
552*4d6fc14bSjoerg;;
553*4d6fc14bSjoergesac
554