Skip to content

Instantly share code, notes, and snippets.

@doubleotoo
Created June 25, 2013 21:53
Show Gist options
  • Save doubleotoo/5862801 to your computer and use it in GitHub Desktop.
Save doubleotoo/5862801 to your computer and use it in GitHub Desktop.
#!/bin/bash -e
#
# Usage: ./install-llvm-clang.sh <version: x.x>
#-------------------------------------------------------------------------------
# Default values
#-------------------------------------------------------------------------------
: ${LLVM_CLANG_VERSION:=$1}
: ${GCC_HOME:=}
if [ -z "${GCC_HOME}" ]; then
echo "[FATAL] \$GCC_HOME is not set"
exit 1
fi
GCC_VERSION="$(gcc -dumpversion)"
echo "[INFO] LLVM-Clang '$LLVM_CLANG_VERSION'"
echo "[INFO] GCC '$GCC_VERSION'"
: ${DESTDIR:=$(pwd)}
: ${PREFIX:=${DESTDIR}/${LLVM_CLANG_VERSION}/gcc/${GCC_VERSION}}
: ${WORKSPACE:=${PREFIX}/workspace}
: ${BUILDDIR:=${WORKSPACE}/build}
#-------------------------------------------------------------------------------
# Sanity Checks
#-------------------------------------------------------------------------------
if [ -z "${LLVM_CLANG_VERSION}" ]; then
echo "Usage: $0 <version: x.x>"
exit 1
fi
#-------------------------------------------------------------------------------
# Meta Information
#-------------------------------------------------------------------------------
LLVM_SRCDIR="${WORKSPACE}/llvm-${LLVM_CLANG_VERSION}.src"
CLANG_SRCDIR="${LLVM_SRCDIR}/tools/cfe-${LLVM_CLANG_VERSION}.src"
LLVM_TARBALL="llvm-${LLVM_CLANG_VERSION}.src.tar.gz"
CLANG_TARBALL="cfe-${LLVM_CLANG_VERSION}.src.tar.gz"
LLVM_DOWNLOAD_URL="http://llvm.org/releases/${LLVM_CLANG_VERSION}/${LLVM_TARBALL}"
CLANG_DOWNLOAD_URL="http://llvm.org/releases/${LLVM_CLANG_VERSION}/${CLANG_TARBALL}"
#-------------------------------------------------------------------------------
# Workspace
#-------------------------------------------------------------------------------
mkdir -p "${WORKSPACE}" || exit 1
pushd "${WORKSPACE}" || exit 1
#-------------------------------------------------------------------------------
# [LLVM] Download and unpack
#-------------------------------------------------------------------------------
if [ ! -f "$LLVM_TARBALL" ]; then
echo "[INFO] Downloading LLVM '$LLVM_DOWNLOAD_URL'"
wget --no-check-certificate "$LLVM_DOWNLOAD_URL" || exit 1
else
echo "[INFO] [SKIP] LLVM tarball already exists: '$LLVM_TARBALL'"
fi
if [ ! -d "$LLVM_SRCDIR" ]; then
echo "[INFO] Unpacking LLVM tarball: '$LLVM_TARBALL'"
tar xvzf "$LLVM_TARBALL" || exit 1
else
echo "[INFO] [SKIP] LLVM source code already exists: '$LLVM_SRCDIR'"
fi
#-------------------------------------------------------------------------------
# [Clang] Download and unpack
#-------------------------------------------------------------------------------
cd "${LLVM_SRCDIR}/tools/"
if [ ! -f "$CLANG_TARBALL" ]; then
echo "[INFO] Downloading Clang '$CLANG_DOWNLOAD_URL'"
wget --no-check-certificate "$CLANG_DOWNLOAD_URL" || exit 1
else
echo "[INFO] [SKIP] Clang tarball already exists: '$CLANG_TARBALL'"
fi
if [ ! -d "$CLANG_SRCDIR" ]; then
echo "[INFO] Unpacking Clang tarball: '$CLANG_TARBALL'"
tar xvzf "$CLANG_TARBALL" || exit 1
mv "$CLANG_SRCDIR" clang || exit 1
else
echo "[INFO] [SKIP] Clang source code already exists: '$CLANG_SRCDIR'"
fi
#-------------------------------------------------------------------------------
# Build and install
#-------------------------------------------------------------------------------
cd "${LLVM_SRCDIR}"
mkdir -p "${BUILDDIR}" || exit 1
pushd "${BUILDDIR}" || exit 1
if [ ! -e "${PREFIX}/bin" ]; then
echo "[INFO] Configuring LLVM-Clang"
echo "[INFO] Installing to '$PREFIX'"
echo "[INFO] \$GCC_HOME='${GCC_HOME}'"
"${LLVM_SRCDIR}/configure" --prefix="$PREFIX" || exit 1
# Required by Clang-to-ROSE interface
export REQUIRES_RTTI=1
make -j || exit 1
make -j install || exit 1
if [ "$(uname --machine)" = "x86_64" ]; then
export LIBDIR="lib64"
else
export LIBDIR="lib"
fi
echo "[INFO] Creating LLVM-Clang environment setup file"
cat > "${PREFIX}/setup.sh" <<-EOF
#!/bin/bash
#
# Automatically generated by $0 on $(date)
export LLVM_HOME="${PREFIX}"
# llvm-config is used to setup \$LD_LIBRARY_PATH
export PATH="\${LLVM_HOME}/bin:\${PATH}"
# GCC ${GCC_VERSION}
export GCC_HOME="${GCC_HOME}"
export PATH="\${GCC_HOME}/bin:\${PATH}"
export LD_LIBRARY_PATH="\${GCC_HOME}/${LIBDIR}:\${LD_LIBRARY_PATH}"
export GMP_HOME="${GMP_HOME}"
export LD_LIBRARY_PATH="\${GMP_HOME}/lib:\${LD_LIBRARY_PATH}"
export MPC_HOME="${MPC_HOME}"
export LD_LIBRARY_PATH="\${MPC_HOME}/lib:\${LD_LIBRARY_PATH}"
export MPFR_HOME="${MPFR_HOME}"
export LD_LIBRARY_PATH="\${MPFR_HOME}/lib:\${LD_LIBRARY_PATH}"
EOF
#-----------------------------------------------
# Set Permissions
#-----------------------------------------------
chmod -R g+r "${PREFIX}"
chmod -R g+x "${PREFIX}/bin"
find "${PREFIX}" -type d -exec chmod g+x {} \;
echo "[INFO] Successfully installed LLVM-Clang version '${LLVM_CLANG_VERSION}'"
echo "[INFO] \$GCC_HOME='${GCC_HOME}'"
echo "[INFO] \$PREFIX='${PREFIX}'"
else
echo "[INFO] [SKIP] Installation already exists in '$PREFIX'"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment