You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
268 lines
6.5 KiB
268 lines
6.5 KiB
3 years ago
|
#!/bin/bash
|
||
|
# Copyright (c) Facebook, Inc. and its affiliates.
|
||
|
#
|
||
|
# This source code is licensed under the MIT license found in the
|
||
|
# LICENSE file in the root directory of this source tree.
|
||
|
|
||
|
# Simple installation script for llvm/clang.
|
||
|
|
||
|
set -e
|
||
|
set -o pipefail
|
||
|
|
||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
CLANG_RELATIVE_SRC="src/download/llvm-project/llvm"
|
||
|
CLANG_SRC="$SCRIPT_DIR/$CLANG_RELATIVE_SRC"
|
||
|
CLANG_PREBUILD_PATCHES=(
|
||
|
"$SCRIPT_DIR/src/err_ret_local_block.patch"
|
||
|
"$SCRIPT_DIR/src/mangle_suppress_errors.patch"
|
||
|
"$SCRIPT_DIR/src/AArch64SVEACLETypes.patch"
|
||
|
"$SCRIPT_DIR/src/benchmark_register.patch"
|
||
|
"$SCRIPT_DIR/src/sysroot_cpp_headers.patch"
|
||
|
)
|
||
|
CLANG_PREFIX="$SCRIPT_DIR/install"
|
||
|
CLANG_INSTALLED_VERSION_FILE="$SCRIPT_DIR/installed.version"
|
||
|
PATCH=${PATCH:-patch}
|
||
|
STRIP=${STRIP:-strip}
|
||
|
|
||
|
NCPUS="$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 2)"
|
||
|
JOBS="${JOBS:-$(($NCPUS>=8?$NCPUS/4:2))}"
|
||
|
|
||
|
SHASUM=${SHASUM:-shasum -a 256}
|
||
|
|
||
|
usage () {
|
||
|
echo "Usage: $0 [-chr]"
|
||
|
echo
|
||
|
echo " options:"
|
||
|
echo " -c,--only-check-install check if recompiling clang is needed"
|
||
|
echo " -h,--help show this message"
|
||
|
echo " -n,--ninja use ninja for building"
|
||
|
echo " -p,--clang-hash print the installed clang hash"
|
||
|
echo " -r,--only-record-install do not install clang but pretend we did"
|
||
|
echo " -s,--sequential-link only use one process for linking (ninja only)"
|
||
|
}
|
||
|
|
||
|
clang_hash () {
|
||
|
pushd "$SCRIPT_DIR" > /dev/null
|
||
|
HASH=$($SHASUM setup.sh src/prepare_clang_src.sh | $SHASUM)
|
||
|
printf "%s" "$HASH" | cut -d ' ' -f 1
|
||
|
popd > /dev/null
|
||
|
}
|
||
|
|
||
|
check_installed () {
|
||
|
pushd "$SCRIPT_DIR" > /dev/null
|
||
|
HASH=$(clang_hash)
|
||
|
RESULT=1
|
||
|
if [ -f "$CLANG_INSTALLED_VERSION_FILE" ]; then
|
||
|
FILE_HASH=$(cat "$CLANG_INSTALLED_VERSION_FILE")
|
||
|
if [ "$HASH" == "$FILE_HASH" ]; then
|
||
|
RESULT=0
|
||
|
fi
|
||
|
fi
|
||
|
popd > /dev/null
|
||
|
return $RESULT
|
||
|
}
|
||
|
|
||
|
record_installed () {
|
||
|
pushd "$SCRIPT_DIR" > /dev/null
|
||
|
HASH=$(clang_hash)
|
||
|
echo $HASH > "$CLANG_INSTALLED_VERSION_FILE"
|
||
|
popd > /dev/null
|
||
|
}
|
||
|
|
||
|
ONLY_CHECK=
|
||
|
ONLY_RECORD=
|
||
|
PRINT_CLANG_HASH=
|
||
|
USE_NINJA=
|
||
|
SEQUENTIAL_LINK=
|
||
|
|
||
|
while [[ $# -gt 0 ]]; do
|
||
|
opt_key="$1"
|
||
|
case $opt_key in
|
||
|
-p|--clang-hash)
|
||
|
PRINT_CLANG_HASH=yes
|
||
|
shift
|
||
|
continue
|
||
|
;;
|
||
|
-c|--only-check-install)
|
||
|
ONLY_CHECK=yes
|
||
|
shift
|
||
|
continue
|
||
|
;;
|
||
|
-r|--only-record-install)
|
||
|
ONLY_RECORD=yes
|
||
|
shift
|
||
|
continue
|
||
|
;;
|
||
|
-n|--ninja)
|
||
|
USE_NINJA=yes
|
||
|
shift
|
||
|
continue
|
||
|
;;
|
||
|
-s|--sequential-link)
|
||
|
SEQUENTIAL_LINK=yes
|
||
|
shift
|
||
|
continue
|
||
|
;;
|
||
|
-h|--help)
|
||
|
usage
|
||
|
exit 0
|
||
|
;;
|
||
|
*)
|
||
|
usage
|
||
|
exit 2
|
||
|
esac
|
||
|
shift
|
||
|
done
|
||
|
|
||
|
if [ "$PRINT_CLANG_HASH" = "yes" ]; then
|
||
|
clang_hash
|
||
|
exit 0
|
||
|
fi
|
||
|
|
||
|
if [ "$ONLY_RECORD" = "yes" ]; then
|
||
|
record_installed
|
||
|
exit 0
|
||
|
fi
|
||
|
|
||
|
if check_installed; then
|
||
|
# already installed
|
||
|
if [ "$ONLY_CHECK" = "yes" ]; then
|
||
|
exit 0
|
||
|
fi
|
||
|
echo "Clang is already installed according to $CLANG_INSTALLED_VERSION_FILE"
|
||
|
echo "Nothing to do, exiting."
|
||
|
exit 0
|
||
|
else
|
||
|
if [ "$ONLY_CHECK" = "yes" ]; then
|
||
|
exit 1
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
set -x
|
||
|
|
||
|
if [[ x"$MAKEFLAGS" != x ]]; then
|
||
|
echo "WARNING: MAKEFLAGS var was set to: $MAKEFLAGS"
|
||
|
echo " which may (and will!) interfere with the setup"
|
||
|
echo " ... ignoring MAKEFLAGS."
|
||
|
unset MAKEFLAGS
|
||
|
fi
|
||
|
|
||
|
if [[ x"$DESTDIR" != x ]]; then
|
||
|
echo "WARNING: DESTDIR var was set to: $DESTDIR"
|
||
|
echo " but the setup script is not designed to handle"
|
||
|
echo " relocation of the installation."
|
||
|
echo " ... ignoring DESTDIR."
|
||
|
unset DESTDIR
|
||
|
fi
|
||
|
|
||
|
platform=`uname`
|
||
|
|
||
|
CMAKE_ARGS=(
|
||
|
-DCMAKE_INSTALL_PREFIX="$CLANG_PREFIX"
|
||
|
-DCMAKE_BUILD_TYPE=Release
|
||
|
-DCMAKE_C_FLAGS="$CFLAGS $CMAKE_C_FLAGS"
|
||
|
-DCMAKE_CXX_FLAGS="$CXXFLAGS $CMAKE_CXX_FLAGS"
|
||
|
-DLLVM_ENABLE_ASSERTIONS=Off
|
||
|
-DLLVM_ENABLE_EH=On
|
||
|
-DLLVM_ENABLE_RTTI=On
|
||
|
-DLLVM_INCLUDE_DOCS=Off
|
||
|
-DLLVM_ENABLE_PROJECTS="clang;compiler-rt;libcxx;libcxxabi;openmp"
|
||
|
-DLLVM_TARGETS_TO_BUILD="X86;AArch64;ARM;Mips"
|
||
|
-DLLVM_BUILD_EXTERNAL_COMPILER_RT=On
|
||
|
)
|
||
|
|
||
|
if [ "$platform" = "Darwin" ]; then
|
||
|
CMAKE_ARGS+=(
|
||
|
-DLLVM_ENABLE_LIBCXX=On
|
||
|
-DCMAKE_SHARED_LINKER_FLAGS="$LDFLAGS $CMAKE_SHARED_LINKER_FLAGS"
|
||
|
-DLLVM_BUILD_LLVM_DYLIB=ON
|
||
|
)
|
||
|
else
|
||
|
CMAKE_ARGS+=(
|
||
|
-DCMAKE_SHARED_LINKER_FLAGS="$LDFLAGS $CMAKE_SHARED_LINKER_FLAGS -lstdc++ -fPIC"
|
||
|
)
|
||
|
fi
|
||
|
|
||
|
if [ "$USE_NINJA" = "yes" ]; then
|
||
|
CMAKE_GENERATOR="Ninja"
|
||
|
BUILD_BIN="ninja"
|
||
|
# Do not set a 'j' build default for Ninja (let Ninja decide)
|
||
|
BUILD_ARGS=""
|
||
|
else
|
||
|
CMAKE_GENERATOR="Unix Makefiles"
|
||
|
BUILD_BIN="make"
|
||
|
BUILD_ARGS="-j $JOBS"
|
||
|
fi
|
||
|
|
||
|
if [ "$SEQUENTIAL_LINK" = "yes" ]; then
|
||
|
if [[ x"$USE_NINJA" = x ]]; then
|
||
|
echo "Linking with a single process is only supported with the Ninja generator."
|
||
|
echo "Unable to proceed, exiting."
|
||
|
exit 1
|
||
|
fi
|
||
|
# For Ninja, the compile jobs is the number of CPUs *not* $JOBS
|
||
|
CMAKE_ARGS+=(
|
||
|
-DCMAKE_JOB_POOLS:STRING="compile=$NCPUS;link=1"
|
||
|
-DCMAKE_JOB_POOL_COMPILE:STRING="compile"
|
||
|
-DCMAKE_JOB_POOL_LINK:STRING="link"
|
||
|
)
|
||
|
fi
|
||
|
|
||
|
# start the installation
|
||
|
if [ ! -d "$CLANG_SRC" ]; then
|
||
|
echo "Clang src (${CLANG_SRC}) missing, please run src/prepare_clang_src.sh"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# apply prebuild patch
|
||
|
pushd "${SCRIPT_DIR}/src/download"
|
||
|
for PATCH_FILE in ${CLANG_PREBUILD_PATCHES[*]}; do
|
||
|
"$PATCH" --batch -p 1 < "$PATCH_FILE"
|
||
|
done
|
||
|
popd
|
||
|
|
||
|
if [ -n "$CLANG_TMP_DIR" ]; then
|
||
|
TMP=$CLANG_TMP_DIR
|
||
|
else
|
||
|
TMP=`mktemp -d ${TMPDIR-/tmp}/clang-setup.XXXXXX`
|
||
|
fi
|
||
|
pushd "$TMP"
|
||
|
|
||
|
mkdir -p build
|
||
|
pushd build
|
||
|
|
||
|
# workaround install issue with ocaml llvm bindings and ocamldoc
|
||
|
mkdir -p docs/ocamldoc/html
|
||
|
|
||
|
cmake -G "$CMAKE_GENERATOR" "$CLANG_SRC" "${CMAKE_ARGS[@]}" $CLANG_CMAKE_ARGS
|
||
|
|
||
|
$BUILD_BIN $BUILD_ARGS
|
||
|
|
||
|
echo "testing clang build"
|
||
|
./bin/clang --version
|
||
|
|
||
|
# "uninstall" previous clang
|
||
|
rm -fr "$CLANG_PREFIX"
|
||
|
|
||
|
$BUILD_BIN $BUILD_ARGS install
|
||
|
|
||
|
popd # build
|
||
|
popd # $TMP
|
||
|
|
||
|
# brutally strip everything, ignore errors
|
||
|
set +e
|
||
|
find "$CLANG_PREFIX"/{bin,lib} -type f -exec "$STRIP" -x \{\} \;
|
||
|
set -e
|
||
|
|
||
|
echo "testing installed clang"
|
||
|
"$CLANG_PREFIX"/bin/clang --version
|
||
|
|
||
|
echo "deleting temp dir '$CLANG_TMP_DIR'..."
|
||
|
if [ -n "$CLANG_TMP_DIR" ]; then
|
||
|
rm -rf "$TMP/*"
|
||
|
else
|
||
|
rm -rf "$TMP"
|
||
|
fi
|
||
|
|
||
|
record_installed
|