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}"