123 lines
3.4 KiB
Bash
Executable File
123 lines
3.4 KiB
Bash
Executable File
#!/bin/sh
|
|
BUILD_DIR=/tmp/occlum_clang_toolchain
|
|
INSTALL_DIR=/opt/occlum/toolchains/clang
|
|
|
|
# Exit if any command fails
|
|
set -e
|
|
|
|
# Clean previous build and installation if any
|
|
rm -rf ${BUILD_DIR}
|
|
rm -rf ${INSTALL_DIR}
|
|
|
|
# Create the build directory
|
|
mkdir -p ${BUILD_DIR}
|
|
cd ${BUILD_DIR}
|
|
|
|
# Download all source code
|
|
# TODO: use Occlum's fork of LLVM for SFI
|
|
git clone -b release_70 https://github.com/llvm-mirror/llvm
|
|
git clone -b release_70 https://github.com/llvm-mirror/lld
|
|
git clone -b release_70 https://github.com/llvm-mirror/clang
|
|
git clone -b release_70 https://github.com/llvm-mirror/libcxx
|
|
git clone -b release_70 https://github.com/llvm-mirror/libcxxabi
|
|
git clone -b release_70 https://github.com/llvm-mirror/libunwind
|
|
git clone -b release_70 https://github.com/llvm-mirror/compiler-rt
|
|
git clone https://github.com/occlum/musl
|
|
|
|
# Build LLVM
|
|
mkdir llvm-build
|
|
cd llvm-build
|
|
cmake -DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
|
|
-DLLVM_ENABLE_PROJECTS="clang;lld" \
|
|
-DLLVM_TARGETS_TO_BUILD="X86" \
|
|
../llvm
|
|
# Compiling LLVM in many threads may consume too much memory
|
|
make -j2
|
|
make install
|
|
cd ..
|
|
|
|
# Make LLVM binaries visible
|
|
export PATH=${INSTALL_DIR}/bin:${PATH}
|
|
|
|
# Build musl libc
|
|
cd musl
|
|
CC=clang ./configure --prefix=${INSTALL_DIR} --enable-wrapper=clang
|
|
make install -j
|
|
cd ..
|
|
|
|
# Link Linux headers
|
|
ln -s /usr/include/linux ${INSTALL_DIR}/include/linux
|
|
ln -s /usr/include/x86_64-linux-gnu/asm ${INSTALL_DIR}/include/asm
|
|
ln -s /usr/include/asm-generic ${INSTALL_DIR}/include/asm-generic
|
|
|
|
# Build libunwind
|
|
mkdir libunwind-build
|
|
cd libunwind-build
|
|
cmake -DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_C_COMPILER=musl-clang \
|
|
-DCMAKE_C_FLAGS="-O2 -fPIC" \
|
|
-DCMAKE_CXX_COMPILER=musl-clang \
|
|
-DCMAKE_CXX_FLAGS="-O2 -fPIC" \
|
|
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
|
|
-DLLVM_ENABLE_LIBCXX=ON \
|
|
../libunwind
|
|
make install -j
|
|
cd ..
|
|
|
|
# Build libcxx (the intermediate version)
|
|
mkdir libcxx-prebuild
|
|
cd libcxx-prebuild
|
|
cmake -DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_C_COMPILER=musl-clang \
|
|
-DCMAKE_C_FLAGS="-O2 -fPIC" \
|
|
-DCMAKE_CXX_COMPILER=musl-clang \
|
|
-DCMAKE_CXX_FLAGS="-O2 -fPIC" \
|
|
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
|
|
-DLIBCXX_HAS_MUSL_LIBC=ON \
|
|
../libcxx
|
|
make install -j
|
|
cd ..
|
|
|
|
# Build libcxxabi with libcxx
|
|
mkdir libcxxabi-build
|
|
cd libcxxabi-build
|
|
cmake -DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_C_COMPILER=musl-clang \
|
|
-DCMAKE_C_FLAGS="-O2 -fPIC" \
|
|
-DCMAKE_CXX_COMPILER=musl-clang \
|
|
-DCMAKE_CXX_FLAGS="-O2 -fPIC" \
|
|
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
|
|
-DLIBCXXABI_ENABLE_PIC=ON \
|
|
-DLIBCXXABI_ENABLE_STATIC_UNWINDER=OFF \
|
|
-DLIBCXXABI_LIBCXX_PATH=${INSTALL_DIR} \
|
|
-DLIBCXXABI_USE_LLVM_UNWINDER=ON \
|
|
-DLLVM_ENABLE_LIBCXX=ON \
|
|
../libcxxabi
|
|
make install -j
|
|
cd ..
|
|
|
|
# Build libcxx (the final version) again, but this time with the libcxxabi above
|
|
mkdir libcxx-build
|
|
cd libcxx-build
|
|
cmake -DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_C_COMPILER=musl-clang \
|
|
-DCMAKE_C_FLAGS="-O2 -fPIC" \
|
|
-DCMAKE_CXX_COMPILER=musl-clang \
|
|
-DCMAKE_CXX_FLAGS="-O2 -fPIC" \
|
|
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
|
|
-DLIBCXX_HAS_MUSL_LIBC=ON \
|
|
-DLIBCXX_CXX_ABI=libcxxabi \
|
|
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=../libcxxabi/include \
|
|
-DLIBCXX_CXX_ABI_LIBRARY_PATH=${INSTALL_DIR}/lib \
|
|
-DLIBCXXABI_USE_LLVM_UNWINDER=ON \
|
|
../libcxx
|
|
make install -j
|
|
cd ..
|
|
|
|
# Remove all source code and build files
|
|
rm -rf ${BUILD_DIR}
|
|
|
|
# Link the toolchain directory
|
|
ln -s -f ${INSTALL_DIR} /usr/local/occlum
|