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