install_libcxx.sh (3721B)
1 #!/usr/bin/env bash 2 3 TRUNK_VERSION="12.0.0" 4 5 set -e 6 7 # The pattern of clang --version is: clang version X.Y.Z (sometimes, see below). 8 COMPILER_VERSION_OUTPUT="$($CXX --version)" 9 arr=(${COMPILER_VERSION_OUTPUT// / }) 10 11 COMPILER="${arr[0]}" 12 VERSION="${arr[2]}" 13 14 case $COMPILER in 15 "clang") 16 # Some Ubuntu clang builds are advertised as "just clang", but the 17 # Version still follows the pattern: 3.6.2-svn240577-1~exp1 18 # echo "Compiler is clang :)" 19 arr2=(${VERSION//-/ }) 20 VERSION="${arr2[0]}" 21 ;; 22 "Ubuntu") 23 # Ubuntu renames _some_ (not all) of its clang compilers, the pattern of 24 # clang --version is then: 25 # Ubuntu clang version 3.6.2-svn240577-1~exp1 26 COMPILER="${arr[1]}" 27 VERSION="${arr[3]}" 28 arr2=(${VERSION//-/ }) 29 VERSION="${arr2[0]}" 30 ;; 31 *) 32 echo "case did not match: compiler: ${COMPILER}" 33 exit 1 34 ;; 35 esac 36 37 if [ ${COMPILER} != "clang" ]; then 38 echo "Error: trying to install libc++ for a compiler that is not clang: ${COMPILER}" 39 exit 1 40 fi 41 42 if [ -z ${VERSION+x} ]; then 43 echo "Malformed libc++ version - I give up." 44 exit 4 45 fi 46 47 MAJOR=$(echo $VERSION | sed 's/\..*//') 48 if [ ${VERSION} == $TRUNK_VERSION ]; then 49 echo "Fetching libc++ and libc++abi tip-of-trunk..." 50 51 # Checkout LLVM sources 52 git clone --depth=1 https://github.com/llvm-mirror/llvm.git llvm-source 53 git clone --depth=1 https://github.com/llvm-mirror/libcxx.git llvm-source/projects/libcxx 54 git clone --depth=1 https://github.com/llvm-mirror/libcxxabi.git llvm-source/projects/libcxxabi 55 else 56 echo "Fetching libc++/libc++abi version: ${VERSION}..." 57 if [ ${MAJOR} -ge 8 ]; then 58 BASE_URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-" 59 else 60 BASE_URL="https://releases.llvm.org/" 61 fi 62 LLVM_URL="${BASE_URL}${VERSION}/llvm-${VERSION}.src.tar.xz" 63 LIBCXX_URL="${BASE_URL}${VERSION}/libcxx-${VERSION}.src.tar.xz" 64 LIBCXXABI_URL="${BASE_URL}${VERSION}/libcxxabi-${VERSION}.src.tar.xz" 65 echo wget $LLVM_URL 66 echo wget $LIBCXX_URL 67 echo wget $LIBCXXABI_URL 68 wget $LLVM_URL 69 wget $LIBCXX_URL 70 wget $LIBCXXABI_URL 71 mkdir llvm-source 72 mkdir llvm-source/projects 73 mkdir llvm-source/projects/libcxx 74 mkdir llvm-source/projects/libcxxabi 75 76 tar -xf llvm-${VERSION}.src.tar.xz -C llvm-source --strip-components=1 77 tar -xf libcxx-${VERSION}.src.tar.xz -C llvm-source/projects/libcxx --strip-components=1 78 tar -xf libcxxabi-${VERSION}.src.tar.xz -C llvm-source/projects/libcxxabi --strip-components=1 79 fi 80 81 TARGET=`pwd`/llvm 82 mkdir "${TARGET}" 83 mkdir llvm-build 84 cd llvm-build 85 86 # - libc++ versions < 4.x do not have the install-cxxabi and install-cxx targets 87 # - only ASAN is enabled for clang/libc++ versions < 4.x 88 if [[ $VERSION == *"3."* ]]; then 89 cmake -DCMAKE_C_COMPILER=${CC} -DCMAKE_CXX_COMPILER=${CXX} \ 90 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="${TARGET}" \ 91 ../llvm-source 92 if [[ $SANITIZER == "Address;Undefined" ]]; then 93 ASAN_FLAGS="-fsanitize=address" 94 cmake -DCMAKE_CXX_FLAGS="${ASAN_FLAGS}" -DCMAKE_EXE_LINKER_FLAGS="${ASAN_FLAGS}" ../llvm-source 95 fi 96 make cxx -j4 VERBOSE=1 97 mkdir "${TARGET}/lib" 98 mkdir "${TARGET}/include" 99 cp -r lib/* "${TARGET}/lib" 100 cp -r include/c++ "${TARGET}/include" 101 else 102 cmake -DCMAKE_C_COMPILER=${CC} -DCMAKE_CXX_COMPILER=${CXX} \ 103 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="${TARGET}" \ 104 -DLIBCXX_ABI_UNSTABLE=ON \ 105 -DLLVM_USE_SANITIZER=${SANITIZER} \ 106 ../llvm-source 107 make cxx -j4 VERBOSE=1 108 make install-cxxabi install-cxx 109 fi 110 111 exit 0