Last active
September 6, 2025 16:11
-
-
Save aleph-ra/cbed5ae5ce45b5155da884171452fb46 to your computer and use it in GitHub Desktop.
AdaptiveCpp installation script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # Stop command echoing | |
| set +x | |
| # Propogate errors and fail on error | |
| set -eo pipefail | |
| # Default log level: INFO | |
| QUIET_MODE=false | |
| # Debug mode off | |
| DEBUG_MODE=false | |
| # Logging function | |
| log() { | |
| local level="$1" | |
| local message="$2" | |
| local timestamp | |
| timestamp=$(date +"%Y-%m-%d %H:%M:%S") | |
| case "$level" in | |
| INFO) | |
| [[ $QUIET_MODE == false ]] && echo -e "\033[1;34m[$timestamp] [INFO]\033[0m $message" | |
| ;; | |
| WARN) | |
| echo -e "\033[1;33m[$timestamp] [WARN]\033[0m $message" >&2 | |
| ;; | |
| ERROR) | |
| echo -e "\033[1;31m[$timestamp] [ERROR]\033[0m $message" >&2 | |
| ;; | |
| *) | |
| echo -e "\033[1;36m[$timestamp] [UNKNOWN]\033[0m $message" >&2 | |
| ;; | |
| esac | |
| } | |
| # Function to check if running inside Docker or Podman or other containerized envs | |
| is_in_container() { | |
| [[ -f /.dockerenv ]] && return 0 | |
| grep -qE '(docker|podman)' /proc/self/cgroup 2>/dev/null && return 0 | |
| grep -q 'containerd' /proc/self/cgroup 2>/dev/null && return 0 | |
| [[ -f /run/.containerenv ]] && return 0 | |
| return 1 | |
| } | |
| # Function to check for sudo privileges | |
| check_sudo() { | |
| if ! is_in_container && ! sudo -n true 2>/dev/null; then | |
| log WARN "This script requires sudo privileges. Please enter your password." | |
| sudo -v || { log ERROR "Failed to acquire sudo privileges. Exiting."; exit 1; } | |
| fi | |
| } | |
| # Function to check if a command exists | |
| command_exists() { | |
| command -v "$1" &>/dev/null | |
| } | |
| # Function to install missing dependencies | |
| install_dependencies() { | |
| $SUDO apt update -y | |
| $SUDO apt install -y lsb-release bc | |
| # Get the Ubuntu version | |
| UBUNTU_VERSION=$(lsb_release -sr) | |
| log INFO "Ubuntu version found: $UBUNTU_VERSION" | |
| # Specifically install latest version of cmake for Ubuntu <= 20 | |
| if [[ $(echo "$UBUNTU_VERSION <= 20.04" | bc -l) == 1 ]]; then | |
| log INFO "Installing latest cmake..." | |
| export DEBIAN_FRONTEND=noninteractive # avoid fresh OS timezone setting | |
| $SUDO apt install -y software-properties-common wget | |
| wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | $SUDO tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null | |
| $SUDO apt-add-repository -y "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" | |
| $SUDO apt update -y && apt install -y kitware-archive-keyring | |
| $SUDO rm /etc/apt/trusted.gpg.d/kitware.gpg | |
| $SUDO apt update -y && apt install -y cmake | |
| $SUDO apt install -y --only-upgrade cmake | |
| local dependencies=("git" "make" "python3-pip" "zip" "unzip" "ninja-build" "curl" "tar" "pkg-config" "jq") | |
| else | |
| local dependencies=("git" "make" "cmake" "software-properties-common" "wget" "python3-pip" "zip" "unzip" "ninja-build" "curl" "tar" "pkg-config" "jq") | |
| fi | |
| # Install other tool dependencies | |
| local missing=() | |
| for dep in "${dependencies[@]}"; do | |
| if ! command_exists "$dep"; then | |
| missing+=("$dep") | |
| fi | |
| done | |
| if (( ${#missing[@]} > 0 )); then | |
| log INFO "Installing missing dependencies: ${missing[*]}" | |
| export DEBIAN_FRONTEND=noninteractive # avoid fresh OS timezone setting | |
| $SUDO apt install -y "${missing[@]}" | |
| else | |
| log INFO "All dependencies are already installed." | |
| fi | |
| } | |
| # Function to check LLVM/Clang version | |
| check_llvm_clang_version() { | |
| local llvm_version=$(llvm-config-$1 --version 2>/dev/null | cut -d. -f1 || echo "0") | |
| local clang_version=$(clang++-$1 --version 2>/dev/null | awk '/version/ {print $4}' | cut -d. -f1 || echo "0") | |
| [[ "$llvm_version" -ne "0" && "$clang_version" -ne "0" ]] | |
| } | |
| # Function to return LLVM/Clang version found in a specified range | |
| check_llvm_clang_versions_in_range() { | |
| local min_version=$1 | |
| local max_version=$2 | |
| local found_version=0 | |
| for (( version=min_version; version<=max_version; version++ )); do | |
| if check_llvm_clang_version $version; then | |
| found_version=$version | |
| fi | |
| done | |
| echo $found_version | |
| } | |
| #### ACPP Install Script #### | |
| ADAPTIVE_CPP_URL="https://github.com/AdaptiveCpp/AdaptiveCpp" | |
| ADAPTIVE_CPP_SOURCE_VERSION="v25.02.0" | |
| DEFAULT_INSTALL_PREFIX="/usr/local" | |
| DEFAULT_KEEP_SOURCE_FILES=false | |
| MINIMUM_LLVM_VERSION=14 | |
| DEFAULT_NIGHTLY=false | |
| INSTALL_PREFIX="$DEFAULT_INSTALL_PREFIX" | |
| LLVM_VERSION="" | |
| KEEP_SOURCE_FILES="$DEFAULT_KEEP_SOURCE_FILES" | |
| NIGHTLY="$DEFAULT_NIGHTLY" | |
| CUDA_ROOT="" | |
| # Parse arguments | |
| while [[ "$#" -gt 0 ]]; do | |
| case $1 in | |
| --acpp-install-prefix) INSTALL_PREFIX="$2"; shift ;; | |
| --llvm-version) LLVM_VERSION="$2"; shift ;; | |
| --cuda-root) CUDA_ROOT="$2"; shift ;; | |
| --keep-source-files) KEEP_SOURCE_FILES=true ;; | |
| --nightly) NIGHTLY=true ;; | |
| --quiet) QUIET_MODE=true ;; | |
| --debug) DEBUG_MODE=true ;; | |
| *) log ERROR "Unknown parameter: $1"; exit 1 ;; | |
| esac | |
| shift | |
| done | |
| # Enable debugging if requested | |
| if [[ $DEBUG_MODE == true ]]; then | |
| log INFO "Debug mode enabled." | |
| set -x | |
| fi | |
| # Check if sudo is required if not in a container | |
| SUDO=$(is_in_container && echo "" || echo "sudo") | |
| # Ensure sudo privileges if not in Docker | |
| check_sudo | |
| # Install tool dependencies | |
| install_dependencies | |
| # Check for LLVM/Clang versions | |
| if [[ $LLVM_VERSION ]]; then | |
| # Check if given version is within range | |
| if (( LLVM_VERSION < 15 || LLVM_VERSION > 17 )); then | |
| log ERROR "LLVM Versions higher than 20 and lower than 15 are not compatible with kompass-core." | |
| exit 1 | |
| fi | |
| if check_llvm_clang_version $LLVM_VERSION; then | |
| FOUND_LLVM_VERSION=$LLVM_VERSION | |
| else | |
| FOUND_LLVM_VERSION=0 | |
| fi | |
| else | |
| # Clang version 18 gives an error when compiling with boost version < 1.75 | |
| # Thus setting highest version to 17 | |
| LLVM_VERSION=17 | |
| FOUND_LLVM_VERSION=$(check_llvm_clang_versions_in_range $MINIMUM_LLVM_VERSION $LLVM_VERSION) | |
| fi | |
| # Install LLVM/Clang if needed | |
| if [ $FOUND_LLVM_VERSION -eq 0 ]; then | |
| log INFO "Downloading and installing LLVM/Clang..." | |
| wget -q https://apt.llvm.org/llvm.sh || { log ERROR "Failed to download LLVM setup script."; exit 1; } | |
| chmod +x llvm.sh | |
| log INFO "Installing LLVM/Clang version $LLVM_VERSION..." | |
| $SUDO ./llvm.sh "$LLVM_VERSION" | |
| # Revert command echoing if not in debug mode | |
| if [[ $DEBUG_MODE == false ]]; then | |
| set +x | |
| fi | |
| # Cleanup | |
| rm -f llvm.sh | |
| else | |
| LLVM_VERSION=$FOUND_LLVM_VERSION | |
| log INFO "Found LLVM/Clang version $FOUND_LLVM_VERSION. Skipping LLVM/Clang installation." | |
| fi | |
| # Install required packages for acpp | |
| $SUDO apt install -y \ | |
| "libclang-${LLVM_VERSION}-dev" "clang-tools-${LLVM_VERSION}" \ | |
| "libomp-${LLVM_VERSION}-dev" "llvm-${LLVM_VERSION}-dev" "lld-${LLVM_VERSION}" | |
| # Get LLVM/Clang paths | |
| LLVM_DIR=$(llvm-config-${LLVM_VERSION} --cmakedir) | |
| log INFO "LLVM cmake path is $LLVM_DIR" | |
| CLANG_EXECUTABLE_PATH=$(which clang++-${LLVM_VERSION}) | |
| log INFO "Clang++ executable path is $LLVM_DIR" | |
| # Install libstdc++ for Clang | |
| GCC_VERSION=$(clang++-${LLVM_VERSION} -v 2>&1 | awk -F/ '/Selected GCC/ {print $NF}') | |
| log INFO "Installing libstdc++ version $GCC_VERSION..." | |
| $SUDO apt install -y "libstdc++-${GCC_VERSION}-dev" | |
| # Install Boost libraries for acpp | |
| log INFO "Installing boost dependencies..." | |
| $SUDO apt install -y libboost-fiber-dev libboost-context-dev libboost-test-dev | |
| # Clone and build AdaptiveCpp | |
| if [[ ! -d "AdaptiveCpp" ]]; then | |
| log INFO "Cloning AdaptiveCpp repository..." | |
| git clone --depth 1 --branch $ADAPTIVE_CPP_SOURCE_VERSION "$ADAPTIVE_CPP_URL" | |
| else | |
| log WARN "AdaptiveCpp directory already exists. Skipping download." | |
| fi | |
| cd AdaptiveCpp | |
| # Checkout latest tag | |
| mkdir -p build && cd build | |
| log INFO "Configuring build with CMake..." | |
| CMAKE_FLAGS="-DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX -DLLVM_DIR=$LLVM_DIR -DCLANG_EXECUTABLE_PATH=$CLANG_EXECUTABLE_PATH" | |
| if [[ -n "$CUDA_ROOT" ]]; then | |
| log INFO "CUDA root specified: $CUDA_ROOT. Enabling CUDA backend..." | |
| CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_CUDA_BACKEND=ON -DCUDA_TOOLKIT_ROOT_DIR=$CUDA_ROOT" | |
| else | |
| log INFO "Building with defaults." | |
| fi | |
| CXX=$CLANG_EXECUTABLE_PATH cmake $CMAKE_FLAGS .. | |
| log INFO "Building and installing AdaptiveCpp to $INSTALL_PREFIX..." | |
| $SUDO make install -j$(nproc) | |
| # Back to main pwd | |
| cd ../.. | |
| # Verify AdaptiveCpp installation | |
| if ACPP_VERSION=$(acpp --acpp-version | grep 'AdaptiveCpp version:' | awk '{print $3}'); then | |
| log INFO "\033[1;32mAdaptiveCpp version $ACPP_VERSION has been installed to $INSTALL_PREFIX.\033[0m" | |
| else | |
| log ERROR "Failed to verify AdaptiveCpp installation." | |
| fi | |
| # Clean up source files if not required | |
| if [[ $KEEP_SOURCE_FILES == false ]]; then | |
| log INFO "Removing acpp source files as --keep-source-files is not set." | |
| cd .. && rm -rf AdaptiveCpp | |
| fi |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The script can be used directly for installations as follows:
curl -L https://gist.githubusercontent.com/aleph-ra/cbed5ae5ce45b5155da884171452fb46/raw/772ed488a66f051400db59e2d760ab3e8abb95e2/install_acpp.sh | bashOr by downloading it and running with available flags as follows:
chmod +x install_acpp.sh./install_acpp.sh --install-prefix /opt/adaptivecpp --llvm-version 16