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