| #!/bin/bash |
| #------------------------------------------------------------------------------------------------------- |
| # Copyright (C) Microsoft. All rights reserved. |
| # Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| #------------------------------------------------------------------------------------------------------- |
| |
| LLVM_VERSION="5.0.0" |
| DEFAULT_COLOR='\033[0m' |
| ERROR_COLOR='\033[0;31m' |
| GREEN_COLOR='\033[0;32m' |
| |
| CC_URL="git://sourceware.org/git/binutils-gdb.git\nhttp://llvm.org/releases/${LLVM_VERSION}/\n" |
| |
| if [[ $1 == '-y' || $1 == '-Y' ]]; then |
| ALWAYS_YES=1 |
| fi |
| |
| WARN_LICENSE () { |
| echo -e "${ERROR_COLOR}" |
| echo -e "----------------------------------------------------------------" |
| echo -e "${DEFAULT_COLOR}" |
| echo -e "This script will download LLVM/CLANG and LLVM Gold Bintools from\n${CC_URL}\n" |
| echo "These software are licensed to you by its publisher(s), not Microsoft." |
| echo "Microsoft is not responsible for the software." |
| echo "Your installation and use of the software is subject to the publisher's terms available here:" |
| echo -e "http://llvm.org/docs/DeveloperPolicy.html#license\nhttp://llvm.org/docs/GoldPlugin.html#licensing" |
| echo -e "${ERROR_COLOR}" |
| echo -e "----------------------------------------------------------------\n" |
| echo -e "${GREEN_COLOR}If you don't agree, press Ctrl+C to terminate${DEFAULT_COLOR}" |
| WAIT_QUESTION="Hit ENTER to continue (or wait 20 seconds)" |
| if [[ $ALWAYS_YES == 1 ]]; then |
| echo "$WAIT_QUESTION : Y" |
| else |
| read -t 20 -p "$WAIT_QUESTION" |
| fi |
| |
| echo -e "\nWell, this will take some time... [and free memory 2GB+]\n" |
| } |
| |
| WARN_PACKAGE () { |
| echo -e "\n${GREEN_COLOR}" |
| echo -e "----------------------------------------------------------------${DEFAULT_COLOR}" |
| echo "This script requires (texinfo texi2html csh gawk automake libtool libtool-bin bison flex ncurses-devel)" |
| echo "Automated installation of these requirements is supported with apt-get and yum only." |
| echo "" |
| echo "If you don't have these packages are installed, press Ctrl+C to terminate" |
| echo -e "${GREEN_COLOR}----------------------------------------------------------------" |
| echo -e "${DEFAULT_COLOR}" |
| WAIT_QUESTION="Hit ENTER to continue (or wait 20 seconds)" |
| if [[ $ALWAYS_YES == 1 ]]; then |
| echo "$WAIT_QUESTION : Y" |
| else |
| read -t 20 -p "$WAIT_QUESTION" |
| fi |
| } |
| |
| DOWNLOAD_HELPER() { |
| WGET_CTR=1 |
| while [ 1 ]; do |
| wget --no-dns-cache --tries=3 --retry-connrefused --waitretry=3 $1 >/dev/null 2>&1 |
| if [[ $? == 0 ]]; then |
| break; |
| else |
| if [[ $WGET_CTR == 3 ]]; then |
| echo "Failed to download $1" |
| exit 1 |
| fi |
| WGET_CTR=$(($WGET_CTR + 1)) |
| echo "${WGET_CTR}. try...." |
| fi |
| done; |
| } |
| |
| ROOT=${PWD}/cc-toolchain/ |
| GOLD_PLUGIN="" |
| |
| if [ ! -d ./cc-toolchain/src/llvm/projects/compiler-rt ]; then |
| rm -rf cc-toolchain |
| mkdir cc-toolchain |
| cd cc-toolchain |
| mkdir src |
| mkdir bin |
| cd src |
| |
| if [[ "$OSTYPE" =~ "darwin" ]]; then # osx |
| echo "This script is not prepared for OSX" |
| exit 0 |
| else |
| WARN_LICENSE |
| |
| apt-get -v >/dev/null 2>&1 |
| if [ $? == 0 ]; then # debian |
| apt-get install -y apt-file texinfo texi2html csh gawk automake libtool \ |
| libtool-bin bison flex libncurses5-dev |
| if [ $? != 0 ]; then |
| WARN_PACKAGE |
| fi |
| else |
| yum -v >/dev/null 2>&1 |
| if [ $? == 0 ]; then # redhat |
| yum install -y texinfo texi2html csh gawk automake libtool libtool-bin bison flex ncurses-devel |
| else |
| WARN_PACKAGE |
| fi |
| fi |
| fi |
| |
| mkdir lto_utils |
| cd lto_utils |
| echo "Downloading LLVM Gold Plugin" |
| git clone --depth 1 git://sourceware.org/git/binutils-gdb.git binutils >/dev/null 2>&1 |
| mkdir binutils_compile; cd binutils_compile |
| LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${ROOT}/build/lib/" |
| ../binutils/configure --enable-gold --enable-plugins --disable-werror --prefix="${ROOT}/build" |
| make -j4 |
| make install |
| if [ $? != 0 ]; then |
| exit 1 |
| fi |
| |
| echo -e "\n\n\n\n" |
| cd "${ROOT}/src/" |
| |
| echo "Downloading LLVM ${LLVM_VERSION}" |
| DOWNLOAD_HELPER "http://llvm.org/releases/${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz" |
| |
| tar xf "llvm-${LLVM_VERSION}.src.tar.xz" |
| if [ $? == 0 ]; then |
| rm "llvm-${LLVM_VERSION}.src.tar.xz" |
| mv "llvm-${LLVM_VERSION}.src" llvm |
| else |
| exit 1 |
| fi |
| |
| cd llvm/tools/ |
| echo "Downloading Clang ${LLVM_VERSION}" |
| DOWNLOAD_HELPER "http://llvm.org/releases/${LLVM_VERSION}/cfe-${LLVM_VERSION}.src.tar.xz" |
| |
| tar xf "cfe-${LLVM_VERSION}.src.tar.xz" |
| if [ $? == 0 ]; then |
| mv "cfe-${LLVM_VERSION}.src" clang |
| rm "cfe-${LLVM_VERSION}.src.tar.xz" |
| else |
| exit 1 |
| fi |
| |
| mkdir -p ../projects/ |
| cd ../projects/ |
| echo "Downloading Compiler-RT ${LLVM_VERSION}" |
| DOWNLOAD_HELPER "http://llvm.org/releases/${LLVM_VERSION}/compiler-rt-${LLVM_VERSION}.src.tar.xz" |
| |
| tar xf "compiler-rt-${LLVM_VERSION}.src.tar.xz" |
| if [ $? == 0 ]; then |
| mv "compiler-rt-${LLVM_VERSION}.src" compiler-rt |
| rm "compiler-rt-${LLVM_VERSION}.src.tar.xz" |
| else |
| exit 1 |
| fi |
| fi |
| |
| GOLD_PLUGIN=-DLLVM_BINUTILS_INCDIR="${ROOT}/src/lto_utils/binutils/include" |
| |
| mkdir -p "${ROOT}/build" |
| cd "${ROOT}/src/llvm" |
| mkdir -p build_ |
| cd build_ |
| |
| cmake ../ -DCMAKE_INSTALL_PREFIX="${ROOT}/build" -DCMAKE_BUILD_TYPE=Release ${GOLD_PLUGIN} |
| |
| if [ $? != 0 ]; then |
| cd .. |
| rm -rf build_ |
| mkdir build_ |
| exit 1 |
| fi |
| |
| make -j4 install |
| |
| if [ $? == 0 ]; then |
| echo -e "Done!\n./build.sh args are given below;\n\n" |
| # Create a local bfd-plugins and copy LLVMgold.so into there. |
| mkdir -p "${ROOT}/build/lib/bfd-plugins/" |
| cp "${ROOT}/build/lib/LLVMgold.so" "${ROOT}/build/lib/bfd-plugins/" |
| echo "--cxx=${ROOT}/build/bin/clang++ --cc=${ROOT}/build/bin/clang" |
| fi |