01_base_install.sh raw

   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  if [ "${DANGER_RUN_CI_ON_HOST}" != "1" ]; then
  12    echo "This script will make unsafe local and global modifications, so it can only be run inside a container and requires DANGER_RUN_CI_ON_HOST=1"
  13    exit 1
  14  fi
  15  
  16  CFG_DONE="${BASE_ROOT_DIR}/ci.base-install-done"  # Use a global setting to remember whether this script ran to avoid running it twice
  17  
  18  if [ "$( cat "${CFG_DONE}" || true )" == "done" ]; then
  19    echo "Skip base install"
  20    exit 0
  21  fi
  22  
  23  MAKEJOBS="-j$( nproc )"  # Use nproc, because MAKEJOBS is the default in docker image builds.
  24  
  25  if [ -n "$DPKG_ADD_ARCH" ]; then
  26    dpkg --add-architecture "$DPKG_ADD_ARCH"
  27  fi
  28  
  29  if [ -n "${APT_LLVM_V}" ]; then
  30    ${CI_RETRY_EXE} apt-get update
  31    ${CI_RETRY_EXE} apt-get install curl -y
  32    curl "https://apt.llvm.org/llvm-snapshot.gpg.key" | tee "/etc/apt/trusted.gpg.d/apt.llvm.org.asc"
  33    (
  34      # shellcheck disable=SC2034
  35      source /etc/os-release
  36      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"
  37    )
  38  fi
  39  
  40  if command -v apk >/dev/null 2>&1; then
  41    ${CI_RETRY_EXE} apk update
  42    # shellcheck disable=SC2086
  43    ${CI_RETRY_EXE} apk add --no-cache $CI_BASE_PACKAGES $PACKAGES
  44  elif [ "$CI_OS_NAME" != "macos" ]; then
  45    if [[ -n "${APPEND_APT_SOURCES_LIST}" ]]; then
  46      echo "${APPEND_APT_SOURCES_LIST}" >> /etc/apt/sources.list
  47    fi
  48    ${CI_RETRY_EXE} apt-get update
  49    # shellcheck disable=SC2086
  50    ${CI_RETRY_EXE} apt-get install --no-install-recommends --no-upgrade -y $PACKAGES $CI_BASE_PACKAGES
  51  fi
  52  
  53  if [ -n "${APT_LLVM_V}" ]; then
  54    update-alternatives --install /usr/bin/clang++ clang++ "/usr/bin/clang++-${APT_LLVM_V}" 100
  55    update-alternatives --install /usr/bin/clang clang "/usr/bin/clang-${APT_LLVM_V}" 100
  56    update-alternatives --install /usr/bin/llvm-symbolizer llvm-symbolizer "/usr/bin/llvm-symbolizer-${APT_LLVM_V}" 100
  57  fi
  58  
  59  if [ -n "$PIP_PACKAGES" ]; then
  60    # shellcheck disable=SC2086
  61    ${CI_RETRY_EXE} pip3 install --user $PIP_PACKAGES
  62  fi
  63  
  64  if [[ -n "${USE_INSTRUMENTED_LIBCPP}" ]]; then
  65    ${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b "llvmorg-22.1.7" /llvm-project
  66  
  67  # LLVM is configured with LIBCXXABI_USE_LLVM_UNWINDER=OFF,
  68  # because libunwind doesn't handle exceptions under MSAN.
  69  # https://github.com/llvm/llvm-project/issues/84348
  70    cmake -G Ninja -B /cxx_build/ \
  71      -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
  72      -DCMAKE_BUILD_TYPE=Release \
  73      -DLLVM_USE_SANITIZER="${USE_INSTRUMENTED_LIBCPP}" \
  74      -DCMAKE_C_COMPILER=clang \
  75      -DCMAKE_CXX_COMPILER=clang++ \
  76      -DLLVM_TARGETS_TO_BUILD=Native \
  77      -DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF \
  78      -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \
  79      -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" \
  80      -DLIBCXX_HARDENING_MODE=debug \
  81      -S /llvm-project/runtimes
  82  
  83    ninja -C /cxx_build/ "$MAKEJOBS"
  84  
  85    # Clear no longer needed source folder
  86    du -sh /llvm-project
  87    rm -rf /llvm-project
  88  fi
  89  
  90  if [[ ${BARE_METAL_RISCV} == "true" ]]; then
  91      ${CI_RETRY_EXE} git clone --depth=1 https://github.com/riscv-collab/riscv-gnu-toolchain -b 2026.06.06 /riscv/gcc
  92      ( cd /riscv/gcc;
  93        ./configure --prefix=/opt/riscv-ilp32 --with-arch=rv32gc --with-abi=ilp32 --disable-gdb;
  94        make "$MAKEJOBS"; )
  95      rm -rf /riscv/gcc
  96  fi
  97  
  98  if [[ "${RUN_IWYU}" == true ]]; then
  99    ${CI_RETRY_EXE} git clone --depth=1 https://github.com/include-what-you-use/include-what-you-use -b clang_"${IWYU_LLVM_V}" /include-what-you-use
 100    pushd /include-what-you-use
 101    patch -p1 < /ci_container_base/ci/test/01_iwyu.patch
 102    patch -p1 < /ci_container_base/ci/test/02_iwyu_hash.patch
 103    popd
 104    cmake -B /iwyu-build/ -G 'Unix Makefiles' -DCMAKE_PREFIX_PATH=/usr/lib/llvm-"${IWYU_LLVM_V}" -S /include-what-you-use
 105    make -C /iwyu-build/ install "$MAKEJOBS"
 106  fi
 107  
 108  mkdir -p "${DEPENDS_DIR}/SDKs" "${DEPENDS_DIR}/sdk-sources"
 109  
 110  OSX_SDK_BASENAME="Xcode-${XCODE_VERSION}-${XCODE_BUILD_ID}-extracted-SDK-with-libcxx-headers"
 111  
 112  if [ -n "$XCODE_VERSION" ] && [ ! -d "${DEPENDS_DIR}/SDKs/${OSX_SDK_BASENAME}" ]; then
 113    OSX_SDK_FILENAME="${OSX_SDK_BASENAME}.tar"
 114    OSX_SDK_PATH="${DEPENDS_DIR}/sdk-sources/${OSX_SDK_FILENAME}"
 115    if [ ! -f "$OSX_SDK_PATH" ]; then
 116      ${CI_RETRY_EXE} curl --location --fail "${SDK_URL}/${OSX_SDK_FILENAME}" -o "$OSX_SDK_PATH"
 117    fi
 118    tar -C "${DEPENDS_DIR}/SDKs" -xf "$OSX_SDK_PATH"
 119  fi
 120  
 121  if [ -n "$NETBSD_VERSION" ] && [ ! -d "${DEPENDS_DIR}/SDKs/${NETBSD_SDK_BASENAME}" ]; then
 122    mkdir -p "${DEPENDS_DIR}/SDKs/${NETBSD_SDK_BASENAME}"
 123    for NETBSD_SDK_FILENAME in base.tar.xz comp.tar.xz; do
 124      NETBSD_SDK_PATH="${DEPENDS_DIR}/sdk-sources/${NETBSD_SDK_FILENAME}"
 125      if [ ! -f "$NETBSD_SDK_PATH" ]; then
 126        ${CI_RETRY_EXE} curl --location --fail "https://cdn.netbsd.org/pub/NetBSD/NetBSD-${NETBSD_VERSION}/amd64/binary/sets/${NETBSD_SDK_FILENAME}" -o "$NETBSD_SDK_PATH"
 127      fi
 128      tar -C "${DEPENDS_DIR}/SDKs/${NETBSD_SDK_BASENAME}" -xf "$NETBSD_SDK_PATH"
 129    done
 130  fi
 131  
 132  if [ -n "$FREEBSD_VERSION" ] && [ ! -d "${DEPENDS_DIR}/SDKs/${FREEBSD_SDK_BASENAME}" ]; then
 133    FREEBSD_SDK_FILENAME="base-${FREEBSD_VERSION}.txz"
 134    FREEBSD_SDK_PATH="${DEPENDS_DIR}/sdk-sources/${FREEBSD_SDK_FILENAME}"
 135    if [ ! -f "$FREEBSD_SDK_PATH" ]; then
 136      ${CI_RETRY_EXE} curl --location --fail "https://download.freebsd.org/releases/amd64/${FREEBSD_VERSION}-RELEASE/base.txz" -o "$FREEBSD_SDK_PATH"
 137    fi
 138    mkdir -p "${DEPENDS_DIR}/SDKs/${FREEBSD_SDK_BASENAME}"
 139    tar -C "${DEPENDS_DIR}/SDKs/${FREEBSD_SDK_BASENAME}" -xf "$FREEBSD_SDK_PATH"
 140  fi
 141  
 142  if [ -n "$OPENBSD_VERSION" ] && [ ! -d "${DEPENDS_DIR}/SDKs/${OPENBSD_SDK_BASENAME}" ]; then
 143    mkdir -p "${DEPENDS_DIR}/SDKs/${OPENBSD_SDK_BASENAME}"
 144    for OPENBSD_SDK_FILENAME in base79.tgz comp79.tgz; do
 145      OPENBSD_SDK_PATH="${DEPENDS_DIR}/sdk-sources/${OPENBSD_SDK_FILENAME}"
 146      if [ ! -f "$OPENBSD_SDK_PATH" ]; then
 147        ${CI_RETRY_EXE} curl --location --fail "https://cdn.openbsd.org/pub/OpenBSD/${OPENBSD_VERSION}/amd64/${OPENBSD_SDK_FILENAME}" -o "$OPENBSD_SDK_PATH"
 148      fi
 149      tar -C "${DEPENDS_DIR}/SDKs/${OPENBSD_SDK_BASENAME}" -xf "$OPENBSD_SDK_PATH"
 150      (
 151        # The SDK has versioned shared libs, but no unversioned libfoo.so symlink,
 152        # which breaks linking the kernel with lld. Create the symlinks.
 153        cd "${DEPENDS_DIR}/SDKs/${OPENBSD_SDK_BASENAME}/usr/lib"
 154        ln -sf libc++abi.so.*.*  libc++abi.so
 155        ln -sf libc++.so.*.*     libc++.so
 156        ln -sf libpthread.so.*.* libpthread.so
 157      )
 158    done
 159  fi
 160  
 161  echo -n "done" > "${CFG_DONE}"
 162