1#!/usr/bin/env bash 2# ===----------------------------------------------------------------------===## 3# 4# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5# See https://llvm.org/LICENSE.txt for license information. 6# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7# 8# ===----------------------------------------------------------------------===## 9 10set -e 11set -o pipefail 12unset LANG 13unset LC_ALL 14unset LC_COLLATE 15 16PROGNAME="$(basename "${0}")" 17 18function usage() { 19cat <<EOF 20Usage: 21${PROGNAME} [options] <BUILDER> 22 23[-h|--help] Display this help and exit. 24 25--llvm-root <DIR> Path to the root of the LLVM monorepo. By default, we try 26 to figure it out based on the current working directory. 27 28--build-dir <DIR> The directory to use for building the library. By default, 29 this is '<llvm-root>/build/<builder>'. 30 31Environment variables 32CC The C compiler to use, this value is used by CMake. This 33 variable is optional. 34 35CXX The C++ compiler to use, this value is used by CMake. This 36 variable is optional. 37 38CMAKE The CMake binary to use. This variable is optional. 39 40CLANG_FORMAT The clang-format binary to use when generating the format 41 ignore list. 42 43EOF 44} 45 46if [[ $# == 0 ]]; then 47 usage 48 exit 0 49fi 50 51while [[ $# -gt 0 ]]; do 52 case ${1} in 53 -h|--help) 54 usage 55 exit 0 56 ;; 57 --llvm-root) 58 MONOREPO_ROOT="${2}" 59 shift; shift 60 ;; 61 --build-dir) 62 BUILD_DIR="${2}" 63 shift; shift 64 ;; 65 *) 66 BUILDER="${1}" 67 shift 68 ;; 69 esac 70done 71 72MONOREPO_ROOT="${MONOREPO_ROOT:="$(git rev-parse --show-toplevel)"}" 73BUILD_DIR="${BUILD_DIR:=${MONOREPO_ROOT}/build/${BUILDER}}" 74INSTALL_DIR="${BUILD_DIR}/install" 75 76# If we can find Ninja/CMake provided by Xcode, use those since we know their 77# version will generally work with the Clang shipped in Xcode (e.g. if Clang 78# knows about -std=c++20, the CMake bundled in Xcode will probably know about 79# that flag too). 80if xcrun --find ninja &>/dev/null; then 81 NINJA="$(xcrun --find ninja)" 82elif which ninja &>/dev/null; then 83 # The current implementation of modules needs the absolute path to the ninja 84 # binary. 85 # TODO MODULES Is this still needed when CMake has libc++ module support? 86 NINJA="$(which ninja)" 87else 88 NINJA="ninja" 89fi 90 91if [ -z "${CMAKE}" ]; then 92 if xcrun --find cmake &>/dev/null; then 93 CMAKE="$(xcrun --find cmake)" 94 else 95 CMAKE="cmake" 96 fi 97fi 98 99function step() { 100 endstep 101 set +x 102 if [[ ! -z ${GITHUB_ACTIONS+x} ]]; then 103 echo "::group::$1" 104 export IN_GROUP=1 105 else 106 echo "--- $1" 107 fi 108 set -x 109} 110 111function endstep() { 112 set +x 113 if [[ ! -z ${GITHUB_ACTIONS+x} ]] && [[ ! -z ${IN_GROUP+x} ]]; then 114 echo "::endgroup::" 115 unset IN_GROUP 116 fi 117 set -x 118} 119 120function error() { 121 echo "::error::$1" 122} 123 124function clean() { 125 rm -rf "${BUILD_DIR}" 126} 127 128function generate-cmake-base() { 129 step "Generating CMake" 130 ${CMAKE} \ 131 -S "${MONOREPO_ROOT}/runtimes" \ 132 -B "${BUILD_DIR}" \ 133 -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ 134 -DCMAKE_BUILD_TYPE=RelWithDebInfo \ 135 -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \ 136 -DLIBCXX_ENABLE_WERROR=YES \ 137 -DLIBCXXABI_ENABLE_WERROR=YES \ 138 -DLIBUNWIND_ENABLE_WERROR=YES \ 139 -DLLVM_LIT_ARGS="-sv --xunit-xml-output test-results.xml --timeout=1500 --time-tests" \ 140 "${@}" 141} 142 143function generate-cmake() { 144 generate-cmake-base \ 145 -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \ 146 -DLIBCXX_CXX_ABI=libcxxabi \ 147 "${@}" 148} 149 150function generate-cmake-libcxx-win() { 151 generate-cmake-base \ 152 -DLLVM_ENABLE_RUNTIMES="libcxx" \ 153 -DCMAKE_C_COMPILER=clang-cl \ 154 -DCMAKE_CXX_COMPILER=clang-cl \ 155 "${@}" 156} 157 158function generate-cmake-android() { 159 generate-cmake-base \ 160 -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ 161 -DLIBCXX_CXX_ABI=libcxxabi \ 162 "${@}" 163} 164 165function check-runtimes() { 166 step "Building libc++ test dependencies" 167 ${NINJA} -vC "${BUILD_DIR}" cxx-test-depends 168 169 step "Running the libc++ tests" 170 ${NINJA} -vC "${BUILD_DIR}" check-cxx 171 172 step "Running the libc++abi tests" 173 ${NINJA} -vC "${BUILD_DIR}" check-cxxabi 174 175 step "Running the libunwind tests" 176 ${NINJA} -vC "${BUILD_DIR}" check-unwind 177} 178 179# TODO: The goal is to test this against all configurations. We should also move 180# this to the Lit test suite instead of being a separate CMake target. 181function check-abi-list() { 182 step "Running the libc++ ABI list test" 183 ${NINJA} -vC "${BUILD_DIR}" check-cxx-abilist || ( 184 error "Generating the libc++ ABI list after failed check" 185 ${NINJA} -vC "${BUILD_DIR}" generate-cxx-abilist 186 false 187 ) 188} 189 190function test-armv7m-picolibc() { 191 clean 192 193 # To make it easier to get this builder up and running, build picolibc 194 # from scratch. Anecdotally, the build-picolibc script takes about 16 seconds. 195 # This could be optimised by building picolibc into the Docker container. 196 step "Building picolibc from source" 197 ${MONOREPO_ROOT}/libcxx/utils/ci/build-picolibc.sh \ 198 --build-dir "${BUILD_DIR}" \ 199 --install-dir "${INSTALL_DIR}" \ 200 --target armv7m-none-eabi 201 202 step "Generating CMake for compiler-rt" 203 flags="--sysroot=${INSTALL_DIR}" 204 ${CMAKE} \ 205 -S "${MONOREPO_ROOT}/compiler-rt" \ 206 -B "${BUILD_DIR}/compiler-rt" \ 207 -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ 208 -DCMAKE_BUILD_TYPE=RelWithDebInfo \ 209 -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \ 210 -DCMAKE_C_FLAGS="${flags}" \ 211 -DCMAKE_CXX_FLAGS="${flags}" \ 212 -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON \ 213 "${@}" 214 215 step "Generating CMake for libc++" 216 generate-cmake \ 217 -DLIBCXX_TEST_CONFIG="armv7m-picolibc-libc++.cfg.in" \ 218 -DLIBCXXABI_TEST_CONFIG="armv7m-picolibc-libc++abi.cfg.in" \ 219 -DLIBUNWIND_TEST_CONFIG="armv7m-picolibc-libunwind.cfg.in" \ 220 -DCMAKE_C_FLAGS="${flags}" \ 221 -DCMAKE_CXX_FLAGS="${flags}" \ 222 "${@}" 223 224 step "Installing compiler-rt" 225 ${NINJA} -vC "${BUILD_DIR}/compiler-rt" install 226 227 # Prior to clang 19, armv7m-none-eabi normalised to armv7m-none-unknown-eabi. 228 # clang 19 changed this to armv7m-unknown-none-eabi. So for as long as 18.x 229 # is supported, we have to ask clang what the triple will be. 230 NORMALISED_TARGET_TRIPLE=$(${CC-cc} --target=armv7m-none-eabi -print-target-triple) 231 # Without this step linking fails later in the build. 232 mv "${BUILD_DIR}/install/lib/${NORMALISED_TARGET_TRIPLE}"/* "${BUILD_DIR}/install/lib" 233 234 check-runtimes 235} 236 237# Print the version of a few tools to aid diagnostics in some cases 238step "Diagnose tools in use" 239${CMAKE} --version 240${NINJA} --version 241if [ ! -z "${CXX}" ]; then ${CXX} --version; fi 242 243case "${BUILDER}" in 244check-generated-output) 245 # `! foo` doesn't work properly with `set -e`, use `! foo || false` instead. 246 # https://stackoverflow.com/questions/57681955/set-e-does-not-respect-logical-not 247 clean 248 generate-cmake 249 250 # Reject patches that forgot to re-run the generator scripts. 251 step "Making sure the generator scripts were run" 252 set +x # Printing all the commands below just creates extremely confusing output 253 ${NINJA} -vC "${BUILD_DIR}" libcxx-generate-files 254 git diff | tee ${BUILD_DIR}/generated_output.patch 255 git ls-files -o --exclude-standard | tee ${BUILD_DIR}/generated_output.status 256 ! grep -q '^--- a' ${BUILD_DIR}/generated_output.patch || false 257 if [ -s ${BUILD_DIR}/generated_output.status ]; then 258 echo "It looks like not all the generator scripts were run," 259 echo "did you forget to build the libcxx-generate-files target?" 260 echo "Did you add all new files it generated?" 261 false 262 fi 263 264 # This depends on LC_COLLATE set at the top of this script. 265 step "Reject patches that introduce non-ASCII characters or hard tabs." 266 ! grep -rn '[^ -~]' libcxx/include libcxx/src libcxx/test \ 267 --exclude '*.dat' \ 268 --exclude '*unicode*.cpp' \ 269 --exclude '*print*.sh.cpp' \ 270 --exclude 'escaped_output.*.pass.cpp' \ 271 --exclude 'format_tests.h' \ 272 --exclude 'format.functions.tests.h' \ 273 --exclude 'formatter.*.pass.cpp' \ 274 --exclude 'grep.pass.cpp' \ 275 --exclude 'locale-specific_form.pass.cpp' \ 276 --exclude 'ostream.pass.cpp' \ 277 --exclude 'transcoding.pass.cpp' \ 278 --exclude 'underflow.pass.cpp' \ 279 || false 280;; 281# 282# Various Standard modes 283# 284frozen-cxx03-headers) 285 clean 286 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx03-frozen.cmake" 287 check-runtimes 288 check-abi-list 289;; 290generic-cxx03) 291 clean 292 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx03.cmake" 293 check-runtimes 294 check-abi-list 295;; 296generic-cxx11) 297 clean 298 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx11.cmake" 299 check-runtimes 300 check-abi-list 301;; 302generic-cxx14) 303 clean 304 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx14.cmake" 305 check-runtimes 306 check-abi-list 307;; 308generic-cxx17) 309 clean 310 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx17.cmake" 311 check-runtimes 312 check-abi-list 313;; 314generic-cxx20) 315 clean 316 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx20.cmake" 317 check-runtimes 318 check-abi-list 319;; 320generic-cxx23) 321 clean 322 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx23.cmake" 323 check-runtimes 324 check-abi-list 325;; 326generic-cxx26) 327 clean 328 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx26.cmake" 329 check-runtimes 330 check-abi-list 331;; 332# 333# Other compiler support 334# 335generic-gcc) 336 clean 337 generate-cmake -DLIBCXX_ENABLE_WERROR=NO \ 338 -DLIBCXXABI_ENABLE_WERROR=NO \ 339 -DLIBUNWIND_ENABLE_WERROR=NO 340 check-runtimes 341;; 342generic-gcc-cxx11) 343 clean 344 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-cxx11.cmake" \ 345 -DLIBCXX_ENABLE_WERROR=NO \ 346 -DLIBCXXABI_ENABLE_WERROR=NO \ 347 -DLIBUNWIND_ENABLE_WERROR=NO 348 check-runtimes 349;; 350# 351# Sanitizers 352# 353generic-asan) 354 clean 355 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-asan.cmake" 356 check-runtimes 357;; 358generic-msan) 359 clean 360 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-msan.cmake" 361 check-runtimes 362;; 363generic-tsan) 364 clean 365 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-tsan.cmake" 366 check-runtimes 367;; 368generic-ubsan) 369 clean 370 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-ubsan.cmake" 371 check-runtimes 372;; 373# 374# Various build configurations 375# 376bootstrapping-build) 377 clean 378 379 step "Generating CMake" 380 ${CMAKE} \ 381 -S "${MONOREPO_ROOT}/llvm" \ 382 -B "${BUILD_DIR}" \ 383 -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ 384 -DCMAKE_CXX_COMPILER_LAUNCHER="ccache" \ 385 -DCMAKE_BUILD_TYPE=Release \ 386 -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \ 387 -DLLVM_ENABLE_PROJECTS="clang;lldb" \ 388 -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \ 389 -DLLVM_RUNTIME_TARGETS="$(${CXX} --print-target-triple)" \ 390 -DLLVM_HOST_TRIPLE="$(${CXX} --print-target-triple)" \ 391 -DLLVM_TARGETS_TO_BUILD="host" \ 392 -DRUNTIMES_BUILD_ALLOW_DARWIN=ON \ 393 -DLLVM_ENABLE_ASSERTIONS=ON \ 394 -DLLVM_LIT_ARGS="-sv --xunit-xml-output test-results.xml --timeout=1500 --time-tests" 395 396 step "Running the libc++ and libc++abi tests" 397 ${NINJA} -vC "${BUILD_DIR}" check-runtimes 398 399 step "Installing libc++ and libc++abi to a fake location" 400 ${NINJA} -vC "${BUILD_DIR}" install-runtimes 401 402 step "Running the LLDB libc++ data formatter tests" 403 ${NINJA} -vC "${BUILD_DIR}" lldb-api-test-deps 404 ${BUILD_DIR}/bin/llvm-lit -sv --param dotest-args='--category libc++' "${MONOREPO_ROOT}/lldb/test/API" 405 406 ccache -s 407;; 408generic-static) 409 clean 410 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-static.cmake" 411 check-runtimes 412;; 413generic-merged) 414 clean 415 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-merged.cmake" \ 416 -DLIBCXX_TEST_CONFIG="llvm-libc++-shared.cfg.in" \ 417 -DLIBCXXABI_TEST_CONFIG="llvm-libc++abi-merged.cfg.in" \ 418 -DLIBUNWIND_TEST_CONFIG="llvm-libunwind-merged.cfg.in" 419 check-runtimes 420;; 421generic-hardening-mode-fast) 422 clean 423 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-hardening-mode-fast.cmake" 424 check-runtimes 425 check-abi-list 426;; 427generic-hardening-mode-fast-with-abi-breaks) 428 clean 429 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-hardening-mode-fast-with-abi-breaks.cmake" 430 check-runtimes 431 # Not checking ABI list since we purposefully enable ABI breaking changes 432;; 433generic-hardening-mode-extensive) 434 clean 435 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-hardening-mode-extensive.cmake" 436 check-runtimes 437 check-abi-list 438;; 439generic-hardening-mode-debug) 440 clean 441 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-hardening-mode-debug.cmake" 442 check-runtimes 443 check-abi-list 444;; 445# 446# Module builds 447# 448generic-modules) 449 clean 450 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-modules.cmake" 451 check-runtimes 452 check-abi-list 453;; 454generic-modules-lsv) 455 clean 456 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-modules-lsv.cmake" 457 check-runtimes 458 check-abi-list 459;; 460# 461# Parts removed 462# 463generic-no-threads) 464 clean 465 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-threads.cmake" 466 check-runtimes 467;; 468generic-no-filesystem) 469 clean 470 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-filesystem.cmake" 471 check-runtimes 472;; 473generic-no-random_device) 474 clean 475 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-random_device.cmake" 476 check-runtimes 477;; 478generic-no-localization) 479 clean 480 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-localization.cmake" 481 check-runtimes 482;; 483generic-no-terminal) 484 clean 485 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-terminal.cmake" 486 check-runtimes 487;; 488generic-no-unicode) 489 clean 490 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-unicode.cmake" 491 check-runtimes 492;; 493generic-no-wide-characters) 494 clean 495 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-wide-characters.cmake" 496 check-runtimes 497;; 498generic-no-tzdb) 499 clean 500 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-tzdb.cmake" 501 check-runtimes 502;; 503generic-no-experimental) 504 clean 505 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-experimental.cmake" 506 check-runtimes 507 check-abi-list 508;; 509generic-no-exceptions) 510 clean 511 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-exceptions.cmake" 512 check-runtimes 513 check-abi-list 514;; 515generic-no-rtti) 516 clean 517 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-rtti.cmake" 518 check-runtimes 519;; 520# 521# Other miscellaneous jobs 522# 523generic-abi-unstable) 524 clean 525 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-abi-unstable.cmake" 526 check-runtimes 527;; 528generic-optimized-speed) 529 clean 530 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-optimized-speed.cmake" 531 check-runtimes 532;; 533apple-configuration) 534 clean 535 536 step "Installing libc++ with the Apple system configuration" 537 arch="$(uname -m)" 538 xcrun --sdk macosx \ 539 ${MONOREPO_ROOT}/libcxx/utils/ci/apple-install-libcxx.sh \ 540 --llvm-root ${MONOREPO_ROOT} \ 541 --build-dir ${BUILD_DIR} \ 542 --install-dir ${INSTALL_DIR} \ 543 --symbols-dir "${BUILD_DIR}/symbols" \ 544 --architectures "${arch}" \ 545 --version "999.99" 546 547 step "Running tests against Apple-configured libc++" 548 # TODO: It would be better to run the tests against the fake-installed version of libc++ instead 549 xcrun --sdk macosx ninja -vC "${BUILD_DIR}/${arch}" check-cxx check-cxxabi check-cxx-abilist 550;; 551apple-system-hardened) 552 clean 553 554 arch="$(uname -m)" 555 version="$(sw_vers --productVersion)" 556 params="target_triple=${arch}-apple-macosx${version}" 557 params+=";hardening_mode=fast" 558 559 # In the Apple system configuration, we build libc++ and libunwind separately. 560 step "Installing libc++ and libc++abi in Apple-system configuration" 561 ${CMAKE} \ 562 -S "${MONOREPO_ROOT}/runtimes" \ 563 -B "${BUILD_DIR}/cxx" \ 564 -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ 565 -DCMAKE_BUILD_TYPE=RelWithDebInfo \ 566 -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}/cxx" \ 567 -DLLVM_LIT_ARGS="-sv --xunit-xml-output test-results.xml --timeout=1500 --time-tests" \ 568 -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ 569 -DLIBCXX_CXX_ABI=libcxxabi \ 570 -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Apple.cmake" \ 571 -DLIBCXX_TEST_CONFIG="apple-libc++-system.cfg.in" \ 572 -DLIBCXXABI_TEST_CONFIG="apple-libc++abi-system.cfg.in" \ 573 -DLIBCXX_TEST_PARAMS="${params}" \ 574 -DLIBCXXABI_TEST_PARAMS="${params}" 575 576 step "Installing libunwind in Apple-system configuration" 577 ${CMAKE} \ 578 -S "${MONOREPO_ROOT}/runtimes" \ 579 -B "${BUILD_DIR}/unwind" \ 580 -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ 581 -DCMAKE_BUILD_TYPE=RelWithDebInfo \ 582 -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}/unwind" \ 583 -DLLVM_LIT_ARGS="-sv --xunit-xml-output test-results.xml --timeout=1500 --time-tests" \ 584 -DLLVM_ENABLE_RUNTIMES="libunwind" \ 585 -DLIBUNWIND_TEST_CONFIG="apple-libunwind-system.cfg.in" \ 586 -DLIBUNWIND_TEST_PARAMS="${params}" \ 587 -DCMAKE_INSTALL_NAME_DIR="/usr/lib/system" 588 589 step "Running the libc++ tests" 590 ${NINJA} -vC "${BUILD_DIR}/cxx" check-cxx 591 592 step "Running the libc++abi tests" 593 ${NINJA} -vC "${BUILD_DIR}/cxx" check-cxxabi 594 595 step "Running the libunwind tests" 596 ${NINJA} -vC "${BUILD_DIR}/unwind" check-unwind 597;; 598apple-system) 599 clean 600 601 arch="$(uname -m)" 602 version="$(sw_vers --productVersion)" 603 params="target_triple=${arch}-apple-macosx${version}" 604 605 # In the Apple system configuration, we build libc++ and libunwind separately. 606 step "Installing libc++ and libc++abi in Apple-system configuration" 607 ${CMAKE} \ 608 -S "${MONOREPO_ROOT}/runtimes" \ 609 -B "${BUILD_DIR}/cxx" \ 610 -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ 611 -DCMAKE_BUILD_TYPE=RelWithDebInfo \ 612 -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}/cxx" \ 613 -DLLVM_LIT_ARGS="-sv --xunit-xml-output test-results.xml --timeout=1500 --time-tests" \ 614 -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ 615 -DLIBCXX_CXX_ABI=libcxxabi \ 616 -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Apple.cmake" \ 617 -DLIBCXX_TEST_CONFIG="apple-libc++-system.cfg.in" \ 618 -DLIBCXXABI_TEST_CONFIG="apple-libc++abi-system.cfg.in" \ 619 -DLIBCXX_TEST_PARAMS="${params}" \ 620 -DLIBCXXABI_TEST_PARAMS="${params}" 621 622 step "Installing libunwind in Apple-system configuration" 623 ${CMAKE} \ 624 -S "${MONOREPO_ROOT}/runtimes" \ 625 -B "${BUILD_DIR}/unwind" \ 626 -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ 627 -DCMAKE_BUILD_TYPE=RelWithDebInfo \ 628 -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}/unwind" \ 629 -DLLVM_LIT_ARGS="-sv --xunit-xml-output test-results.xml --timeout=1500 --time-tests" \ 630 -DLLVM_ENABLE_RUNTIMES="libunwind" \ 631 -DLIBUNWIND_TEST_CONFIG="apple-libunwind-system.cfg.in" \ 632 -DLIBUNWIND_TEST_PARAMS="${params}" \ 633 -DCMAKE_INSTALL_NAME_DIR="/usr/lib/system" 634 635 step "Running the libc++ tests" 636 ${NINJA} -vC "${BUILD_DIR}/cxx" check-cxx 637 638 step "Running the libc++abi tests" 639 ${NINJA} -vC "${BUILD_DIR}/cxx" check-cxxabi 640 641 step "Running the libunwind tests" 642 ${NINJA} -vC "${BUILD_DIR}/unwind" check-unwind 643;; 644aarch64) 645 clean 646 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/AArch64.cmake" 647 check-runtimes 648;; 649aarch64-no-exceptions) 650 clean 651 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/AArch64.cmake" \ 652 -DLIBCXX_ENABLE_EXCEPTIONS=OFF \ 653 -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF 654 check-runtimes 655;; 656# Aka Armv8 32 bit 657armv8) 658 clean 659 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv8Arm.cmake" 660 check-runtimes 661;; 662armv8-no-exceptions) 663 clean 664 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv8Thumb-no-exceptions.cmake" 665 check-runtimes 666;; 667# Armv7 32 bit. One building Arm only one Thumb only code. 668armv7) 669 clean 670 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv7Arm.cmake" 671 check-runtimes 672;; 673armv7-no-exceptions) 674 clean 675 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv7Thumb-no-exceptions.cmake" 676 check-runtimes 677;; 678armv7m-picolibc) 679 test-armv7m-picolibc \ 680 -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv7M-picolibc.cmake" 681;; 682armv7m-picolibc-no-exceptions) 683 test-armv7m-picolibc \ 684 -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Armv7M-picolibc.cmake" \ 685 -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF \ 686 -DLIBCXXABI_ENABLE_STATIC_UNWINDER=OFF \ 687 -DLIBCXX_ENABLE_EXCEPTIONS=OFF \ 688 -DLIBCXX_ENABLE_RTTI=OFF 689;; 690clang-cl-dll) 691 clean 692 # TODO: Currently, building with the experimental library breaks running 693 # tests (the test linking look for the c++experimental library with the 694 # wrong name, and the statically linked c++experimental can't be linked 695 # correctly when libc++ visibility attributes indicate dllimport linkage 696 # anyway), thus just disable the experimental library. Remove this 697 # setting when cmake and the test driver does the right thing automatically. 698 generate-cmake-libcxx-win -DLIBCXX_TEST_PARAMS="enable_experimental=False" 699 step "Running the libc++ tests" 700 ${NINJA} -vC "${BUILD_DIR}" check-cxx 701;; 702clang-cl-static) 703 clean 704 generate-cmake-libcxx-win -DLIBCXX_ENABLE_SHARED=OFF 705 step "Running the libc++ tests" 706 ${NINJA} -vC "${BUILD_DIR}" check-cxx 707;; 708clang-cl-no-vcruntime) 709 clean 710 # Building libc++ in the same way as in clang-cl-dll above, but running 711 # tests with -D_HAS_EXCEPTIONS=0, which users might set in certain 712 # translation units while using libc++, even if libc++ is built with 713 # exceptions enabled. 714 generate-cmake-libcxx-win -DLIBCXX_TEST_PARAMS="enable_experimental=False" \ 715 -DLIBCXX_TEST_CONFIG="llvm-libc++-shared-no-vcruntime-clangcl.cfg.in" 716 step "Running the libc++ tests" 717 ${NINJA} -vC "${BUILD_DIR}" check-cxx 718;; 719clang-cl-debug) 720 clean 721 generate-cmake-libcxx-win -DLIBCXX_TEST_PARAMS="enable_experimental=False" \ 722 -DCMAKE_BUILD_TYPE=Debug 723 step "Running the libc++ tests" 724 ${NINJA} -vC "${BUILD_DIR}" check-cxx 725;; 726clang-cl-static-crt) 727 clean 728 # Test linking a static libc++ with the static CRT ("MultiThreaded" denotes 729 # the static CRT, as opposed to "MultiThreadedDLL" which is the default). 730 generate-cmake-libcxx-win -DLIBCXX_ENABLE_SHARED=OFF \ 731 -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded 732 step "Running the libc++ tests" 733 ${NINJA} -vC "${BUILD_DIR}" check-cxx 734;; 735mingw-dll) 736 clean 737 generate-cmake \ 738 -C "${MONOREPO_ROOT}/libcxx/cmake/caches/MinGW.cmake" 739 check-runtimes 740;; 741mingw-static) 742 clean 743 generate-cmake \ 744 -C "${MONOREPO_ROOT}/libcxx/cmake/caches/MinGW.cmake" \ 745 -DLIBCXX_ENABLE_SHARED=OFF \ 746 -DLIBUNWIND_ENABLE_SHARED=OFF 747 check-runtimes 748;; 749mingw-dll-i686) 750 clean 751 generate-cmake \ 752 -DCMAKE_C_COMPILER=i686-w64-mingw32-clang \ 753 -DCMAKE_CXX_COMPILER=i686-w64-mingw32-clang++ \ 754 -C "${MONOREPO_ROOT}/libcxx/cmake/caches/MinGW.cmake" 755 check-runtimes 756;; 757mingw-incomplete-sysroot) 758 # When bringing up a new cross compiler from scratch, we build 759 # libunwind/libcxx in a setup where the toolchain is incomplete and 760 # unable to perform the normal linker checks; this requires a few 761 # special cases in the CMake files. 762 # 763 # Building in an incomplete setup requires setting CMAKE_*_COMPILER_WORKS, 764 # as CMake fails to probe the compiler. This case also requires 765 # setting CMAKE_CXX_COMPILER_TARGET, as LLVM's heuristics for setting 766 # the triple fails when CMake hasn't been able to probe the environment. 767 # (This is what one has to do when building the initial libunwind/libcxx 768 # for a new toolchain.) 769 clean 770 generate-cmake \ 771 -DCMAKE_C_COMPILER_WORKS=TRUE \ 772 -DCMAKE_CXX_COMPILER_WORKS=TRUE \ 773 -DCMAKE_C_COMPILER_TARGET=x86_64-w64-windows-gnu \ 774 -DCMAKE_CXX_COMPILER_TARGET=x86_64-w64-windows-gnu \ 775 -C "${MONOREPO_ROOT}/libcxx/cmake/caches/MinGW.cmake" 776 # Only test that building succeeds; there's not much extra value in running 777 # the tests here, as it would be equivalent to the mingw-dll config above. 778 step "Building the runtimes" 779 ${NINJA} -vC "${BUILD_DIR}" 780;; 781aix) 782 clean 783 generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/AIX.cmake" \ 784 -DLIBCXX_TEST_CONFIG="ibm-libc++-shared.cfg.in" \ 785 -DLIBCXXABI_TEST_CONFIG="ibm-libc++abi-shared.cfg.in" \ 786 -DLIBUNWIND_TEST_CONFIG="ibm-libunwind-shared.cfg.in" 787 check-abi-list 788 check-runtimes 789;; 790android-ndk-*) 791 clean 792 793 ANDROID_EMU_IMG="${BUILDER#android-ndk-}" 794 . "${MONOREPO_ROOT}/libcxx/utils/ci/vendor/android/emulator-functions.sh" 795 if ! validate_emu_img "${ANDROID_EMU_IMG}"; then 796 error "android-ndk suffix must be a valid emulator image (${ANDROID_EMU_IMG})" >&2 797 exit 1 798 fi 799 ARCH=$(arch_of_emu_img ${ANDROID_EMU_IMG}) 800 801 # Use the Android compiler by default. 802 export CC=${CC:-/opt/android/clang/clang-current/bin/clang} 803 export CXX=${CXX:-/opt/android/clang/clang-current/bin/clang++} 804 805 # The NDK libc++_shared.so is always built against the oldest supported API 806 # level. When tests are run against a device with a newer API level, test 807 # programs can be built for any supported API level, but building for the 808 # newest API (i.e. the system image's API) is probably the most interesting. 809 PARAMS="executor=${MONOREPO_ROOT}/libcxx/utils/adb_run.py;target_triple=$(triple_of_arch ${ARCH})$(api_of_emu_img ${ANDROID_EMU_IMG})" 810 generate-cmake-android -C "${MONOREPO_ROOT}/runtimes/cmake/android/Arch-${ARCH}.cmake" \ 811 -C "${MONOREPO_ROOT}/libcxx/cmake/caches/AndroidNDK.cmake" \ 812 -DCMAKE_SYSROOT=/opt/android/ndk/sysroot \ 813 -DLIBCXX_TEST_PARAMS="${PARAMS}" \ 814 -DLIBCXXABI_TEST_PARAMS="${PARAMS}" 815 check-abi-list 816 ${NINJA} -vC "${BUILD_DIR}" install-cxx install-cxxabi 817 818 # Start the emulator and make sure we can connect to the adb server running 819 # inside of it. 820 "${MONOREPO_ROOT}/libcxx/utils/ci/vendor/android/start-emulator.sh" ${ANDROID_EMU_IMG} 821 trap "${MONOREPO_ROOT}/libcxx/utils/ci/vendor/android/stop-emulator.sh" EXIT 822 . "${MONOREPO_ROOT}/libcxx/utils/ci/vendor/android/setup-env-for-emulator.sh" 823 824 # Create adb_run early to avoid concurrent `mkdir -p` of common parent 825 # directories. 826 adb shell mkdir -p /data/local/tmp/adb_run 827 adb push "${BUILD_DIR}/lib/libc++_shared.so" /data/local/tmp/libc++/libc++_shared.so 828 step "Running the libc++ tests" 829 ${NINJA} -vC "${BUILD_DIR}" check-cxx 830 step "Running the libc++abi tests" 831 ${NINJA} -vC "${BUILD_DIR}" check-cxxabi 832;; 833################################################################# 834# Insert vendor-specific internal configurations below. 835# 836# This allows vendors to extend this file with their own internal 837# configurations without running into merge conflicts with upstream. 838################################################################# 839 840################################################################# 841*) 842 echo "${BUILDER} is not a known configuration" 843 exit 1 844;; 845esac 846 847endstep # Make sure we close any still-open output group 848