/ ci / test / 01_base_install.sh
01_base_install.sh
  1  #!/usr/bin/env bash
  2  #
  3  # Copyright (c) 2018-present The Bitcoin Core 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 -o errexit -o pipefail -o xtrace
 10  
 11  CFG_DONE="${BASE_ROOT_DIR}/ci.base-install-done"  # Use a global setting to remember whether this script ran to avoid running it twice
 12  
 13  if [ "$( cat "${CFG_DONE}" || true )" == "done" ]; 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 == *alpine* ]]; then
 36    ${CI_RETRY_EXE} apk update
 37    # shellcheck disable=SC2086
 38    ${CI_RETRY_EXE} apk add --no-cache $CI_BASE_PACKAGES $PACKAGES
 39  elif [ "$CI_OS_NAME" != "macos" ]; then
 40    if [[ -n "${APPEND_APT_SOURCES_LIST}" ]]; then
 41      echo "${APPEND_APT_SOURCES_LIST}" >> /etc/apt/sources.list
 42    fi
 43    ${CI_RETRY_EXE} apt-get update
 44    # shellcheck disable=SC2086
 45    ${CI_RETRY_EXE} apt-get install --no-install-recommends --no-upgrade -y $PACKAGES $CI_BASE_PACKAGES
 46  fi
 47  
 48  if [ -n "${APT_LLVM_V}" ]; then
 49    update-alternatives --install /usr/bin/clang++ clang++ "/usr/bin/clang++-${APT_LLVM_V}" 100
 50    update-alternatives --install /usr/bin/clang clang "/usr/bin/clang-${APT_LLVM_V}" 100
 51    update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer "/usr/bin/llvm-symbolizer-${APT_LLVM_V}" 100
 52  fi
 53  
 54  if [ -n "$PIP_PACKAGES" ]; then
 55    # shellcheck disable=SC2086
 56    ${CI_RETRY_EXE} pip3 install --user $PIP_PACKAGES
 57  fi
 58  
 59  if [[ -n "${USE_INSTRUMENTED_LIBCPP}" ]]; then
 60    ${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b "llvmorg-21.1.5" /llvm-project
 61  
 62    cmake -G Ninja -B /cxx_build/ \
 63      -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \
 64      -DCMAKE_BUILD_TYPE=Release \
 65      -DLLVM_USE_SANITIZER="${USE_INSTRUMENTED_LIBCPP}" \
 66      -DCMAKE_C_COMPILER=clang \
 67      -DCMAKE_CXX_COMPILER=clang++ \
 68      -DLLVM_TARGETS_TO_BUILD=Native \
 69      -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
 70      -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \
 71      -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" \
 72      -DLIBCXX_HARDENING_MODE=debug \
 73      -S /llvm-project/runtimes
 74  
 75    ninja -C /cxx_build/ "$MAKEJOBS"
 76  
 77    # Clear no longer needed source folder
 78    du -sh /llvm-project
 79    rm -rf /llvm-project
 80  fi
 81  
 82  if [[ "${RUN_TIDY}" == "true" ]]; then
 83    ${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
 84    cmake -B /iwyu-build/ -G 'Unix Makefiles' -DCMAKE_PREFIX_PATH=/usr/lib/llvm-"${TIDY_LLVM_V}" -S /include-what-you-use
 85    make -C /iwyu-build/ install "$MAKEJOBS"
 86  fi
 87  
 88  mkdir -p "${DEPENDS_DIR}/SDKs" "${DEPENDS_DIR}/sdk-sources"
 89  
 90  OSX_SDK_BASENAME="Xcode-${XCODE_VERSION}-${XCODE_BUILD_ID}-extracted-SDK-with-libcxx-headers"
 91  
 92  if [ -n "$XCODE_VERSION" ] && [ ! -d "${DEPENDS_DIR}/SDKs/${OSX_SDK_BASENAME}" ]; then
 93    OSX_SDK_FILENAME="${OSX_SDK_BASENAME}.tar"
 94    OSX_SDK_PATH="${DEPENDS_DIR}/sdk-sources/${OSX_SDK_FILENAME}"
 95    if [ ! -f "$OSX_SDK_PATH" ]; then
 96      ${CI_RETRY_EXE} curl --location --fail "${SDK_URL}/${OSX_SDK_FILENAME}" -o "$OSX_SDK_PATH"
 97    fi
 98    tar -C "${DEPENDS_DIR}/SDKs" -xf "$OSX_SDK_PATH"
 99  fi
100  
101  echo -n "done" > "${CFG_DONE}"