| #!/bin/bash |
| # Based on setup-ubuntu.sh from Facebook Velox |
| # |
| # Copyright (c) Facebook, Inc. and its affiliates. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # This script documents setting up a Ubuntu host for CelebornCpp |
| # development. Running it should make you ready to compile. |
| # |
| # Environment variables: |
| # * INSTALL_PREREQUISITES="N": Skip installation of packages for build. |
| # * PROMPT_ALWAYS_RESPOND="n": Automatically respond to interactive prompts. |
| # Use "n" to never wipe directories. |
| # |
| # You can also run individual functions below by specifying them as arguments: |
| # $ scripts/setup-ubuntu.sh install_googletest install_fmt |
| # |
| |
| # Minimal setup for Ubuntu 22.04. |
| set -eufx -o pipefail |
| SCRIPTDIR=$(dirname "${BASH_SOURCE[0]}") |
| source $SCRIPTDIR/setup-helper-functions.sh |
| |
| # Folly must be built with the same compiler flags so that some low level types |
| # are the same size. |
| COMPILER_FLAGS=$(get_cxx_flags) |
| export COMPILER_FLAGS |
| NPROC=$(getconf _NPROCESSORS_ONLN) |
| BUILD_DUCKDB="${BUILD_DUCKDB:-true}" |
| export CMAKE_BUILD_TYPE=Release |
| SUDO="${SUDO:-"sudo --preserve-env"}" |
| USE_CLANG="${USE_CLANG:-false}" |
| export INSTALL_PREFIX=${INSTALL_PREFIX:-"/usr/local"} |
| DEPENDENCY_DIR=${DEPENDENCY_DIR:-$(pwd)/deps-download} |
| |
| DEPENDENCY_DIR=${DEPENDENCY_DIR:-$(pwd)/deps-download} |
| OS_CXXFLAGS="" |
| |
| function install_clang15 { |
| VERSION=`cat /etc/os-release | grep VERSION_ID` |
| if [[ ! ${VERSION} =~ "22.04" && ! ${VERSION} =~ "24.04" ]]; then |
| echo "Warning: using the Clang configuration is for Ubuntu 22.04 and 24.04. Errors might occur." |
| fi |
| CLANG_PACKAGE_LIST=clang-15 |
| if [[ ${VERSION} =~ "22.04" ]]; then |
| CLANG_PACKAGE_LIST=${CLANG_PACKAGE_LIST} gcc-12 g++-12 libc++-12-dev |
| fi |
| ${SUDO} apt install ${CLANG_PACKAGE_LIST} -y |
| } |
| |
| FB_OS_VERSION="v2024.07.01.00" |
| FMT_VERSION="10.1.1" |
| BOOST_VERSION="boost-1.84.0" |
| ARROW_VERSION="15.0.0" |
| STEMMER_VERSION="2.2.0" |
| |
| # Install gtest library package for tests. |
| function install_gtest { |
| ${SUDO} apt-get install -y libgtest-dev cmake |
| mkdir -p $HOME/build |
| pushd $HOME/build |
| ${SUDO} cmake /usr/src/googletest/googletest |
| ${SUDO} make |
| ${SUDO} cp lib/libgtest* /usr/lib/ |
| popd |
| ${SUDO} rm -rf $HOME/build |
| ${SUDO} mkdir /usr/local/lib/googletest |
| ${SUDO} ln -s /usr/lib/libgtest.a /usr/local/lib/googletest/libgtest.a |
| ${SUDO} ln -s /usr/lib/libgtest_main.a /usr/local/lib/googletest/libgtest_main.a |
| } |
| |
| # Install packages required for build. |
| function install_build_prerequisites { |
| ${SUDO} apt update |
| # The is an issue on 22.04 where a version conflict prevents glog install, |
| # installing libunwind first fixes this. |
| ${SUDO} apt install -y libunwind-dev |
| ${SUDO} apt install -y \ |
| build-essential \ |
| python3-pip \ |
| ccache \ |
| curl \ |
| ninja-build \ |
| checkinstall \ |
| git \ |
| pkg-config \ |
| gdb \ |
| wget |
| |
| install_gtest |
| |
| # Install to /usr/local to make it available to all users. |
| ${SUDO} pip3 install cmake==3.28.3 |
| |
| if [[ ${USE_CLANG} != "false" ]]; then |
| install_clang15 |
| fi |
| |
| # Install clang-format-15 for lint checking. |
| ${SUDO} apt install -y clang-format-15 |
| } |
| |
| # Install packages required for build. |
| function install_celeborn_cpp_deps_from_apt { |
| ${SUDO} apt update |
| ${SUDO} apt install -y \ |
| libc-ares-dev \ |
| libcurl4-openssl-dev \ |
| libssl-dev \ |
| libicu-dev \ |
| libdouble-conversion-dev \ |
| libgoogle-glog-dev \ |
| libbz2-dev \ |
| libgflags-dev \ |
| libgmock-dev \ |
| libevent-dev \ |
| libsodium-dev \ |
| libxxhash-dev \ |
| liblz4-dev \ |
| libzstd-dev \ |
| libre2-dev |
| } |
| |
| function install_fmt { |
| wget_and_untar https://github.com/fmtlib/fmt/archive/${FMT_VERSION}.tar.gz fmt |
| cmake_install_dir fmt -DFMT_TEST=OFF |
| } |
| |
| function install_boost { |
| wget_and_untar https://github.com/boostorg/boost/releases/download/${BOOST_VERSION}/${BOOST_VERSION}.tar.gz boost |
| ( |
| cd ${DEPENDENCY_DIR}/boost |
| if [[ ${USE_CLANG} != "false" ]]; then |
| ./bootstrap.sh --prefix=${INSTALL_PREFIX} --with-toolset="clang-15" |
| # Switch the compiler from the clang-15 toolset which doesn't exist (clang-15.jam) to |
| # clang of version 15 when toolset clang-15 is used. |
| # This reconciles the project-config.jam generation with what the b2 build system allows for customization. |
| sed -i 's/using clang-15/using clang : 15/g' project-config.jam |
| ${SUDO} ./b2 "-j$(nproc)" -d0 install threading=multi toolset=clang-15 --without-python |
| else |
| ./bootstrap.sh --prefix=${INSTALL_PREFIX} |
| ${SUDO} ./b2 "-j$(nproc)" -d0 install threading=multi --without-python |
| fi |
| ) |
| } |
| |
| function install_protobuf { |
| ### protobuf version must be aligned to CelebornJava. |
| wget_and_untar https://github.com/protocolbuffers/protobuf/releases/download/v21.7/protobuf-all-21.7.tar.gz protobuf |
| ( |
| cd ${DEPENDENCY_DIR}/protobuf |
| ./configure CXXFLAGS="-fPIC" --prefix=${INSTALL_PREFIX} |
| make "-j${NPROC}" |
| ${SUDO} make install |
| ${SUDO} ldconfig |
| ) |
| } |
| |
| function install_folly { |
| wget_and_untar https://github.com/facebook/folly/archive/refs/tags/${FB_OS_VERSION}.tar.gz folly |
| cmake_install_dir folly -DBUILD_TESTS=OFF -DFOLLY_HAVE_INT128_T=ON |
| } |
| |
| function install_fizz { |
| wget_and_untar https://github.com/facebookincubator/fizz/archive/refs/tags/${FB_OS_VERSION}.tar.gz fizz |
| cmake_install_dir fizz/fizz -DBUILD_TESTS=OFF |
| } |
| |
| function install_wangle { |
| wget_and_untar https://github.com/facebook/wangle/archive/refs/tags/${FB_OS_VERSION}.tar.gz wangle |
| cmake_install_dir wangle/wangle -DBUILD_TESTS=OFF |
| } |
| |
| function install_celeborn_cpp_deps { |
| run_and_time install_celeborn_cpp_deps_from_apt |
| run_and_time install_fmt |
| run_and_time install_protobuf |
| run_and_time install_boost |
| run_and_time install_folly |
| run_and_time install_fizz |
| run_and_time install_wangle |
| } |
| |
| function install_apt_deps { |
| install_build_prerequisites |
| install_celeborn_cpp_deps_from_apt |
| } |
| |
| (return 2> /dev/null) && return # If script was sourced, don't run commands. |
| |
| ( |
| if [[ ${USE_CLANG} != "false" ]]; then |
| export CC=/usr/bin/clang-15 |
| export CXX=/usr/bin/clang++-15 |
| fi |
| if [[ $# -ne 0 ]]; then |
| for cmd in "$@"; do |
| run_and_time "${cmd}" |
| done |
| echo "All specified dependencies installed!" |
| else |
| if [ "${INSTALL_PREREQUISITES:-Y}" == "Y" ]; then |
| echo "Installing build dependencies" |
| run_and_time install_build_prerequisites |
| else |
| echo "Skipping installation of build dependencies since INSTALL_PREREQUISITES is not set" |
| fi |
| install_celeborn_cpp_deps |
| echo "All dependencies for CelebornCpp installed!" |
| if [[ ${USE_CLANG} != "false" ]]; then |
| echo "To use clang for the CelebornCpp build set the CC and CXX environment variables in your session." |
| echo " export CC=/usr/bin/clang-15" |
| echo " export CXX=/usr/bin/clang++-15" |
| fi |
| fi |
| ) |