brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.1 KiB · eb55bcc Raw
199 lines · bash
1#!/usr/bin/env bash2# ===----------------------------------------------------------------------===##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-exception7#8# ===----------------------------------------------------------------------===##9 10set -e11 12PROGNAME="$(basename "${0}")"13 14function error() { printf "error: %s\n" "$*"; exit 1; }15 16function usage() {17cat <<EOF18Usage:19${PROGNAME} [options]20 21[-h|--help]                  Display this help and exit.22 23--llvm-root <DIR>            Path to the root of the LLVM monorepo. Only the libcxx24                             and libcxxabi directories are required.25 26--build-dir <DIR>            Path to the directory to use for building. This will27                             contain intermediate build products.28 29--install-dir <DIR>          Path to the directory to install the library to.30 31--symbols-dir <DIR>          Path to the directory to install the .dSYM bundle to.32 33--architectures "<arch>..."  A whitespace separated list of architectures to build for.34                             The library will be built for each architecture independently,35                             and a universal binary containing all architectures will be36                             created from that.37 38--headers-only               Only install the header part of the library -- don't actually39                             build the full library.40 41--version X[.Y[.Z]]          The version of the library to encode in the dylib.42EOF43}44 45while [[ $# -gt 0 ]]; do46    case ${1} in47        -h|--help)48            usage49            exit 050            ;;51        --llvm-root)52            llvm_root="${2}"53            shift; shift54            ;;55        --build-dir)56            build_dir="${2}"57            shift; shift58            ;;59        --symbols-dir)60            symbols_dir="${2}"61            shift; shift62            ;;63        --install-dir)64            install_dir="${2}"65            shift; shift66            ;;67        --architectures)68            architectures="${2}"69            shift; shift70            ;;71        --headers-only)72            headers_only=true73            shift74            ;;75        --version)76            version="${2}"77            shift; shift78            ;;79        *)80            error "Unknown argument '${1}'"81            ;;82    esac83done84 85for arg in llvm_root build_dir symbols_dir install_dir architectures version; do86    if [ -z ${!arg+x} ]; then87        error "Missing required argument '--${arg//_/-}'"88    elif [ "${!arg}" == "" ]; then89        error "Argument to --${arg//_/-} must not be empty"90    fi91done92 93# Allow using relative paths94function realpath() {95    if [[ $1 = /* ]]; then echo "$1"; else echo "$(pwd)/${1#./}"; fi96}97for arg in llvm_root build_dir symbols_dir install_dir; do98    path="$(realpath "${!arg}")"99    eval "${arg}=\"${path}\""100done101 102function step() {103    separator="$(printf "%0.s-" $(seq 1 ${#1}))"104    echo105    echo "${separator}"106    echo "${1}"107    echo "${separator}"108}109 110for arch in ${architectures}; do111    # Construct the target-triple that we're testing for. Otherwise, the target triple is currently detected112    # as <arch>-apple-darwin<version> instead of <arch>-apple-macosx<version>, which trips up the test suite.113    # TODO: This shouldn't be necessary anymore if `clang -print-target-triple` behaved properly, see https://llvm.org/PR61762.114    #       Then LLVM would guess the LLVM_DEFAULT_TARGET_TRIPLE properly and we wouldn't have to specify it.115    target=$(xcrun clang -arch ${arch} -xc - -### 2>&1 | grep --only-matching -E '"-triple" ".+?"' | grep --only-matching -E '"[^ ]+-apple-[^ ]+?"' | tr -d '"')116 117    mkdir -p "${build_dir}/${arch}"118 119    step "Building shims to make libc++ compatible with the system libc++ on Apple platforms when running the tests"120    shims_library="${build_dir}/${arch}/apple-system-shims.a"121    # Note that this doesn't need to match the Standard version used to build the rest of the library.122    # Also note that we explicitly enable sized deallocation when building the shims to ensure that we provide as123    # many symbols as possible.124    xcrun clang++ -c -std=c++2b -fsized-deallocation -target ${target} "${llvm_root}/libcxxabi/src/vendor/apple/shims.cpp" -static -o "${shims_library}"125 126    step "Building libc++.dylib and libc++abi.dylib for architecture ${arch}"127    xcrun cmake -S "${llvm_root}/runtimes" \128                -B "${build_dir}/${arch}" \129                -GNinja \130                -DCMAKE_MAKE_PROGRAM="$(xcrun --find ninja)" \131                -C "${llvm_root}/libcxx/cmake/caches/Apple.cmake" \132                -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \133                -DCMAKE_INSTALL_PREFIX="${build_dir}/${arch}-install" \134                -DCMAKE_OSX_ARCHITECTURES="${arch}" \135                -DLIBCXXABI_LIBRARY_VERSION="${version}" \136                -DLIBCXX_LIBRARY_VERSION="${version}" \137                -DLIBCXX_TEST_PARAMS="target_triple=${target};apple_system_shims=${shims_library}" \138                -DLIBCXXABI_TEST_PARAMS="target_triple=${target};apple_system_shims=${shims_library}" \139                -DLIBUNWIND_TEST_PARAMS="target_triple=${target};apple_system_shims=${shims_library}"140 141    if [ "$headers_only" = true ]; then142        xcrun cmake --build "${build_dir}/${arch}" --target install-cxx-headers install-cxxabi-headers -- -v143    else144        xcrun cmake --build "${build_dir}/${arch}" --target install-cxx install-cxxabi -- -v145    fi146done147 148function universal_dylib() {149    dylib=${1}150 151    inputs=$(for arch in ${architectures}; do echo "${build_dir}/${arch}-install/lib/${dylib}"; done)152 153    step "Creating a universal dylib ${dylib} from the dylibs for all architectures"154    xcrun lipo -create ${inputs} -output "${build_dir}/${dylib}"155 156    step "Installing the (stripped) universal dylib to ${install_dir}/usr/lib"157    mkdir -p "${install_dir}/usr/lib"158    cp "${build_dir}/${dylib}" "${install_dir}/usr/lib/${dylib}"159    xcrun strip -S "${install_dir}/usr/lib/${dylib}"160 161    step "Installing the unstripped dylib and the dSYM bundle to ${symbols_dir}"162    xcrun dsymutil "${build_dir}/${dylib}" -o "${symbols_dir}/${dylib}.dSYM"163    cp "${build_dir}/${dylib}" "${symbols_dir}/${dylib}"164}165 166if [ "$headers_only" != true ]; then167    universal_dylib libc++.1.dylib168    universal_dylib libc++abi.dylib169    (cd "${install_dir}/usr/lib" && ln -s "libc++.1.dylib" libc++.dylib)170 171    experimental_libs=$(for arch in ${architectures}; do echo "${build_dir}/${arch}-install/lib/libc++experimental.a"; done)172    xcrun lipo -create ${experimental_libs} -output "${install_dir}/usr/lib/libc++experimental.a"173fi174 175# Install the headers by copying the headers from one of the built architectures176# into the install directory. Headers from all architectures should be the same.177step "Installing the libc++ and libc++abi headers to ${install_dir}/usr/include"178any_arch=$(echo ${architectures} | cut -d ' ' -f 1)179mkdir -p "${install_dir}/usr/include"180ditto "${build_dir}/${any_arch}-install/include" "${install_dir}/usr/include"181if [[ $EUID -eq 0 ]]; then # Only chown if we're running as root182    chown -R root:wheel "${install_dir}/usr/include"183fi184 185if [ "$headers_only" != true ]; then186    step "Installing the libc++ and libc++abi licenses"187    mkdir -p "${install_dir}/usr/local/OpenSourceLicenses"188    cp "${llvm_root}/libcxx/LICENSE.TXT" "${install_dir}/usr/local/OpenSourceLicenses/libcxx.txt"189    cp "${llvm_root}/libcxxabi/LICENSE.TXT" "${install_dir}/usr/local/OpenSourceLicenses/libcxxabi.txt"190 191    # Also install universal static archives for libc++ and libc++abi192    libcxx_archives=$(for arch in ${architectures}; do echo "${build_dir}/${arch}-install/lib/libc++.a"; done)193    libcxxabi_archives=$(for arch in ${architectures}; do echo "${build_dir}/${arch}-install/lib/libc++abi.a"; done)194    step "Creating universal static archives for libc++ and libc++abi from the static archives for each architecture"195    mkdir -p "${install_dir}/usr/local/lib/libcxx"196    xcrun libtool -static ${libcxx_archives} -o "${install_dir}/usr/local/lib/libcxx/libc++-static.a"197    xcrun libtool -static ${libcxxabi_archives} -o "${install_dir}/usr/local/lib/libcxx/libc++abi-static.a"198fi199