01_base_install.sh raw

   1  #!/usr/bin/env bash
   2  #
   3  # Copyright (c) 2018-present The Limenka developers
   4  # Distributed under the MIT software license, see the accompanying
   5  # file COPYING or http://www.opensource.org/licenses/mit-license.php.
   6  
   7  export LC_ALL=C.UTF-8
   8  
   9  set -ex
  10  
  11  CFG_DONE="ci.base-install-done"  # Use a global git setting to remember whether this script ran to avoid running it twice
  12  
  13  if [ "$(git config --global ${CFG_DONE})" == "true" ]; then
  14    echo "Skip base install"
  15    exit 0
  16  fi
  17  
  18  MAKEJOBS="-j$( nproc )"  # Use nproc, because MAKEJOBS is the default in docker image builds.
  19  
  20  if [ -n "$DPKG_ADD_ARCH" ]; then
  21    dpkg --add-architecture "$DPKG_ADD_ARCH"
  22  fi
  23  
  24  if [ -n "${APT_LLVM_V}" ]; then
  25    ${CI_RETRY_EXE} apt-get update
  26    ${CI_RETRY_EXE} apt-get install curl -y
  27    curl "https://apt.llvm.org/llvm-snapshot.gpg.key" | tee "/etc/apt/trusted.gpg.d/apt.llvm.org.asc"
  28    (
  29      # shellcheck disable=SC2034
  30      source /etc/os-release
  31      echo "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-${APT_LLVM_V} main" > "/etc/apt/sources.list.d/llvm-toolchain-${VERSION_CODENAME}-${APT_LLVM_V}.list"
  32    )
  33  fi
  34  
  35  if [[ $CI_IMAGE_NAME_TAG == *centos* ]]; then
  36    bash -c "dnf -y install epel-release"
  37    bash -c "dnf -y --allowerasing install $CI_BASE_PACKAGES $PACKAGES"
  38  elif [ "$CI_OS_NAME" != "macos" ]; then
  39    if [[ -n "${APPEND_APT_SOURCES_LIST}" ]]; then
  40      echo "${APPEND_APT_SOURCES_LIST}" >> /etc/apt/sources.list
  41    fi
  42    ${CI_RETRY_EXE} apt-get update
  43    ${CI_RETRY_EXE} bash -c "apt-get install --no-install-recommends --no-upgrade -y $PACKAGES $CI_BASE_PACKAGES"
  44  fi
  45  
  46  if [ -n "${APT_LLVM_V}" ]; then
  47    update-alternatives --install /usr/bin/clang++ clang++ "/usr/bin/clang++-${APT_LLVM_V}" 100
  48    update-alternatives --install /usr/bin/clang clang "/usr/bin/clang-${APT_LLVM_V}" 100
  49    update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer "/usr/bin/llvm-symbolizer-${APT_LLVM_V}" 100
  50  fi
  51  
  52  if [ -n "$PIP_PACKAGES" ]; then
  53    # shellcheck disable=SC2086
  54    ${CI_RETRY_EXE} pip3 install --user $PIP_PACKAGES
  55  fi
  56  
  57  if [[ -n "${USE_INSTRUMENTED_LIBCPP}" ]]; then
  58    ${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b "llvmorg-21.1.1" /llvm-project
  59  
  60    cmake -G Ninja -B /cxx_build/ \
  61      -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \
  62      -DCMAKE_BUILD_TYPE=Release \
  63      -DLLVM_USE_SANITIZER="${USE_INSTRUMENTED_LIBCPP}" \
  64      -DCMAKE_C_COMPILER=clang \
  65      -DCMAKE_CXX_COMPILER=clang++ \
  66      -DLLVM_TARGETS_TO_BUILD=Native \
  67      -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
  68      -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \
  69      -DLIBCXX_ABI_DEFINES="_LIBCPP_ABI_BOUNDED_ITERATORS;_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STD_ARRAY;_LIBCPP_ABI_BOUNDED_ITERATORS_IN_STRING;_LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR;_LIBCPP_ABI_BOUNDED_UNIQUE_PTR" \
  70      -DLIBCXX_HARDENING_MODE=debug \
  71      -S /llvm-project/runtimes
  72  
  73    ninja -C /cxx_build/ "$MAKEJOBS"
  74  
  75    # Clear no longer needed source folder
  76    du -sh /llvm-project
  77    rm -rf /llvm-project
  78  fi
  79  
  80  if [[ "${RUN_TIDY}" == "true" ]]; then
  81    ${CI_RETRY_EXE} git clone --depth=1 https://github.com/include-what-you-use/include-what-you-use -b clang_"${TIDY_LLVM_V}" /include-what-you-use
  82    cmake -B /iwyu-build/ -G 'Unix Makefiles' -DCMAKE_PREFIX_PATH=/usr/lib/llvm-"${TIDY_LLVM_V}" -S /include-what-you-use
  83    make -C /iwyu-build/ install "$MAKEJOBS"
  84  fi
  85  
  86  mkdir -p "${DEPENDS_DIR}/SDKs" "${DEPENDS_DIR}/sdk-sources"
  87  
  88  OSX_SDK_BASENAME="Xcode-${XCODE_VERSION}-${XCODE_BUILD_ID}-extracted-SDK-with-libcxx-headers"
  89  
  90  if [ -n "$XCODE_VERSION" ] && [ ! -d "${DEPENDS_DIR}/SDKs/${OSX_SDK_BASENAME}" ]; then
  91    OSX_SDK_FILENAME="${OSX_SDK_BASENAME}.tar.gz"
  92    OSX_SDK_PATH="${DEPENDS_DIR}/sdk-sources/${OSX_SDK_FILENAME}"
  93    if [ ! -f "$OSX_SDK_PATH" ]; then
  94      ${CI_RETRY_EXE} curl --location --fail "${SDK_URL}/${OSX_SDK_FILENAME}" -o "$OSX_SDK_PATH"
  95    fi
  96    tar -C "${DEPENDS_DIR}/SDKs" -xf "$OSX_SDK_PATH"
  97  fi
  98  
  99  git config --global ${CFG_DONE} "true"
 100