mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-09-12 05:32:22 +02:00
de9b436ba3depends: Switch from multilib to platform-specific toolchains (Hennadii Stepanov) Pull request description: Using the multilib GCC toolchain, as currently documented in [`depends/README.md`](4c1906a500/depends/README.md), has several issues, such as: 1. The [`g++-multilib`](https://packages.ubuntu.com/noble/g++-multilib) package conflicts with platform-specific cross-compiler packages. This means it is not possible to cross compile for `i686` and other platforms using the same set of installed packages. 2. The [`g++-multilib`](https://packages.ubuntu.com/noble/g++-multilib) package is not available for `arm64`: ```sh $ sudo apt install g++-multilib Reading package lists... Done Building dependency tree... Done Reading state information... Done E: Unable to locate package g++-multilib ``` 3. Managing the multilib GCC toolchain requires additional code in both depends and Guix scripts. This PR addresses all the issues mentioned above by switching from multilib to platform-specific toolchains. Also see https://github.com/bitcoin/bitcoin/pull/22456. --- Here are examples of building for different scenarions: - Linux, `x86_64` or `arm64`, building with depends natively: ```sh $ gmake -C depends -j $(nproc) $ cmake -B build --toolchain depends/$(./depends/config.sub $(./depends/config.guess))/toolchain.cmake $ cmake --build build -j $(nproc) ``` - Linux, `x86_64` or `arm64`, cross compiling for `i686-pc-linux-gnu`: ```sh $ sudo apt install g++-i686-linux-gnu binutils-i686-linux-gnu $ export HOST=i686-linux-gnu $ gmake -C depends -j $(nproc) $ cmake -B build-${HOST} --toolchain depends/${HOST}/toolchain.cmake $ cmake --build build-${HOST} -j $(nproc) ``` - Linux, `x86_64`, cross compiling for `arm64`: ```sh $ sudo apt install g++-aarch64-linux-gnu binutils-aarch64-linux-gnu $ export HOST=aarch64-linux-gnu $ gmake -C depends -j $(nproc) $ cmake -B build-${HOST} --toolchain depends/${HOST}/toolchain.cmake $ cmake --build build-${HOST} -j $(nproc) ``` - Linux, `arm64`, cross compiling for `x86_64`: ```sh $ sudo apt install g++-x86-64-linux-gnu binutils-x86-64-linux-gnu $ export HOST=x86_64-linux-gnu $ gmake -C depends -j $(nproc) $ cmake -B build-${HOST} --toolchain depends/${HOST}/toolchain.cmake $ cmake --build build-${HOST} -j $(nproc) ``` ACKs for top commit: fanquake: ACKde9b436ba3BrandonOdiwuor: ACKde9b436ba3Tree-SHA512: 453b4744974cdf56d6edfdbe93bb11e3bae3f9bc9cd99b9c57aee74e65fcdd3ac011a1dcc19f485ea3be427f4e9c6c6b0d704881369f719620f0cb299123e561
75 lines
2.4 KiB
Bash
Executable File
75 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Copyright (c) The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or https://opensource.org/license/mit.
|
|
export LC_ALL=C.UTF-8
|
|
set -o errexit -o pipefail
|
|
|
|
# shellcheck source=setup.sh
|
|
source "$(dirname "${BASH_SOURCE[0]}")/setup.sh"
|
|
|
|
# setup gcc toolchain
|
|
gcc_toolchain
|
|
|
|
# Build the depends tree
|
|
make -C depends --jobs="$JOBS" HOST="$HOST" \
|
|
${V:+V=1} \
|
|
${SOURCES_PATH+SOURCES_PATH="$SOURCES_PATH"} \
|
|
${BASE_CACHE+BASE_CACHE="$BASE_CACHE"} \
|
|
${build_CC+build_CC="$build_CC"} \
|
|
${build_CXX+build_CXX="$build_CXX"}
|
|
|
|
# CFLAGS
|
|
HOST_CFLAGS="-O2 -g"
|
|
HOST_CFLAGS+=$(find /gnu/store -maxdepth 1 -mindepth 1 -type d -exec echo -n " -ffile-prefix-map={}=/usr" \;)
|
|
HOST_CFLAGS+=" -fdebug-prefix-map=${DISTSRC}/src=."
|
|
|
|
# CXXFLAGS
|
|
HOST_CXXFLAGS="$HOST_CFLAGS"
|
|
|
|
case "$HOST" in
|
|
arm-linux-gnueabihf) HOST_CXXFLAGS="${HOST_CXXFLAGS} -Wno-psabi" ;;
|
|
esac
|
|
|
|
# LDFLAGS
|
|
HOST_LDFLAGS="-Wl,--as-needed -Wl,--dynamic-linker=$(glibc_dynamic_linker "$HOST") -Wl,-O2"
|
|
|
|
mkdir -p "$DISTSRC"
|
|
(
|
|
cd "$DISTSRC"
|
|
|
|
# Extract the source tarball
|
|
tar --strip-components=1 -xf "${GIT_ARCHIVE}"
|
|
|
|
# Configure this DISTSRC for $HOST
|
|
env CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" LDFLAGS="${HOST_LDFLAGS}" \
|
|
cmake -S . -B build \
|
|
--toolchain "${BASEPREFIX}/${HOST}/toolchain.cmake" \
|
|
-DBUILD_BENCH=OFF \
|
|
-DBUILD_BITCOIN_BIN=OFF \
|
|
-DBUILD_CLI=OFF \
|
|
-DBUILD_DAEMON=OFF \
|
|
-DBUILD_FUZZ_BINARY=OFF \
|
|
-DBUILD_GUI_TESTS=OFF \
|
|
-DBUILD_TESTS=OFF \
|
|
-DBUILD_TX=OFF \
|
|
-DBUILD_UTIL=OFF \
|
|
-DBUILD_WALLET_TOOL=OFF \
|
|
-DCMAKE_EXE_LINKER_FLAGS="${HOST_LDFLAGS} -static-libstdc++ -static-libgcc" \
|
|
-DCMAKE_INSTALL_PREFIX="${INSTALLPATH}" \
|
|
-DCMAKE_SKIP_RPATH=TRUE \
|
|
-DREDUCE_EXPORTS=ON \
|
|
-DWITH_CCACHE=OFF \
|
|
-Werror=dev
|
|
|
|
# Build Bitcoin Core
|
|
cmake --build build -j "$JOBS" --target bitcoin-gui bitcoin-qt
|
|
|
|
# Install built Bitcoin Core
|
|
cmake --install build --component bitcoin-gui
|
|
cmake --install build --component bitcoin-qt
|
|
) # $DISTSRC
|
|
|
|
# shellcheck source=package.sh
|
|
source "$(dirname "${BASH_SOURCE[0]}")/package.sh"
|